From c3298cf7307d5d57a0fe98210a47fa0b689be624 Mon Sep 17 00:00:00 2001 From: Rafael Barrero Rodriguez Date: Fri, 18 Dec 2020 12:26:17 +0100 Subject: [PATCH] Add microbial database & Handle file extension --- .gitignore | 8 +- desktopApp/app/assets/files/errorCode.json | 16 +- .../tests/test10/additional_information.xls | Bin 0 -> 26112 bytes .../assets/files/tests/test10/annotations.xls | Bin 0 -> 26112 bytes .../files/tests/test3/MS_experiment_log.txt | 19 + desktopApp/app/sections/execute/tagger.html | 8 +- .../app/src/Data/microbial_database.tsv | 6842 +++++++++++++++++ .../src/config/configTagger/configTagger.ini | 4 +- desktopApp/app/src/pyModules/REname.py | 39 +- desktopApp/app/src/pyModules/RowMerger.py | 30 +- desktopApp/app/src/pyModules/TableMerger.py | 31 +- desktopApp/app/src/pyModules/Tagger.py | 101 +- tools/Tagger/dbs/microbial_database.tsv | 6842 +++++++++++++++++ .../dbs/scripts/microbial_pre_database.tsv | 120 + .../dbs/scripts/microbial_pre_database_id.tsv | 120 + .../TurboPutative/Data/microbial_database.tsv | 6842 +++++++++++++++++ webApp/src/TurboPutative/errorCode.json | 4 + webApp/src/TurboPutative/pyModules/Tagger.py | 72 +- webApp/src/partials/execute/tagger.html | 5 + webApp/src/public/assets/js/settings.js | 3 + 20 files changed, 21068 insertions(+), 38 deletions(-) create mode 100644 desktopApp/app/assets/files/tests/test10/additional_information.xls create mode 100644 desktopApp/app/assets/files/tests/test10/annotations.xls create mode 100644 desktopApp/app/src/Data/microbial_database.tsv create mode 100644 tools/Tagger/dbs/microbial_database.tsv create mode 100644 tools/Tagger/dbs/scripts/microbial_pre_database.tsv create mode 100644 tools/Tagger/dbs/scripts/microbial_pre_database_id.tsv create mode 100644 webApp/src/TurboPutative/Data/microbial_database.tsv diff --git a/.gitignore b/.gitignore index c629e6b..2081ee6 100644 --- a/.gitignore +++ b/.gitignore @@ -23,7 +23,7 @@ webApp/node_modules/* # webApp jobs # ############### -webApp/src/public/results/*/* +webApp/src/public/jobs/*/* # releases # ############ @@ -44,9 +44,9 @@ desktopApp/app/src/pyModules/pygoslin/domain/__pycache__/* ################## desktopApp/app/src/pyModules/pygoslin/* desktopApp/app/src/pyModules/pygoslin_library/* -webApp/src/TurboPutative/pyModules/pygoslinn/* -webApp/src/TurboPutative/pyModules/pygoslinn_library/* -webApp/src/TurboPutative/pyModules/pygoslinn_library.zip +webApp/src/TurboPutative/pyModules/pygoslin/* +webApp/src/TurboPutative/pyModules/pygoslin_library/* +webApp/src/TurboPutative/pyModules/pygoslin_library.zip # Jupyter Notebook scripts # ############################ diff --git a/desktopApp/app/assets/files/errorCode.json b/desktopApp/app/assets/files/errorCode.json index e32ce5f..69184c1 100644 --- a/desktopApp/app/assets/files/errorCode.json +++ b/desktopApp/app/assets/files/errorCode.json @@ -102,5 +102,19 @@ "module": "TableMerger", "description": "An error occurred when writing output file.", "code": "42" - } + }, + "50": { + "module": "TableMerger", + "description": "File with feature information could not be copied", + "code": "50" + }, + "51": { + "module": "search", + "description": "The requested job was not found", + "code": "51" + }, + "52": { + "module": "workflow", + "description": "Input file extension error" + } } \ No newline at end of file diff --git a/desktopApp/app/assets/files/tests/test10/additional_information.xls b/desktopApp/app/assets/files/tests/test10/additional_information.xls new file mode 100644 index 0000000000000000000000000000000000000000..e65147ce3c899d31bf0eccda385468991ebf0573 GIT binary patch literal 26112 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 literal 0 HcmV?d00001 diff --git a/desktopApp/app/assets/files/tests/test10/annotations.xls b/desktopApp/app/assets/files/tests/test10/annotations.xls new file mode 100644 index 0000000000000000000000000000000000000000..1648156af9855c2c8c58925924ebb0f22d617880 GIT binary patch literal 26112 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 - + --> - --> +