diff --git a/.github/workflows/python-app.yml b/.github/workflows/python-app.yml index 7a4575e..11b74f2 100644 --- a/.github/workflows/python-app.yml +++ b/.github/workflows/python-app.yml @@ -45,3 +45,5 @@ jobs: - name: Test with pytest run: | pytest + env: + PYTHONPATH: src diff --git a/README.md b/README.md index 5d8b3e2..e471ca4 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ Use the `sem` subcommand for SEM mapping. The mapper expects a map file, an imag python -m mapping_cli sem -m -i -o ``` -For further information about the necessary map file, see [Mapping README](./src/resources/maps/mapping) +For further information about the necessary map file, see [Mapping README](src/tomo_mapper/resources/maps/mapping) **2. Tomography Mapping** @@ -59,9 +59,9 @@ Use the `tomo` subcommand for tomography mapping. The mapper expects a map file, python -m mapping_cli tomo -m -i -o ``` -For further information about the necessary map file, see [Parsing README](./src/resources/maps/parsing) +For further information about the necessary map file, see [Parsing README](src/tomo_mapper/resources/maps/parsing) -For further information about mappings used internally, see [Mapping README](./src/resources/maps/mapping) +For further information about mappings used internally, see [Mapping README](src/tomo_mapper/resources/maps/mapping) In cases with no need of tweaking the parsing map file there is a shortcut option to use the supplied vendor-specific default map. diff --git a/mapping_cli.py b/mapping_cli.py index 6d51661..aad2897 100644 --- a/mapping_cli.py +++ b/mapping_cli.py @@ -1,120 +1,8 @@ -import argparse -import json -import logging -import os -from sys import exit - -from src.IO.MappingAbortionError import MappingAbortionError -from src.IO.sem.InputReader import InputReader as InputReader_SEM -from src.IO.tomo.InputReader import InputReader as InputReader_TOMO -from src.IO.tomo.OutputWriter import OutputWriter -from src.resources.maps.parsing import map_from_flag - -# make log level configurable from ENV, defaults to info level -logging.basicConfig( - level=os.environ.get('LOGLEVEL', 'INFO').upper() -) - -def add_tomo_parser(subparsers): - parser_t = subparsers.add_parser( - "tomo", - help="Tomography mapping functionality", - description='Extracting of SEM FIB Tomography metadata to unified json format' - ) - # Add arguments for input, output, and map - parser_t.add_argument('-i', '--input', help='Input zip file or folder as path', required=True) - parser_t.add_argument('-o', '--output', help='Path to output json file', required=True) - - # Create a group for the mutually exclusive map options - map_group = parser_t.add_mutually_exclusive_group(required=True) - - # Add the map file option to the group - map_group.add_argument('-m', '--map', help='Map file as path or remote URI') - - # Add the default map option to the group with the allowed values - map_group.add_argument('-dm', '--default-map', help='Use a default map for a vendor', choices=map_from_flag.keys(), type=str.lower) - - parser_t.set_defaults(func=run_tomo_mapper) - - -def add_sem_parser(subparsers): - parser_s = subparsers.add_parser( - "sem", - help="SEM mapping functionality", - description='Extracting of SEM metadata to unified json format' - ) - parser_s.add_argument('-i','--input', help='Input file as file path', required=True) - parser_s.add_argument('-m', '--map', help='Map file as path or remote URI', required=True) - parser_s.add_argument('-o', '--output', help='Path to output json file', required=True) - parser_s.set_defaults(func=run_sem_mapper) - -def run_cli(): - main_parser = argparse.ArgumentParser(prog="SEM-FIB-TOMO Mapper") - subparsers = main_parser.add_subparsers(dest='command', help="Choose one of the subcommands to use mapper") - add_tomo_parser(subparsers) - add_sem_parser(subparsers) - - args = main_parser.parse_args() - if args.command: - args.func(args) - else: - main_parser.print_help() - -def run_tomo_mapper(args): - argdict = vars(args) - INPUT_SOURCE = argdict.get('input') - MAP_SOURCE = argdict.get('map') or str(map_from_flag.get(argdict.get('default_map'))) - OUTPUT_PATH = argdict.get('output') - - reader = None - try: - reader = InputReader_TOMO(MAP_SOURCE, INPUT_SOURCE) - tmpdir = reader.temp_dir_path - except MappingAbortionError as e: - if reader: - reader.clean_up() - exit(e) - - output = None - try: - setup_infos = reader.retrieve_setup_info() - - run_infos = reader.retrieve_run_info() - - imgs = reader.retrieve_image_info() - - # Now all cases are taken into account - #si = setup_infos if len(setup_infos) >= 1 else None - #ri = run_infos if len(run_infos) >= 1 else None - - output = OutputWriter.stitch_together(setup_infos, run_infos, imgs) - OutputWriter.writeOutput(output, OUTPUT_PATH) - except MappingAbortionError as e: - reader.clean_up() - exit(e) - - logging.info("Tomography mapping completed.") - reader.clean_up() - return output - -def run_sem_mapper(args): - argdict = vars(args) - INPUT_SOURCE = argdict.get('input') - MAP_SOURCE = argdict.get('map') - OUTPUT_PATH = argdict.get('output') - - try: - reader = InputReader_SEM(MAP_SOURCE, INPUT_SOURCE) - - img_info = reader.retrieve_image_info(INPUT_SOURCE) - if not img_info: - logging.error('Could not retrieve image information due to unknown error. Aborting.') - exit(1) - with open(OUTPUT_PATH, 'w', encoding="utf-8") as f: - json.dump(img_info, f, indent=4, ensure_ascii=False) - except MappingAbortionError as e: - exit(e) +import sys +from pathlib import Path +sys.path.insert(0, str(Path(__file__).parent / "src")) +from tomo_mapper.mapping_main import run_cli if __name__ == '__main__': - run_cli() + run_cli() \ No newline at end of file diff --git a/mappingservice-plugin/build.gradle b/mappingservice-plugin/build.gradle index 6165afb..f06d242 100644 --- a/mappingservice-plugin/build.gradle +++ b/mappingservice-plugin/build.gradle @@ -14,9 +14,10 @@ repositories { } dependencies { - implementation 'org.springframework:spring-core:6.2.5' - implementation 'org.slf4j:slf4j-api:2.0.17' - implementation files("src/main/lib/mapping-service-plain.jar") + compileOnly 'org.springframework:spring-core:6.2.5' + compileOnly 'org.slf4j:slf4j-api:2.0.17' + implementation 'org.tomlj:tomlj:1.1.0' + compileOnly files("src/main/lib/mapping-service-plain.jar") } if (System.getenv('VERSION_OVERRIDE_BY_BRANCH')) { @@ -35,17 +36,34 @@ tasks.register('printVersion') { //Task for creating a resource file with the version info tasks.register("generateVersionProps", WriteProperties) { t -> def generatedResourcesDir = project.layout.buildDirectory.dir(["resources", "main"].join(File.separator)) - def outputFile = generatedResourcesDir.map { it.file("sempluginversion.properties") } + def outputFile = generatedResourcesDir.map { it.file("pluginversion.properties") } t.destinationFile = outputFile.get().asFile t.property("version", project.version) } +tasks.register('copyTomlToResources', Copy) { + from '../pyproject.toml' + into "${layout.buildDirectory.get()}/generated-resources" +} + +processResources { + dependsOn tasks.copyTomlToResources + from("${layout.buildDirectory.get()}/generated-resources") { + include 'pyproject.toml' + } +} + resolveMainClassName.dependsOn("generateVersionProps") jar { dependsOn(generateVersionProps) archiveFileName + + from { + configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } + } + duplicatesStrategy = DuplicatesStrategy.EXCLUDE } bootJar { diff --git a/mappingservice-plugin/src/main/java/edu/kit/datamanager/semplugin/SEMImagePlugin.java b/mappingservice-plugin/src/main/java/edu/kit/datamanager/semplugin/SEMImagePlugin.java index 487485b..4499003 100644 --- a/mappingservice-plugin/src/main/java/edu/kit/datamanager/semplugin/SEMImagePlugin.java +++ b/mappingservice-plugin/src/main/java/edu/kit/datamanager/semplugin/SEMImagePlugin.java @@ -13,22 +13,58 @@ import java.nio.file.Path; import java.util.Properties; +import org.tomlj.Toml; +import org.tomlj.TomlParseResult; + public class SEMImagePlugin implements IMappingPlugin{ private static String version; private final Logger LOGGER = LoggerFactory.getLogger(SEMImagePlugin.class); - private final String REPOSITORY = "https://github.com/kit-data-manager/tomo_mapper"; + private String REPOSITORY; private String TAG; + private String NAME; + private String DESCRIPTION; + private MimeType[] INPUT_MIME_TYPES; + private MimeType[] OUTPUT_MIME_TYPES; private Path dir; - public SEMImagePlugin() { + loadVersion(); + loadTomlConfig(); + } + + private void loadTomlConfig() { + ClassLoader classLoader = this.getClass().getClassLoader(); + URL resource = classLoader.getResource("pyproject.toml"); + LOGGER.info("Resource file: " + resource); + + if (resource != null) { + try (InputStream input = resource.openStream()) { + TomlParseResult result = Toml.parse(input); + + if (result.hasErrors()) { + result.errors().forEach(error -> LOGGER.warn("TOML parse error: " + error.toString())); + } else { + REPOSITORY = result.getString("project.urls.repository"); + if (REPOSITORY == null) throw new IllegalArgumentException("Repository URL cannot be read from config"); + NAME = result.getString("tool.plugin.name"); + if (NAME == null) throw new IllegalArgumentException("Plugin name cannot be read from config"); + DESCRIPTION = result.contains("tool.plugin.description") ? result.getString("tool.plugin.description") : "descrption unavailable"; + INPUT_MIME_TYPES = result.getArrayOrEmpty("tool.plugin.input_mimes").toList().stream().map(Object::toString).map(MimeTypeUtils::parseMimeType).toArray(MimeType[]::new); + OUTPUT_MIME_TYPES = result.getArrayOrEmpty("tool.plugin.output_mimes").toList().stream().map(Object::toString).map(MimeTypeUtils::parseMimeType).toArray(MimeType[]::new); + } + } catch (Exception e) { + LOGGER.error("Failed to load TOML file: " + e.getMessage()); + } + } + } + + private void loadVersion() { try { // Get the context class loader ClassLoader classLoader = this.getClass().getClassLoader(); - // TODO: do we need to make sure that the resource path is somehow related to the current plugin to avoid loading the wrong property file in case of identical property names? - URL resource = classLoader.getResource("sempluginversion.properties"); + URL resource = classLoader.getResource("pluginversion.properties"); LOGGER.info("Resource file: {}", resource); if (resource != null) { // Load the properties file @@ -50,12 +86,12 @@ public SEMImagePlugin() { @Override public String name() { - return "GenericSEMtoJSON"; + return NAME; } @Override public String description() { - return "This python based tool extracts metadata from machine generated scanning microscopy images and generates a JSON file adhering to the schema."; + return DESCRIPTION; } @Override @@ -75,7 +111,7 @@ public MimeType[] inputTypes() { @Override public MimeType[] outputTypes() { - return new MimeType[]{MimeTypeUtils.APPLICATION_JSON}; + return OUTPUT_MIME_TYPES; } @Override @@ -104,9 +140,9 @@ public void setup() { @Override public MappingPluginState mapFile(Path mappingFile, Path inputFile, Path outputFile) throws MappingPluginException { long startTime = System.currentTimeMillis(); - LOGGER.trace("Run SEM-Mapping-Tool on '{}' with mapping '{}' -> '{}'", mappingFile, inputFile, outputFile); + LOGGER.trace("Run {} on '{}' with mapping '{}' -> '{}'", this.name(), mappingFile, inputFile, outputFile); //MappingPluginState result = PythonRunnerUtil.runPythonScript(dir + "/metaMapper.py", mappingFile.toString(), inputFile.toString(), outputFile.toString()); - String[] args = {"sem", "-m", mappingFile.toString(), "-i", inputFile.toString(), "-o", outputFile.toString()}; + String[] args = {"-m", mappingFile.toString(), "-i", inputFile.toString(), "-o", outputFile.toString()}; MappingPluginState result = PythonRunnerUtil.runPythonScript(dir + "/plugin_wrapper.py", args); long endTime = System.currentTimeMillis(); long totalTime = endTime - startTime; diff --git a/plugin_wrapper.py b/plugin_wrapper.py index cebe41d..733631e 100644 --- a/plugin_wrapper.py +++ b/plugin_wrapper.py @@ -1,10 +1,12 @@ # run_mapping.py import sys -from mapping_cli import run_cli +from pathlib import Path +sys.path.insert(0, str(Path(__file__).parent / "src")) +from tomo_mapper.mapping_main import run_cli if __name__ == "__main__": # Extract arguments from the command line - sys.argv = ["mapping_cli"] + sys.argv[1:] + sys.argv = ["mapping_cli", "sem"] + sys.argv[1:] # Call the run_cli function - run_cli() \ No newline at end of file + run_cli() diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..91d4712 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,63 @@ +[project] +name = "tomo_mapper" +version = "1.2.0rc" +description = "SEM-FIB-Tomography Mapper is a tool designed for mapping SEM (Scanning Electron Microscope) images and SEM-FIB Tomography metadata to a uniform, schema-compliant json format." +keywords = ["SEM", "Tomography", "TIFF", "metadata", "extraction", "schema"] +readme = "README.md" +license = { text = "Apache-2.0"} +requires-python = ">=3.12" +dependencies = [ + "pillow >= 10.3", + "pydantic[email] >= 2.11", + "xmltodict >= 0.14", + "requests", + "validators >= 0.34", + "jsonpath-ng >= 1.7", + "deepmerge >= 2.0", + "magika >= 0.5.1", + "python-dateutil" +] + +[[project.authors]] +name = "Germaine Götzelmann" + +[[project.authors]] +name = "Gabin Thibaut Oumbe Tekam" + +[[project.maintainers]] +name = "Germaine Götzelmann" + +[[project.maintainers]] +name = "Gabin Thibaut Oumbe Tekam" + +[build-system] +requires = ["setuptools>=66.1.0", "setuptools-scm", "wheel"] +build-backend = "setuptools.build_meta" + +[project.scripts] +sem-tomo-mapper = "tomo_mapper.mapping_main:run_cli" + +[tool.setuptools] +include-package-data = true +#package-dir = { "" = "src" } + +#[tool.setuptools.packages.find] +#where = ["src"] +#include = ["tomo_mapper*"] + +[tool.pytest.ini_options] +pythonpath = ["src"] + +[tool.setuptools.dynamic] +dependencies = {file = [ "requirements.txt" ] } + +[project.urls] +Homepage = "https://github.com/kit-data-manager/tomo_mapper" +repository = "https://github.com/kit-data-manager/tomo_mapper" + +[tool.plugin] +name = "GenericSEMtoJSON" +description = "" +input_mimes = ["image/tiff"] +output_mimes = ["application/json"] + diff --git a/requirements.txt b/requirements.txt index f9dad49..17f428a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,4 +9,4 @@ magika >= 0.5.1 pytest >= 7.4 pytest-cov >= 6.0 pytest-mock >= 3.14.0 -python-dateutil \ No newline at end of file +python-dateutil diff --git a/src/IO/MappingAbortionError.py b/src/tomo_mapper/IO/MappingAbortionError.py similarity index 100% rename from src/IO/MappingAbortionError.py rename to src/tomo_mapper/IO/MappingAbortionError.py diff --git a/src/IO/__init__.py b/src/tomo_mapper/IO/__init__.py similarity index 100% rename from src/IO/__init__.py rename to src/tomo_mapper/IO/__init__.py diff --git a/src/IO/sem/InputReader.py b/src/tomo_mapper/IO/sem/InputReader.py similarity index 93% rename from src/IO/sem/InputReader.py rename to src/tomo_mapper/IO/sem/InputReader.py index 812a747..659481d 100644 --- a/src/IO/sem/InputReader.py +++ b/src/tomo_mapper/IO/sem/InputReader.py @@ -2,10 +2,10 @@ import mimetypes import os -from src.IO.MappingAbortionError import MappingAbortionError -from src.parser.ImageParser import ParserMode -from src.parser.ParserFactory import ParserFactory -from src.util import load_json, get_filetype_with_magica, robust_textfile_read +from tomo_mapper.IO.MappingAbortionError import MappingAbortionError +from tomo_mapper.parser.ImageParser import ParserMode +from tomo_mapper.parser.ParserFactory import ParserFactory +from tomo_mapper.util import load_json, get_filetype_with_magica, robust_textfile_read class InputReader: diff --git a/src/IO/sem/__init__.py b/src/tomo_mapper/IO/sem/__init__.py similarity index 100% rename from src/IO/sem/__init__.py rename to src/tomo_mapper/IO/sem/__init__.py diff --git a/src/IO/tomo/InputReader.py b/src/tomo_mapper/IO/tomo/InputReader.py similarity index 92% rename from src/IO/tomo/InputReader.py rename to src/tomo_mapper/IO/tomo/InputReader.py index a00d9ab..0a5875b 100644 --- a/src/IO/tomo/InputReader.py +++ b/src/tomo_mapper/IO/tomo/InputReader.py @@ -3,18 +3,18 @@ from glob import glob from typing import List -from src.IO.MappingAbortionError import MappingAbortionError -from src.IO.tomo.MapfileReader import MapFileReader -from src.config import MappingConfig -from src.model.ImageMD import ImageMD -from src.model.RunMD import RunMD +from tomo_mapper.IO.MappingAbortionError import MappingAbortionError +from tomo_mapper.IO.tomo.MapfileReader import MapFileReader +from tomo_mapper.config import MappingConfig +from tomo_mapper.model.ImageMD import ImageMD +from tomo_mapper.model.RunMD import RunMD import logging -from src.model.SetupMD import SetupMD -from src.parser.ImageParser import ImageParser -from src.parser.SetupMD_Parser import SetupMD_Parser -from src.parser.ParserFactory import ParserFactory -from src.util import is_zipfile, extract_zip_file, strip_workdir_from_path, robust_textfile_read +from tomo_mapper.model.SetupMD import SetupMD +from tomo_mapper.parser.ImageParser import ImageParser +from tomo_mapper.parser.SetupMD_Parser import SetupMD_Parser +from tomo_mapper.parser.ParserFactory import ParserFactory +from tomo_mapper.util import is_zipfile, extract_zip_file, strip_workdir_from_path, robust_textfile_read class InputReader: diff --git a/src/IO/tomo/MapfileReader.py b/src/tomo_mapper/IO/tomo/MapfileReader.py similarity index 96% rename from src/IO/tomo/MapfileReader.py rename to src/tomo_mapper/IO/tomo/MapfileReader.py index a606f04..a71bd30 100644 --- a/src/IO/tomo/MapfileReader.py +++ b/src/tomo_mapper/IO/tomo/MapfileReader.py @@ -5,12 +5,10 @@ from requests import HTTPError -from src.IO.MappingAbortionError import MappingAbortionError -from src.parser.ImageParser import ParserMode -from src.parser.ParserFactory import ParserFactory -from src.util import load_json - -import validators +from tomo_mapper.IO.MappingAbortionError import MappingAbortionError +from tomo_mapper.parser.ImageParser import ParserMode +from tomo_mapper.parser.ParserFactory import ParserFactory +from tomo_mapper.util import load_json class MapFileReader: diff --git a/src/IO/tomo/OutputWriter.py b/src/tomo_mapper/IO/tomo/OutputWriter.py similarity index 93% rename from src/IO/tomo/OutputWriter.py rename to src/tomo_mapper/IO/tomo/OutputWriter.py index a69d5ec..c465477 100644 --- a/src/IO/tomo/OutputWriter.py +++ b/src/tomo_mapper/IO/tomo/OutputWriter.py @@ -2,17 +2,16 @@ import logging import os from collections import defaultdict -from pprint import pprint from typing import List from pydantic import ValidationError -from src.IO.MappingAbortionError import MappingAbortionError -from src.model.ImageMD import ImageMD -from src.model.RunMD import RunMD -from src.model.SchemaConcepts.Dataset_simplified import Dataset -from src.model.SchemaConcepts.codegen.SchemaClasses_TOMO import AcquisitionMain -from src.model.SetupMD import SetupMD +from tomo_mapper.IO.MappingAbortionError import MappingAbortionError +from tomo_mapper.model.ImageMD import ImageMD +from tomo_mapper.model.RunMD import RunMD +from tomo_mapper.model.SchemaConcepts.Dataset_simplified import Dataset +from tomo_mapper.model.SchemaConcepts.codegen.SchemaClasses_TOMO import AcquisitionMain +from tomo_mapper.model.SetupMD import SetupMD from deepmerge import always_merger, conservative_merger class OutputWriter: diff --git a/src/IO/tomo/__init__.py b/src/tomo_mapper/IO/tomo/__init__.py similarity index 100% rename from src/IO/tomo/__init__.py rename to src/tomo_mapper/IO/tomo/__init__.py diff --git a/src/Preprocessor.py b/src/tomo_mapper/Preprocessor.py similarity index 97% rename from src/Preprocessor.py rename to src/tomo_mapper/Preprocessor.py index 01369a5..d9e3415 100644 --- a/src/Preprocessor.py +++ b/src/tomo_mapper/Preprocessor.py @@ -3,7 +3,7 @@ from jsonpath_ng.parser import JsonPathParser -from src.model.SchemaConcepts.Schema_Concept import parse_datetime +from tomo_mapper.model.SchemaConcepts.Schema_Concept import parse_datetime class Preprocessor: diff --git a/src/model/SchemaConcepts/__init__.py b/src/tomo_mapper/__init__.py similarity index 100% rename from src/model/SchemaConcepts/__init__.py rename to src/tomo_mapper/__init__.py diff --git a/src/config.py b/src/tomo_mapper/config.py similarity index 100% rename from src/config.py rename to src/tomo_mapper/config.py diff --git a/src/tomo_mapper/mapping_main.py b/src/tomo_mapper/mapping_main.py new file mode 100644 index 0000000..94e4647 --- /dev/null +++ b/src/tomo_mapper/mapping_main.py @@ -0,0 +1,120 @@ +import argparse +import json +import logging +import os +from sys import exit + +from tomo_mapper.IO.MappingAbortionError import MappingAbortionError +from tomo_mapper.IO.sem.InputReader import InputReader as InputReader_SEM +from tomo_mapper.IO.tomo.InputReader import InputReader as InputReader_TOMO +from tomo_mapper.IO.tomo.OutputWriter import OutputWriter +from tomo_mapper.resources.maps.parsing import map_from_flag + +#make log level configurable from ENV, defaults to info level +logging.basicConfig( + level=os.environ.get('LOGLEVEL', 'INFO').upper() +) + +def add_tomo_parser(subparsers): + parser_t = subparsers.add_parser( + "tomo", + help="Tomography mapping functionality", + description='Extracting of SEM FIB Tomography metadata to unified json format' + ) + # Add arguments for input, output, and map + parser_t.add_argument('-i', '--input', help='Input zip file or folder as path', required=True) + parser_t.add_argument('-o', '--output', help='Path to output json file', required=True) + + # Create a group for the mutually exclusive map options + map_group = parser_t.add_mutually_exclusive_group(required=True) + + # Add the map file option to the group + map_group.add_argument('-m', '--map', help='Map file as path or remote URI') + + # Add the default map option to the group with the allowed values + map_group.add_argument('-dm', '--default-map', help='Use a default map for a vendor', choices=map_from_flag.keys(), type=str.lower) + + parser_t.set_defaults(func=run_tomo_mapper) + + +def add_sem_parser(subparsers): + parser_s = subparsers.add_parser( + "sem", + help="SEM mapping functionality", + description='Extracting of SEM metadata to unified json format' + ) + parser_s.add_argument('-i','--input', help='Input file as file path', required=True) + parser_s.add_argument('-m', '--map', help='Map file as path or remote URI', required=True) + parser_s.add_argument('-o', '--output', help='Path to output json file', required=True) + parser_s.set_defaults(func=run_sem_mapper) + +def run_cli(): + main_parser = argparse.ArgumentParser(prog="SEM-FIB-TOMO Mapper") + subparsers = main_parser.add_subparsers(dest='command', help="Choose one of the subcommands to use mapper") + add_tomo_parser(subparsers) + add_sem_parser(subparsers) + + args = main_parser.parse_args() + if args.command: + args.func(args) + else: + main_parser.print_help() + +def run_tomo_mapper(args): + argdict = vars(args) + INPUT_SOURCE = argdict.get('input') + MAP_SOURCE = argdict.get('map') or str(map_from_flag.get(argdict.get('default_map'))) + OUTPUT_PATH = argdict.get('output') + + reader = None + try: + reader = InputReader_TOMO(MAP_SOURCE, INPUT_SOURCE) + tmpdir = reader.temp_dir_path + except MappingAbortionError as e: + if reader: + reader.clean_up() + exit(e) + + output = None + try: + setup_infos = reader.retrieve_setup_info() + + run_infos = reader.retrieve_run_info() + + imgs = reader.retrieve_image_info() + + # Now all cases are taken into account + #si = setup_infos if len(setup_infos) >= 1 else None + #ri = run_infos if len(run_infos) >= 1 else None + + output = OutputWriter.stitch_together(setup_infos, run_infos, imgs) + OutputWriter.writeOutput(output, OUTPUT_PATH) + except MappingAbortionError as e: + reader.clean_up() + exit(e) + + logging.info("Tomography mapping completed.") + reader.clean_up() + return output + +def run_sem_mapper(args): + argdict = vars(args) + INPUT_SOURCE = argdict.get('input') + MAP_SOURCE = argdict.get('map') + OUTPUT_PATH = argdict.get('output') + + try: + reader = InputReader_SEM(MAP_SOURCE, INPUT_SOURCE) + + img_info = reader.retrieve_image_info(INPUT_SOURCE) + if not img_info: + logging.error('Could not retrieve image information due to unknown error. Aborting.') + exit(1) + with open(OUTPUT_PATH, 'w', encoding="utf-8") as f: + json.dump(img_info, f, indent=4, ensure_ascii=False) + except MappingAbortionError as e: + exit(e) + + +if __name__ == '__main__': + run_cli() diff --git a/src/model/ImageMD.py b/src/tomo_mapper/model/ImageMD.py similarity index 69% rename from src/model/ImageMD.py rename to src/tomo_mapper/model/ImageMD.py index 2e1da45..b83d795 100644 --- a/src/model/ImageMD.py +++ b/src/tomo_mapper/model/ImageMD.py @@ -4,11 +4,11 @@ from pydantic import BaseModel -from src.model.SchemaConcepts.Acquisition_simplified import Acquisition -from src.model.SchemaConcepts.Dataset_simplified import Dataset -from src.model.SchemaConcepts.SEM_Image import SEM_Image -from src.model.SchemaConcepts.TOMO_Image import TOMO_Image -from src.model.SchemaConcepts.codegen.SchemaClasses_TOMO import DatasetType +from tomo_mapper.model.SchemaConcepts.Acquisition_simplified import Acquisition +from tomo_mapper.model.SchemaConcepts.Dataset_simplified import Dataset +from tomo_mapper.model.SchemaConcepts.SEM_Image import SEM_Image +from tomo_mapper.model.SchemaConcepts.TOMO_Image import TOMO_Image +from tomo_mapper.model.SchemaConcepts.codegen.SchemaClasses_TOMO import DatasetType class ImageMD(BaseModel): diff --git a/src/model/RunMD.py b/src/tomo_mapper/model/RunMD.py similarity index 86% rename from src/model/RunMD.py rename to src/tomo_mapper/model/RunMD.py index 49ace83..cb57b2f 100644 --- a/src/model/RunMD.py +++ b/src/tomo_mapper/model/RunMD.py @@ -1,9 +1,9 @@ from collections import defaultdict from typing import List -from src.model.SchemaConcepts.Acquisition_simplified import Acquisition -from src.model.SchemaConcepts.TOMO_Image import TOMO_Image -from src.model.SchemaConcepts.codegen.SchemaClasses_TOMO import DatasetType +from tomo_mapper.model.SchemaConcepts.Acquisition_simplified import Acquisition +from tomo_mapper.model.SchemaConcepts import TOMO_Image +from tomo_mapper.model.SchemaConcepts.codegen.SchemaClasses_TOMO import DatasetType class RunMD: diff --git a/src/model/SchemaConcepts/Acquisition_simplified.py b/src/tomo_mapper/model/SchemaConcepts/Acquisition_simplified.py similarity index 69% rename from src/model/SchemaConcepts/Acquisition_simplified.py rename to src/tomo_mapper/model/SchemaConcepts/Acquisition_simplified.py index 3a20466..cfb681d 100644 --- a/src/model/SchemaConcepts/Acquisition_simplified.py +++ b/src/tomo_mapper/model/SchemaConcepts/Acquisition_simplified.py @@ -2,10 +2,10 @@ from pydantic import BaseModel -from src.model.SchemaConcepts.Dataset_simplified import Dataset -from src.model.SchemaConcepts.Schema_Concept import Schema_Concept -from src.model.SchemaConcepts.codegen.SchemaClasses_TOMO import GenericMetadata, AcquisitionMain -from src.model.SchemaConcepts.codegen.SchemaClasses_TOMO import Acquisition as Acquisition_gen +from tomo_mapper.model.SchemaConcepts.Dataset_simplified import Dataset +from tomo_mapper.model.SchemaConcepts.Schema_Concept import Schema_Concept +from tomo_mapper.model.SchemaConcepts.codegen.SchemaClasses_TOMO import GenericMetadata, AcquisitionMain +from tomo_mapper.model.SchemaConcepts.codegen.SchemaClasses_TOMO import Acquisition as Acquisition_gen class Acquisition(Schema_Concept, BaseModel): diff --git a/src/model/SchemaConcepts/Dataset_simplified.py b/src/tomo_mapper/model/SchemaConcepts/Dataset_simplified.py similarity index 80% rename from src/model/SchemaConcepts/Dataset_simplified.py rename to src/tomo_mapper/model/SchemaConcepts/Dataset_simplified.py index f0dbb06..eb97f82 100644 --- a/src/model/SchemaConcepts/Dataset_simplified.py +++ b/src/tomo_mapper/model/SchemaConcepts/Dataset_simplified.py @@ -2,9 +2,9 @@ from pydantic import BaseModel, computed_field -from src.model.SchemaConcepts.Schema_Concept import Schema_Concept -from src.model.SchemaConcepts.TOMO_Image import TOMO_Image -from src.model.SchemaConcepts.codegen.SchemaClasses_TOMO import DatasetType, IdentifierModel, \ +from tomo_mapper.model.SchemaConcepts.Schema_Concept import Schema_Concept +from tomo_mapper.model.SchemaConcepts.TOMO_Image import TOMO_Image +from tomo_mapper.model.SchemaConcepts.codegen.SchemaClasses_TOMO import DatasetType, IdentifierModel, \ UserDescription, Program, InstrumentDetails, SEMFIBTomographyAcquisitionDatasetSchema class Dataset(Schema_Concept, BaseModel): diff --git a/src/model/SchemaConcepts/SEM_Image.py b/src/tomo_mapper/model/SchemaConcepts/SEM_Image.py similarity index 75% rename from src/model/SchemaConcepts/SEM_Image.py rename to src/tomo_mapper/model/SchemaConcepts/SEM_Image.py index 5184727..d525c15 100644 --- a/src/model/SchemaConcepts/SEM_Image.py +++ b/src/tomo_mapper/model/SchemaConcepts/SEM_Image.py @@ -4,8 +4,8 @@ from pydantic import BaseModel, BeforeValidator -from src.model.SchemaConcepts.Schema_Concept import Schema_Concept, parse_datetime -from src.model.SchemaConcepts.codegen.SchemaClasses_SEM import Entry, Sem +from tomo_mapper.model.SchemaConcepts.Schema_Concept import Schema_Concept, parse_datetime +from tomo_mapper.model.SchemaConcepts.codegen.SchemaClasses_SEM import Entry, Sem class CustomizedEntry(Schema_Concept, Entry): diff --git a/src/model/SchemaConcepts/Schema_Concept.py b/src/tomo_mapper/model/SchemaConcepts/Schema_Concept.py similarity index 98% rename from src/model/SchemaConcepts/Schema_Concept.py rename to src/tomo_mapper/model/SchemaConcepts/Schema_Concept.py index 7eac036..63feb57 100644 --- a/src/model/SchemaConcepts/Schema_Concept.py +++ b/src/tomo_mapper/model/SchemaConcepts/Schema_Concept.py @@ -29,7 +29,7 @@ class Schema_Concept(ABC): __pydantic_config__ = ConfigDict( validate_assignment=True, - str_strip_whitespace=True, + str_strip_whitespace=True ) #Custom serializer for datetime fields diff --git a/src/model/SchemaConcepts/TOMO_Image.py b/src/tomo_mapper/model/SchemaConcepts/TOMO_Image.py similarity index 90% rename from src/model/SchemaConcepts/TOMO_Image.py rename to src/tomo_mapper/model/SchemaConcepts/TOMO_Image.py index 26e9c69..a4614f2 100644 --- a/src/model/SchemaConcepts/TOMO_Image.py +++ b/src/tomo_mapper/model/SchemaConcepts/TOMO_Image.py @@ -4,9 +4,9 @@ from pydantic import BeforeValidator, BaseModel, computed_field, model_validator from typing_extensions import Annotated -from src.config import MappingConfig -from src.model.SchemaConcepts.Schema_Concept import Schema_Concept, parse_datetime -from src.model.SchemaConcepts.codegen.SchemaClasses_TOMO import Identifier, Stage, Vacuum, TemperatureDetails, \ +from tomo_mapper.config import MappingConfig +from tomo_mapper.model.SchemaConcepts.Schema_Concept import Schema_Concept, parse_datetime +from tomo_mapper.model.SchemaConcepts.codegen.SchemaClasses_TOMO import Identifier, Stage, Vacuum, TemperatureDetails, \ CurrentDetails, SEMFIBTomographyAcquisitionImageSchema diff --git a/src/model/SchemaConcepts/codegen/__init__.py b/src/tomo_mapper/model/SchemaConcepts/__init__.py similarity index 100% rename from src/model/SchemaConcepts/codegen/__init__.py rename to src/tomo_mapper/model/SchemaConcepts/__init__.py diff --git a/src/model/SchemaConcepts/codegen/SchemaClasses_SEM.py b/src/tomo_mapper/model/SchemaConcepts/codegen/SchemaClasses_SEM.py similarity index 100% rename from src/model/SchemaConcepts/codegen/SchemaClasses_SEM.py rename to src/tomo_mapper/model/SchemaConcepts/codegen/SchemaClasses_SEM.py diff --git a/src/model/SchemaConcepts/codegen/SchemaClasses_TOMO.py b/src/tomo_mapper/model/SchemaConcepts/codegen/SchemaClasses_TOMO.py similarity index 100% rename from src/model/SchemaConcepts/codegen/SchemaClasses_TOMO.py rename to src/tomo_mapper/model/SchemaConcepts/codegen/SchemaClasses_TOMO.py diff --git a/src/model/__init__.py b/src/tomo_mapper/model/SchemaConcepts/codegen/__init__.py similarity index 100% rename from src/model/__init__.py rename to src/tomo_mapper/model/SchemaConcepts/codegen/__init__.py diff --git a/src/model/SchemaConcepts/codegen/codegen.md b/src/tomo_mapper/model/SchemaConcepts/codegen/codegen.md similarity index 100% rename from src/model/SchemaConcepts/codegen/codegen.md rename to src/tomo_mapper/model/SchemaConcepts/codegen/codegen.md diff --git a/src/model/SetupMD.py b/src/tomo_mapper/model/SetupMD.py similarity index 74% rename from src/model/SetupMD.py rename to src/tomo_mapper/model/SetupMD.py index d33ea01..97dac75 100644 --- a/src/model/SetupMD.py +++ b/src/tomo_mapper/model/SetupMD.py @@ -1,6 +1,6 @@ from pydantic import BaseModel -from src.model.SchemaConcepts.Acquisition_simplified import Acquisition +from tomo_mapper.model.SchemaConcepts.Acquisition_simplified import Acquisition class SetupMD(BaseModel): diff --git a/src/parser/__init__.py b/src/tomo_mapper/model/__init__.py similarity index 100% rename from src/parser/__init__.py rename to src/tomo_mapper/model/__init__.py diff --git a/src/parser/ImageParser.py b/src/tomo_mapper/parser/ImageParser.py similarity index 94% rename from src/parser/ImageParser.py rename to src/tomo_mapper/parser/ImageParser.py index e4b27d5..cacf696 100644 --- a/src/parser/ImageParser.py +++ b/src/tomo_mapper/parser/ImageParser.py @@ -1,7 +1,7 @@ import enum from abc import ABC, abstractmethod -from src.model.ImageMD import ImageMD +from tomo_mapper.model.ImageMD import ImageMD class ParserMode(enum.Enum): TOMO = "tomo", diff --git a/src/parser/MetadataParser.py b/src/tomo_mapper/parser/MetadataParser.py similarity index 100% rename from src/parser/MetadataParser.py rename to src/tomo_mapper/parser/MetadataParser.py diff --git a/src/parser/ParserFactory.py b/src/tomo_mapper/parser/ParserFactory.py similarity index 74% rename from src/parser/ParserFactory.py rename to src/tomo_mapper/parser/ParserFactory.py index 7bfb277..53e139b 100644 --- a/src/parser/ParserFactory.py +++ b/src/tomo_mapper/parser/ParserFactory.py @@ -1,16 +1,16 @@ import logging from typing import Dict, Type -from src.parser.ImageParser import ImageParser -from src.parser.RunMD_Parser import RunMD_Parser -from src.parser.SetupMD_Parser import SetupMD_Parser -from src.parser.impl.Atlas3dParser import Atlas3dParser -from src.parser.impl.EMProjectParser import EMProjectParser -from src.parser.impl.ProjectDataParser import ProjectDataParser -from src.parser.impl.TomographyProjectParser import TomographyProjectParser -from src.parser.impl.Dataset_infoParser import Dataset_infoParser -from src.parser.impl.TiffParser import TiffParser -from src.parser.impl.TxtParser import TxtParser +from tomo_mapper.parser.ImageParser import ImageParser +from tomo_mapper.parser.RunMD_Parser import RunMD_Parser +from tomo_mapper.parser.SetupMD_Parser import SetupMD_Parser +from tomo_mapper.parser.impl.Atlas3dParser import Atlas3dParser +from tomo_mapper.parser.impl.EMProjectParser import EMProjectParser +from tomo_mapper.parser.impl.ProjectDataParser import ProjectDataParser +from tomo_mapper.parser.impl.TomographyProjectParser import TomographyProjectParser +from tomo_mapper.parser.impl.Dataset_infoParser import Dataset_infoParser +from tomo_mapper.parser.impl.TiffParser import TiffParser +from tomo_mapper.parser.impl.TxtParser import TxtParser class ParserFactory: diff --git a/src/parser/RunMD_Parser.py b/src/tomo_mapper/parser/RunMD_Parser.py similarity index 74% rename from src/parser/RunMD_Parser.py rename to src/tomo_mapper/parser/RunMD_Parser.py index 7d38c8c..15ec791 100644 --- a/src/parser/RunMD_Parser.py +++ b/src/tomo_mapper/parser/RunMD_Parser.py @@ -1,7 +1,7 @@ from abc import abstractmethod -from src.model.RunMD import RunMD -from src.parser.MetadataParser import MetadataParser +from tomo_mapper.model.RunMD import RunMD +from tomo_mapper.parser.MetadataParser import MetadataParser class RunMD_Parser(MetadataParser): diff --git a/src/parser/SetupMD_Parser.py b/src/tomo_mapper/parser/SetupMD_Parser.py similarity index 77% rename from src/parser/SetupMD_Parser.py rename to src/tomo_mapper/parser/SetupMD_Parser.py index 7b2eeb5..dd6929b 100644 --- a/src/parser/SetupMD_Parser.py +++ b/src/tomo_mapper/parser/SetupMD_Parser.py @@ -1,8 +1,7 @@ -from abc import ABC, abstractmethod -import logging +from abc import abstractmethod -from src.model.SetupMD import SetupMD -from src.parser.MetadataParser import MetadataParser +from tomo_mapper.model.SetupMD import SetupMD +from tomo_mapper.parser.MetadataParser import MetadataParser class SetupMD_Parser(MetadataParser): diff --git a/src/parser/impl/__init__.py b/src/tomo_mapper/parser/__init__.py similarity index 100% rename from src/parser/impl/__init__.py rename to src/tomo_mapper/parser/__init__.py diff --git a/src/parser/impl/Atlas3dParser.py b/src/tomo_mapper/parser/impl/Atlas3dParser.py similarity index 83% rename from src/parser/impl/Atlas3dParser.py rename to src/tomo_mapper/parser/impl/Atlas3dParser.py index fdf4cc7..a46fda6 100644 --- a/src/parser/impl/Atlas3dParser.py +++ b/src/tomo_mapper/parser/impl/Atlas3dParser.py @@ -1,17 +1,17 @@ from typing import List -from src.model.RunMD import RunMD -from src.model.SchemaConcepts.Acquisition_simplified import Acquisition -from src.parser.RunMD_Parser import RunMD_Parser -from src.parser.SetupMD_Parser import SetupMD_Parser -from src.model.SetupMD import SetupMD -from src.parser.mapping_util import map_a_dict -from src.Preprocessor import Preprocessor -from src.model.SchemaConcepts.Dataset_simplified import Dataset -from src.resources.maps.mapping import setup_zeiss -from src.util import normalize_path, input_to_dict -from src.model.SchemaConcepts.codegen.SchemaClasses_TOMO import DatasetType -from src.model.SchemaConcepts.TOMO_Image import TOMO_Image +from tomo_mapper.model.RunMD import RunMD +from tomo_mapper.model.SchemaConcepts.Acquisition_simplified import Acquisition +from tomo_mapper.parser.RunMD_Parser import RunMD_Parser +from tomo_mapper.parser.SetupMD_Parser import SetupMD_Parser +from tomo_mapper.model.SetupMD import SetupMD +from tomo_mapper.parser.mapping_util import map_a_dict +from tomo_mapper.Preprocessor import Preprocessor +from tomo_mapper.model.SchemaConcepts.Dataset_simplified import Dataset +from tomo_mapper.resources.maps.mapping import setup_zeiss +from tomo_mapper.util import normalize_path, input_to_dict +from tomo_mapper.model.SchemaConcepts.codegen.SchemaClasses_TOMO import DatasetType +from tomo_mapper.model.SchemaConcepts.TOMO_Image import TOMO_Image import re diff --git a/src/parser/impl/Dataset_infoParser.py b/src/tomo_mapper/parser/impl/Dataset_infoParser.py similarity index 78% rename from src/parser/impl/Dataset_infoParser.py rename to src/tomo_mapper/parser/impl/Dataset_infoParser.py index bef6b4f..746dad3 100644 --- a/src/parser/impl/Dataset_infoParser.py +++ b/src/tomo_mapper/parser/impl/Dataset_infoParser.py @@ -1,13 +1,13 @@ from typing import List -from src.model.SchemaConcepts.Acquisition_simplified import Acquisition -from src.model.SchemaConcepts.Dataset_simplified import Dataset -from src.model.SetupMD import SetupMD -from src.parser.SetupMD_Parser import SetupMD_Parser -from src.parser.mapping_util import map_a_dict -from src.resources.maps.mapping import setup_tescan -from src.util import input_to_dict -from src.Preprocessor import Preprocessor +from tomo_mapper.model.SchemaConcepts.Acquisition_simplified import Acquisition +from tomo_mapper.model.SchemaConcepts.Dataset_simplified import Dataset +from tomo_mapper.model.SetupMD import SetupMD +from tomo_mapper.parser.SetupMD_Parser import SetupMD_Parser +from tomo_mapper.parser.mapping_util import map_a_dict +from tomo_mapper.resources.maps.mapping import setup_tescan +from tomo_mapper.util import input_to_dict +from tomo_mapper.Preprocessor import Preprocessor class Dataset_infoParser(SetupMD_Parser): diff --git a/src/parser/impl/EMProjectParser.py b/src/tomo_mapper/parser/impl/EMProjectParser.py similarity index 79% rename from src/parser/impl/EMProjectParser.py rename to src/tomo_mapper/parser/impl/EMProjectParser.py index 3f72ae1..5ed03bb 100644 --- a/src/parser/impl/EMProjectParser.py +++ b/src/tomo_mapper/parser/impl/EMProjectParser.py @@ -1,12 +1,12 @@ from typing import List -from src.model.SchemaConcepts.Acquisition_simplified import Acquisition -from src.model.SchemaConcepts.Dataset_simplified import Dataset -from src.model.SetupMD import SetupMD -from src.parser.SetupMD_Parser import SetupMD_Parser -from src.parser.mapping_util import map_a_dict -from src.resources.maps.mapping import setup_tf -from src.util import input_to_dict +from tomo_mapper.model.SchemaConcepts.Acquisition_simplified import Acquisition +from tomo_mapper.model.SchemaConcepts.Dataset_simplified import Dataset +from tomo_mapper.model.SetupMD import SetupMD +from tomo_mapper.parser.SetupMD_Parser import SetupMD_Parser +from tomo_mapper.parser.mapping_util import map_a_dict +from tomo_mapper.resources.maps.mapping import setup_tf +from tomo_mapper.util import input_to_dict class EMProjectParser(SetupMD_Parser): diff --git a/src/parser/impl/ProjectDataParser.py b/src/tomo_mapper/parser/impl/ProjectDataParser.py similarity index 73% rename from src/parser/impl/ProjectDataParser.py rename to src/tomo_mapper/parser/impl/ProjectDataParser.py index 243edc6..a981b25 100644 --- a/src/parser/impl/ProjectDataParser.py +++ b/src/tomo_mapper/parser/impl/ProjectDataParser.py @@ -1,10 +1,10 @@ from typing import List -from src.model.RunMD import RunMD -from src.model.SchemaConcepts.TOMO_Image import TOMO_Image -from src.model.SchemaConcepts.codegen.SchemaClasses_TOMO import DatasetType -from src.parser.RunMD_Parser import RunMD_Parser -from src.util import normalize_path +from tomo_mapper.model.RunMD import RunMD +from tomo_mapper.model.SchemaConcepts.TOMO_Image import TOMO_Image +from tomo_mapper.model.SchemaConcepts.codegen.SchemaClasses_TOMO import DatasetType +from tomo_mapper.parser.RunMD_Parser import RunMD_Parser +from tomo_mapper.util import normalize_path class ProjectDataParser(RunMD_Parser): diff --git a/src/parser/impl/TiffParser.py b/src/tomo_mapper/parser/impl/TiffParser.py similarity index 90% rename from src/parser/impl/TiffParser.py rename to src/tomo_mapper/parser/impl/TiffParser.py index 699c081..b6b6576 100644 --- a/src/parser/impl/TiffParser.py +++ b/src/tomo_mapper/parser/impl/TiffParser.py @@ -1,17 +1,16 @@ import logging from typing import Optional -from importlib import resources from PIL import Image -from src.IO.MappingAbortionError import MappingAbortionError -from src.Preprocessor import Preprocessor -from src.model.ImageMD import ImageMD -from src.parser.ImageParser import ImageParser, ParserMode -from src.parser.mapping_util import map_a_dict -from src.resources.maps.mapping import tiffparser_tomo_51023, tiffparser_tomo_34682, tiffparser_sem_34682, \ +from tomo_mapper.IO.MappingAbortionError import MappingAbortionError +from tomo_mapper.Preprocessor import Preprocessor +from tomo_mapper.model.ImageMD import ImageMD +from tomo_mapper.parser.ImageParser import ImageParser, ParserMode +from tomo_mapper.parser.mapping_util import map_a_dict +from tomo_mapper.resources.maps.mapping import tiffparser_tomo_51023, tiffparser_tomo_34682, tiffparser_sem_34682, \ tiffparser_sem_34118 -from src.util import input_to_dict +from tomo_mapper.util import input_to_dict #TODO: would this have any benefit from replacing with tifffile lib? diff --git a/src/parser/impl/TomographyProjectParser.py b/src/tomo_mapper/parser/impl/TomographyProjectParser.py similarity index 72% rename from src/parser/impl/TomographyProjectParser.py rename to src/tomo_mapper/parser/impl/TomographyProjectParser.py index b830bf7..8b54820 100644 --- a/src/parser/impl/TomographyProjectParser.py +++ b/src/tomo_mapper/parser/impl/TomographyProjectParser.py @@ -1,18 +1,12 @@ from typing import List -from src.model.SchemaConcepts.Acquisition_simplified import Acquisition -from src.model.SchemaConcepts.Dataset_simplified import Dataset -from src.model.SetupMD import SetupMD -from src.parser.RunMD_Parser import RunMD_Parser -from src.parser.SetupMD_Parser import SetupMD_Parser -from src.parser.mapping_util import map_a_dict -from src.resources.maps.mapping import setup_tescan -from src.util import input_to_dict -from src.model.SchemaConcepts.codegen.SchemaClasses_TOMO import DatasetType -from src.model.SchemaConcepts.TOMO_Image import TOMO_Image -from src.model.RunMD import RunMD -from src.util import normalize_path - +from tomo_mapper.model.SchemaConcepts.Acquisition_simplified import Acquisition +from tomo_mapper.model.SchemaConcepts.Dataset_simplified import Dataset +from tomo_mapper.model.SetupMD import SetupMD +from tomo_mapper.parser.SetupMD_Parser import SetupMD_Parser +from tomo_mapper.parser.mapping_util import map_a_dict +from tomo_mapper.resources.maps.mapping import setup_tescan +from tomo_mapper.util import input_to_dict class TomographyProjectParser(SetupMD_Parser): diff --git a/src/parser/impl/TxtParser.py b/src/tomo_mapper/parser/impl/TxtParser.py similarity index 88% rename from src/parser/impl/TxtParser.py rename to src/tomo_mapper/parser/impl/TxtParser.py index c6d5600..e10b725 100644 --- a/src/parser/impl/TxtParser.py +++ b/src/tomo_mapper/parser/impl/TxtParser.py @@ -1,20 +1,14 @@ import logging from typing import Optional -from PIL import Image - -from src.Preprocessor import Preprocessor -from src.model.ImageMD import ImageMD -from src.parser.ImageParser import ImageParser, ParserMode -from src.parser.mapping_util import map_a_dict -from src.resources.maps.mapping import textparser_tomo_tescan -from src.util import input_to_dict +from tomo_mapper.Preprocessor import Preprocessor +from tomo_mapper.model.ImageMD import ImageMD +from tomo_mapper.parser.ImageParser import ImageParser, ParserMode +from tomo_mapper.parser.mapping_util import map_a_dict +from tomo_mapper.resources.maps.mapping import textparser_tomo_tescan +from tomo_mapper.util import input_to_dict import configparser - - -#TODO: would this have any benefit from replacing with tifffile lib? - class TxtParser(ImageParser): internal_mapping = None diff --git a/src/resources/__init__.py b/src/tomo_mapper/parser/impl/__init__.py similarity index 100% rename from src/resources/__init__.py rename to src/tomo_mapper/parser/impl/__init__.py diff --git a/src/parser/mapping_util.py b/src/tomo_mapper/parser/mapping_util.py similarity index 97% rename from src/parser/mapping_util.py rename to src/tomo_mapper/parser/mapping_util.py index 8723617..d9611aa 100644 --- a/src/parser/mapping_util.py +++ b/src/tomo_mapper/parser/mapping_util.py @@ -3,7 +3,7 @@ import re import typing from jsonpath_ng.ext.parser import ExtentedJsonPathParser -from src.IO.MappingAbortionError import MappingAbortionError +from tomo_mapper.IO.MappingAbortionError import MappingAbortionError parser = ExtentedJsonPathParser() diff --git a/src/resources/maps/__init__.py b/src/tomo_mapper/resources/__init__.py similarity index 100% rename from src/resources/maps/__init__.py rename to src/tomo_mapper/resources/__init__.py diff --git a/src/tomo_mapper/resources/maps/__init__.py b/src/tomo_mapper/resources/maps/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/resources/maps/mapping/README.md b/src/tomo_mapper/resources/maps/mapping/README.md similarity index 100% rename from src/resources/maps/mapping/README.md rename to src/tomo_mapper/resources/maps/mapping/README.md diff --git a/src/resources/maps/mapping/SEM_jeol.json b/src/tomo_mapper/resources/maps/mapping/SEM_jeol.json similarity index 100% rename from src/resources/maps/mapping/SEM_jeol.json rename to src/tomo_mapper/resources/maps/mapping/SEM_jeol.json diff --git a/src/resources/maps/mapping/SEM_tescan.json b/src/tomo_mapper/resources/maps/mapping/SEM_tescan.json similarity index 100% rename from src/resources/maps/mapping/SEM_tescan.json rename to src/tomo_mapper/resources/maps/mapping/SEM_tescan.json diff --git a/src/resources/maps/mapping/SEM_thermofisher.json b/src/tomo_mapper/resources/maps/mapping/SEM_thermofisher.json similarity index 100% rename from src/resources/maps/mapping/SEM_thermofisher.json rename to src/tomo_mapper/resources/maps/mapping/SEM_thermofisher.json diff --git a/src/resources/maps/mapping/SEM_zeiss.json b/src/tomo_mapper/resources/maps/mapping/SEM_zeiss.json similarity index 100% rename from src/resources/maps/mapping/SEM_zeiss.json rename to src/tomo_mapper/resources/maps/mapping/SEM_zeiss.json diff --git a/src/resources/maps/mapping/TOMO_tescan_image.json b/src/tomo_mapper/resources/maps/mapping/TOMO_tescan_image.json similarity index 100% rename from src/resources/maps/mapping/TOMO_tescan_image.json rename to src/tomo_mapper/resources/maps/mapping/TOMO_tescan_image.json diff --git a/src/resources/maps/mapping/TOMO_tescan_setup.json b/src/tomo_mapper/resources/maps/mapping/TOMO_tescan_setup.json similarity index 100% rename from src/resources/maps/mapping/TOMO_tescan_setup.json rename to src/tomo_mapper/resources/maps/mapping/TOMO_tescan_setup.json diff --git a/src/resources/maps/mapping/TOMO_thermofisher_image.json b/src/tomo_mapper/resources/maps/mapping/TOMO_thermofisher_image.json similarity index 100% rename from src/resources/maps/mapping/TOMO_thermofisher_image.json rename to src/tomo_mapper/resources/maps/mapping/TOMO_thermofisher_image.json diff --git a/src/resources/maps/mapping/TOMO_thermofisher_setup.json b/src/tomo_mapper/resources/maps/mapping/TOMO_thermofisher_setup.json similarity index 100% rename from src/resources/maps/mapping/TOMO_thermofisher_setup.json rename to src/tomo_mapper/resources/maps/mapping/TOMO_thermofisher_setup.json diff --git a/src/resources/maps/mapping/TOMO_zeiss_image.json b/src/tomo_mapper/resources/maps/mapping/TOMO_zeiss_image.json similarity index 100% rename from src/resources/maps/mapping/TOMO_zeiss_image.json rename to src/tomo_mapper/resources/maps/mapping/TOMO_zeiss_image.json diff --git a/src/resources/maps/mapping/TOMO_zeiss_setup.json b/src/tomo_mapper/resources/maps/mapping/TOMO_zeiss_setup.json similarity index 100% rename from src/resources/maps/mapping/TOMO_zeiss_setup.json rename to src/tomo_mapper/resources/maps/mapping/TOMO_zeiss_setup.json diff --git a/src/resources/maps/mapping/__init__.py b/src/tomo_mapper/resources/maps/mapping/__init__.py similarity index 100% rename from src/resources/maps/mapping/__init__.py rename to src/tomo_mapper/resources/maps/mapping/__init__.py diff --git a/src/resources/maps/parsing/README.md b/src/tomo_mapper/resources/maps/parsing/README.md similarity index 86% rename from src/resources/maps/parsing/README.md rename to src/tomo_mapper/resources/maps/parsing/README.md index a5234b8..51bc789 100644 --- a/src/resources/maps/parsing/README.md +++ b/src/tomo_mapper/resources/maps/parsing/README.md @@ -9,9 +9,9 @@ The map file for tomography mapping is aiming for fine-tuning the mapping for sp For more details check out the default maps in this folder: -[Default map for Thermofisher input](./inputmap_thermofisher.json) +[Default map for Thermofisher input](inputmap_thermofisher.json) -[Default map for Zeiss input](./inputmap_zeiss-auriga.json) +[Default map for Zeiss input](inputmap_zeiss-auriga.json) [Default map for Tescan input](./inputmap_tescan-minimal.json) (dataset_info.hdr file only for setup md) diff --git a/src/resources/maps/parsing/__init__.py b/src/tomo_mapper/resources/maps/parsing/__init__.py similarity index 100% rename from src/resources/maps/parsing/__init__.py rename to src/tomo_mapper/resources/maps/parsing/__init__.py diff --git a/src/resources/maps/parsing/inputmap_tescan-minimal.json b/src/tomo_mapper/resources/maps/parsing/inputmap_tescan-minimal.json similarity index 100% rename from src/resources/maps/parsing/inputmap_tescan-minimal.json rename to src/tomo_mapper/resources/maps/parsing/inputmap_tescan-minimal.json diff --git a/src/resources/maps/parsing/inputmap_tescan.json b/src/tomo_mapper/resources/maps/parsing/inputmap_tescan.json similarity index 100% rename from src/resources/maps/parsing/inputmap_tescan.json rename to src/tomo_mapper/resources/maps/parsing/inputmap_tescan.json diff --git a/src/resources/maps/parsing/inputmap_thermofisher.json b/src/tomo_mapper/resources/maps/parsing/inputmap_thermofisher.json similarity index 100% rename from src/resources/maps/parsing/inputmap_thermofisher.json rename to src/tomo_mapper/resources/maps/parsing/inputmap_thermofisher.json diff --git a/src/resources/maps/parsing/inputmap_zeiss-auriga.json b/src/tomo_mapper/resources/maps/parsing/inputmap_zeiss-auriga.json similarity index 100% rename from src/resources/maps/parsing/inputmap_zeiss-auriga.json rename to src/tomo_mapper/resources/maps/parsing/inputmap_zeiss-auriga.json diff --git a/src/util.py b/src/tomo_mapper/util.py similarity index 98% rename from src/util.py rename to src/tomo_mapper/util.py index 703bc63..75a748b 100644 --- a/src/util.py +++ b/src/tomo_mapper/util.py @@ -16,7 +16,7 @@ import xmltodict from xml.parsers.expat import ExpatError -from src.IO.MappingAbortionError import MappingAbortionError +from tomo_mapper.IO.MappingAbortionError import MappingAbortionError import re def robust_textfile_read(filepath): diff --git a/tests/io_tests/sem/test_inputreader_sem.py b/tests/io_tests/sem/test_inputreader_sem.py index 0835eee..f021a5a 100644 --- a/tests/io_tests/sem/test_inputreader_sem.py +++ b/tests/io_tests/sem/test_inputreader_sem.py @@ -1,9 +1,7 @@ import os -import pytest - -from src.IO.sem.InputReader import InputReader -from src.parser.impl.TiffParser import TiffParser +from tomo_mapper.IO.sem.InputReader import InputReader +from tomo_mapper.parser.impl.TiffParser import TiffParser class TestInputReader: @@ -12,6 +10,7 @@ def set_up_sample_data(self): dir_to_testscript = os.path.split(__file__)[0] test_path = os.path.join(dir_to_testscript, "../../sampleData/") + print(test_path) return test_path def return_plaintext_format(self): @@ -34,7 +33,7 @@ def test_get_applicable_parsers_with_extension(self, mocker): tp = self.set_up_sample_data() ret = "text/plain" - mocker.patch('src.parser.impl.TiffParser.TiffParser.expected_input', self.return_plaintext_format()) + mocker.patch('tomo_mapper.parser.impl.TiffParser.TiffParser.expected_input', self.return_plaintext_format()) assert TiffParser.expected_input_format() == "text/plain" jeolfile = os.path.join(tp, "./images/SEM/JEOL/image000.txt") @@ -46,7 +45,7 @@ def test_get_applicable_parsers_wo_extension(self, mocker): tp = self.set_up_sample_data() ret = "text/plain" - mocker.patch('src.parser.impl.TiffParser.TiffParser.expected_input', self.return_plaintext_format()) + mocker.patch('tomo_mapper.parser.impl.TiffParser.TiffParser.expected_input', self.return_plaintext_format()) assert TiffParser.expected_input_format() == "text/plain" jeolfile = os.path.join(tp, "./images/SEM/JEOL/image000") diff --git a/tests/io_tests/tomo/test_inputfolder.py b/tests/io_tests/tomo/test_inputfolder.py index e4306ef..8afba60 100644 --- a/tests/io_tests/tomo/test_inputfolder.py +++ b/tests/io_tests/tomo/test_inputfolder.py @@ -4,7 +4,7 @@ import pytest -from mapping_cli import run_tomo_mapper +from tomo_mapper.mapping_main import run_tomo_mapper class TestInputFolder: diff --git a/tests/io_tests/tomo/test_inputreader_tomo.py b/tests/io_tests/tomo/test_inputreader_tomo.py index 66a81d6..2258b62 100644 --- a/tests/io_tests/tomo/test_inputreader_tomo.py +++ b/tests/io_tests/tomo/test_inputreader_tomo.py @@ -4,10 +4,10 @@ import pytest -from src.IO.MappingAbortionError import MappingAbortionError -from src.IO.tomo.InputReader import InputReader -from src.model.RunMD import RunMD -from src.util import is_zipfile +from tomo_mapper.IO.MappingAbortionError import MappingAbortionError +from tomo_mapper.IO.tomo.InputReader import InputReader +from tomo_mapper.model.RunMD import RunMD +from tomo_mapper.util import is_zipfile class TestInputReader: @@ -61,7 +61,7 @@ def test_inputreader_with_folder(self, mapfile, mocker): Test sample data folder and setup parser """ datapath = self.set_up_sample_data() - mocker.patch('src.parser.impl.ProjectDataParser.ProjectDataParser.parse_run', return_value=(RunMD(), {})) + mocker.patch('tomo_mapper.parser.impl.ProjectDataParser.ProjectDataParser.parse_run', return_value=(RunMD(), {})) ir = InputReader(mapfile, datapath) ir.retrieve_setup_info() diff --git a/tests/io_tests/tomo/test_mapreader.py b/tests/io_tests/tomo/test_mapreader.py index 33f2763..8c053a8 100644 --- a/tests/io_tests/tomo/test_mapreader.py +++ b/tests/io_tests/tomo/test_mapreader.py @@ -5,12 +5,12 @@ import pytest -from src.IO.tomo.MapfileReader import MapFileReader -from src.parser.impl.Atlas3dParser import Atlas3dParser +from tomo_mapper.IO.tomo.MapfileReader import MapFileReader +from tomo_mapper.parser.impl.Atlas3dParser import Atlas3dParser -from src.parser.impl.Dataset_infoParser import Dataset_infoParser -from src.parser.impl.ProjectDataParser import ProjectDataParser -from src.parser.impl.TomographyProjectParser import TomographyProjectParser +from tomo_mapper.parser.impl.Dataset_infoParser import Dataset_infoParser +from tomo_mapper.parser.impl.ProjectDataParser import ProjectDataParser +from tomo_mapper.parser.impl.TomographyProjectParser import TomographyProjectParser class TestMapfileReader: @@ -95,7 +95,7 @@ def test_single_parser_multiple_sources_setup(self): setupmdPairs = MapFileReader.parse_mapinfo_for_setup(test_map) for item in setupmdPairs: # [("./src1.xml", <"TomographyProjectParser" instance>), ("./src2.xml", <"TomographyProjectParser" instance>)] assert len(item) == 2 - assert len(setupmdPairs) == 2 + assert len(setupmdPairs) == 2 assert isinstance(setupmdPairs[0][1], TomographyProjectParser) assert isinstance(setupmdPairs[1][1], TomographyProjectParser) @@ -112,7 +112,7 @@ def test_parser_sources_list_matching_setup(self): setupmdPairs = MapFileReader.parse_mapinfo_for_setup(test_map) for item in setupmdPairs: # [("./src1.hdr", <"TomographyProjectParser" instance>), ("./src2.xml", <"TomographyProjectParser" instance>)] assert len(item) == 2 - assert len(setupmdPairs) == 2 + assert len(setupmdPairs) == 2 assert isinstance(setupmdPairs[0][1], Dataset_infoParser) assert isinstance(setupmdPairs[1][1], TomographyProjectParser) diff --git a/tests/model_tests/test_dataset.py b/tests/model_tests/test_dataset.py index 1ef7569..1205758 100644 --- a/tests/model_tests/test_dataset.py +++ b/tests/model_tests/test_dataset.py @@ -1,4 +1,4 @@ -from src.model.SchemaConcepts.Dataset_simplified import Dataset +from tomo_mapper.model.SchemaConcepts.Dataset_simplified import Dataset class TestDataset: diff --git a/tests/model_tests/test_runmd.py b/tests/model_tests/test_runmd.py index af455df..fa6c6ae 100644 --- a/tests/model_tests/test_runmd.py +++ b/tests/model_tests/test_runmd.py @@ -1,8 +1,6 @@ -import unittest - -from src.model.RunMD import RunMD -from src.model.SchemaConcepts.TOMO_Image import TOMO_Image -from src.model.SchemaConcepts.codegen.SchemaClasses_TOMO import DatasetType +from tomo_mapper.model.RunMD import RunMD +from tomo_mapper.model.SchemaConcepts.TOMO_Image import TOMO_Image +from tomo_mapper.model.SchemaConcepts.codegen.SchemaClasses_TOMO import DatasetType class TestSetupMD: diff --git a/tests/model_tests/test_semimage.py b/tests/model_tests/test_semimage.py index cfb3bc3..4fe72b0 100644 --- a/tests/model_tests/test_semimage.py +++ b/tests/model_tests/test_semimage.py @@ -1,10 +1,9 @@ import json -import os from datetime import datetime -from src.config import MappingConfig -from src.model.SchemaConcepts.SEM_Image import SEM_Image -from src.model.SchemaConcepts.TOMO_Image import TOMO_Image +from tomo_mapper.config import MappingConfig +from tomo_mapper.model.SchemaConcepts.SEM_Image import SEM_Image +from tomo_mapper.model.SchemaConcepts.TOMO_Image import TOMO_Image class TestSEMImage: diff --git a/tests/model_tests/test_tomoimage.py b/tests/model_tests/test_tomoimage.py index fcf00b4..bc7ce3b 100644 --- a/tests/model_tests/test_tomoimage.py +++ b/tests/model_tests/test_tomoimage.py @@ -2,8 +2,8 @@ import os from datetime import datetime -from src.config import MappingConfig -from src.model.SchemaConcepts.TOMO_Image import TOMO_Image +from tomo_mapper.config import MappingConfig +from tomo_mapper.model.SchemaConcepts.TOMO_Image import TOMO_Image class TestTOMOImage: diff --git a/tests/parser_tests/test_emprojectparser.py b/tests/parser_tests/test_emprojectparser.py index 73e583d..11ff0cd 100644 --- a/tests/parser_tests/test_emprojectparser.py +++ b/tests/parser_tests/test_emprojectparser.py @@ -1,7 +1,7 @@ import os from pprint import pprint -from src.parser.impl.EMProjectParser import EMProjectParser +from tomo_mapper.parser.impl.EMProjectParser import EMProjectParser class TestEmprojectParser: diff --git a/tests/parser_tests/test_mapfilereader.py b/tests/parser_tests/test_mapfilereader.py index 6d989e2..84aac72 100644 --- a/tests/parser_tests/test_mapfilereader.py +++ b/tests/parser_tests/test_mapfilereader.py @@ -4,11 +4,11 @@ import pytest -from src.IO.MappingAbortionError import MappingAbortionError -from src.IO.tomo.MapfileReader import MapFileReader -from src.parser.impl.Atlas3dParser import Atlas3dParser -from src.parser.impl.EMProjectParser import EMProjectParser -from src.parser.impl.TiffParser import TiffParser +from tomo_mapper.IO.MappingAbortionError import MappingAbortionError +from tomo_mapper.IO.tomo.MapfileReader import MapFileReader +from tomo_mapper.parser.impl.Atlas3dParser import Atlas3dParser +from tomo_mapper.parser.impl.EMProjectParser import EMProjectParser +from tomo_mapper.parser.impl.TiffParser import TiffParser class TestMapfileReader: @@ -35,7 +35,7 @@ def test_pathvalidation(self): assert MapFileReader.validate_relative_path("../correct/**/wildcard_path") def test_loading_default_maps(self): - sourcesPath = os.path.join(self.testpath, "../../src/resources/maps/parsing/inputmap_*.json") + sourcesPath = os.path.join(self.testpath, "../../src/tomo_mapper/resources/maps/parsing/inputmap_*.json") map_sources = glob(sourcesPath) assert len(map_sources) > 0 @@ -48,7 +48,7 @@ def test_loading_default_maps(self): def test_parsing_default_maps(self): - sourcesPath = os.path.join(self.testpath, "../../src/resources/maps/parsing/inputmap_*.json") + sourcesPath = os.path.join(self.testpath, "../../src/tomo_mapper/resources/maps/parsing/inputmap_*.json") map_sources = glob(sourcesPath) available_ac_parsers = { diff --git a/tests/parser_tests/test_mappingutil.py b/tests/parser_tests/test_mappingutil.py index 7a596bc..3a14ce4 100644 --- a/tests/parser_tests/test_mappingutil.py +++ b/tests/parser_tests/test_mappingutil.py @@ -1,6 +1,6 @@ import jsonpath_ng.ext -from src.parser.mapping_util import escape_pathelements +from tomo_mapper.parser.mapping_util import escape_pathelements class TestMappingUtil: diff --git a/tests/parser_tests/test_preprocessor.py b/tests/parser_tests/test_preprocessor.py index aef1c49..5e6bf1c 100644 --- a/tests/parser_tests/test_preprocessor.py +++ b/tests/parser_tests/test_preprocessor.py @@ -1,8 +1,8 @@ import importlib from enum import Enum -from src.Preprocessor import Preprocessor -from src.model.SchemaConcepts.codegen.SchemaClasses_SEM import Entry +from tomo_mapper.Preprocessor import Preprocessor +from tomo_mapper.model.SchemaConcepts.codegen.SchemaClasses_SEM import Entry class TestPreprocessor: @@ -21,7 +21,7 @@ def test_unit_replacement(self): } } - units_module = importlib.import_module('src.model.SchemaConcepts.codegen.SchemaClasses_TOMO') + units_module = importlib.import_module('tomo_mapper.model.SchemaConcepts.codegen.SchemaClasses_TOMO') # Collect all unit values that are allowed all_units = set() diff --git a/tests/parser_tests/test_tiffparser.py b/tests/parser_tests/test_tiffparser.py index ce472c9..195b397 100644 --- a/tests/parser_tests/test_tiffparser.py +++ b/tests/parser_tests/test_tiffparser.py @@ -4,11 +4,11 @@ import pytest -from src.config import MappingConfig -from src.parser.ImageParser import ParserMode -from src.parser.impl.TiffParser import TiffParser -from src.resources.maps.mapping import tiffparser_sem_34118, tiffparser_sem_34682 -from src.util import load_json, input_to_dict +from tomo_mapper.config import MappingConfig +from tomo_mapper.parser.ImageParser import ParserMode +from tomo_mapper.parser.impl.TiffParser import TiffParser +from tomo_mapper.resources.maps.mapping import tiffparser_sem_34118, tiffparser_sem_34682 +from tomo_mapper.util import load_json, input_to_dict class TestTiffparser: diff --git a/tests/parser_tests/test_txtparser.py b/tests/parser_tests/test_txtparser.py index 511bb4b..2b21680 100644 --- a/tests/parser_tests/test_txtparser.py +++ b/tests/parser_tests/test_txtparser.py @@ -4,11 +4,11 @@ import pytest -from src.config import MappingConfig -from src.parser.ImageParser import ParserMode -from src.parser.impl.TxtParser import TxtParser -from src.resources.maps.mapping import textparser_sem_tescan, textparser_sem_jeol -from src.util import load_json, input_to_dict +from tomo_mapper.config import MappingConfig +from tomo_mapper.parser.ImageParser import ParserMode +from tomo_mapper.parser.impl.TxtParser import TxtParser +from tomo_mapper.resources.maps.mapping import textparser_sem_tescan, textparser_sem_jeol +from tomo_mapper.util import input_to_dict class TestTXTparser: