From eda20aad3b538297040f8fdc8728a5daf9d2cdb9 Mon Sep 17 00:00:00 2001 From: niekdejonge Date: Thu, 23 Nov 2023 23:16:40 +0100 Subject: [PATCH 01/19] Add embeddings to sqlite file --- .../create_sqlite_database.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/ms2query/create_new_library/create_sqlite_database.py b/ms2query/create_new_library/create_sqlite_database.py index 722a6b3e..33f40be6 100644 --- a/ms2query/create_new_library/create_sqlite_database.py +++ b/ms2query/create_new_library/create_sqlite_database.py @@ -15,9 +15,12 @@ def make_sqlfile_wrapper(sqlite_file_name: str, list_of_spectra: List[Spectrum], + ms2ds_embeddings: pd.DataFrame, + s2v_embeddings: pd.DataFrame, columns_dict: Dict[str, str] = None, compound_classes: pd.DataFrame = None, - progress_bars: bool = True): + progress_bars: bool = True, + ): """Wrapper to create sqlite file containing spectrum information needed for MS2Query Args: @@ -54,6 +57,18 @@ def make_sqlfile_wrapper(sqlite_file_name: str, compound_classes=compound_classes, progress_bars=progress_bars) + add_dataframe_to_sqlite(sqlite_file_name, 'MS2Deepscore_embeddings', ms2ds_embeddings) + add_dataframe_to_sqlite(sqlite_file_name, 'Spec2Vec_embeddings', s2v_embeddings) + + +def add_dataframe_to_sqlite(sqlite_file_name, + table_name, + dataframe: pd.DataFrame): + conn = sqlite3.connect(sqlite_file_name) + dataframe.to_sql(table_name, conn, if_exists='fail', index=True, index_label="spectrumid") + conn.commit() + conn.close() + def initialize_tables(sqlite_file_name: str, additional_metadata_columns_dict: Dict[str, str] = None, From 8ba91b34ebaa34dece65bb535447ccc0d5809963 Mon Sep 17 00:00:00 2001 From: niekdejonge Date: Thu, 23 Nov 2023 23:17:27 +0100 Subject: [PATCH 02/19] Adjust library_files_creator to add embeddings to sqlite as well --- README.md | 2 +- .../library_files_creator.py | 34 +++++-------------- ms2query/create_new_library/train_models.py | 2 +- .../train_ms2query_model.py | 2 +- 4 files changed, 11 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index 1082c8c6..c1e8e789 100644 --- a/README.md +++ b/README.md @@ -201,7 +201,7 @@ library_creator = LibraryFilesCreator(cleaned_library_spectra, output_directory=directory_for_library_and_models, ms2ds_model_file_name=ms2ds_model_file_name, s2v_model_file_name=s2v_model_file_name, ) -library_creator.create_all_library_files() +library_creator.create_sqlite_file() ``` To run MS2Query on your own created library. Check out the instructions under Run MS2Query. Both command line and the code version should work. diff --git a/ms2query/create_new_library/library_files_creator.py b/ms2query/create_new_library/library_files_creator.py index 4285b067..9c5d55ed 100644 --- a/ms2query/create_new_library/library_files_creator.py +++ b/ms2query/create_new_library/library_files_creator.py @@ -19,7 +19,7 @@ from ms2query.create_new_library.add_classifire_classifications import ( convert_to_dataframe, select_compound_classes) from ms2query.create_new_library.create_sqlite_database import \ - make_sqlfile_wrapper + make_sqlfile_wrapper, add_dataframe_to_sqlite class LibraryFilesCreator: @@ -75,8 +75,6 @@ def __init__(self, if not os.path.exists(self.output_directory): os.mkdir(self.output_directory) self.sqlite_file_name = os.path.join(output_directory, "ms2query_library.sqlite") - self.ms2ds_embeddings_file_name = os.path.join(output_directory, "ms2ds_embeddings.pickle") - self.s2v_embeddings_file_name = os.path.join(output_directory, "s2v_embeddings.pickle") # These checks are performed at the start, since the filtering of spectra can take long self._check_for_existing_files() # Load in spec2vec model @@ -103,19 +101,6 @@ def _check_for_existing_files(self): assert not os.path.exists(self.sqlite_file_name), \ f"The file {self.sqlite_file_name} already exists," \ f" choose a different output_base_filename" - assert not os.path.exists(self.ms2ds_embeddings_file_name), \ - f"The file {self.ms2ds_embeddings_file_name} " \ - f"already exists, choose a different output_base_filename" - assert not os.path.exists(self.s2v_embeddings_file_name), \ - f"The file {self.s2v_embeddings_file_name} " \ - f"already exists, choose a different output_base_filename" - - def create_all_library_files(self): - """Creates files with embeddings and a sqlite file with spectra data - """ - self.create_sqlite_file() - self.store_s2v_embeddings() - self.store_ms2ds_embeddings() def create_sqlite_file(self): if self.add_compound_classes: @@ -126,37 +111,34 @@ def create_sqlite_file(self): make_sqlfile_wrapper( self.sqlite_file_name, self.list_of_spectra, + self.create_ms2ds_embeddings(), + self.create_s2v_embeddings(), columns_dict={"precursor_mz": "REAL"}, compound_classes=compound_classes_df, progress_bars=self.progress_bars, ) - def store_ms2ds_embeddings(self): - """Creates a pickled file with embeddings scores for spectra + def create_ms2ds_embeddings(self): + """Creates the ms2deepscore embeddings for all spectra A dataframe with as index randomly generated spectrum indexes and as columns the indexes of the vector is converted to pickle. """ - assert not os.path.exists(self.ms2ds_embeddings_file_name), \ - "Given ms2ds_embeddings_file_name already exists" assert self.ms2ds_model is not None, "No MS2deepscore model was provided" ms2ds = MS2DeepScore(self.ms2ds_model, progress_bar=self.progress_bars) - # Compute spectral embeddings embeddings = ms2ds.calculate_vectors(self.list_of_spectra) spectrum_ids = np.arange(0, len(self.list_of_spectra)) all_embeddings_df = pd.DataFrame(embeddings, index=spectrum_ids) - all_embeddings_df.to_pickle(self.ms2ds_embeddings_file_name) + return all_embeddings_df - def store_s2v_embeddings(self): + def create_s2v_embeddings(self): """Creates and stored a dataframe with embeddings as pickled file A dataframe with as index randomly generated spectrum indexes and as columns the indexes of the vector is converted to pickle. """ - assert not os.path.exists(self.s2v_embeddings_file_name), \ - "Given s2v_embeddings_file_name already exists" assert self.s2v_model is not None, "No spec2vec model was specified" # Convert Spectrum objects to SpectrumDocument spectrum_documents = create_spectrum_documents( @@ -174,4 +156,4 @@ def store_s2v_embeddings(self): # Convert to pandas Dataframe embeddings_dataframe = pd.DataFrame.from_dict(embeddings_dict, orient="index") - embeddings_dataframe.to_pickle(self.s2v_embeddings_file_name) + return embeddings_dataframe \ No newline at end of file diff --git a/ms2query/create_new_library/train_models.py b/ms2query/create_new_library/train_models.py index 7b0a267f..052f5111 100644 --- a/ms2query/create_new_library/train_models.py +++ b/ms2query/create_new_library/train_models.py @@ -79,7 +79,7 @@ def train_all_models(annotated_training_spectra, spec2vec_model_file_name, ms2deepscore_model_file_name, add_compound_classes=settings.add_compound_classes) - library_files_creator.create_all_library_files() + library_files_creator.create_sqlite_file() def clean_and_train_models(spectrum_file: str, diff --git a/ms2query/create_new_library/train_ms2query_model.py b/ms2query/create_new_library/train_ms2query_model.py index 1162fc69..db544388 100644 --- a/ms2query/create_new_library/train_ms2query_model.py +++ b/ms2query/create_new_library/train_ms2query_model.py @@ -129,7 +129,7 @@ def train_ms2query_model(training_spectra, s2v_model_file_name=s2v_model_file_name, ms2ds_model_file_name=ms2ds_model_file_name, add_compound_classes=False) - library_creator_for_training.create_all_library_files() + library_creator_for_training.create_sqlite_file() ms2library_for_training = MS2Library(sqlite_file_name=library_creator_for_training.sqlite_file_name, s2v_model_file_name=s2v_model_file_name, From deb5665829fb6599d987a060057e5f60a6d4c0b7 Mon Sep 17 00:00:00 2001 From: niekdejonge Date: Thu, 23 Nov 2023 23:17:41 +0100 Subject: [PATCH 03/19] Update test_library_files_creator.py --- tests/test_library_files_creator.py | 38 ++++++++++++----------------- 1 file changed, 15 insertions(+), 23 deletions(-) diff --git a/tests/test_library_files_creator.py b/tests/test_library_files_creator.py index cf0a5e9a..005ece74 100644 --- a/tests/test_library_files_creator.py +++ b/tests/test_library_files_creator.py @@ -4,8 +4,6 @@ from ms2query.clean_and_filter_spectra import normalize_and_filter_peaks from ms2query.create_new_library.library_files_creator import \ LibraryFilesCreator -from ms2query.utils import (load_matchms_spectrum_objects_from_file, - load_pickled_file) def test_give_already_used_file_name(tmp_path, path_to_general_test_files, hundred_test_spectra): @@ -17,28 +15,22 @@ def test_give_already_used_file_name(tmp_path, path_to_general_test_files, hundr LibraryFilesCreator(hundred_test_spectra, tmp_path) -def test_store_ms2ds_embeddings(tmp_path, path_to_general_test_files, - hundred_test_spectra, - expected_ms2ds_embeddings): +def test_create_ms2ds_embeddings(tmp_path, path_to_general_test_files, + hundred_test_spectra, + expected_ms2ds_embeddings): """Tests store_ms2ds_embeddings""" base_file_name = os.path.join(tmp_path, '100_test_spectra') library_spectra = [normalize_and_filter_peaks(s) for s in hundred_test_spectra if s is not None] test_create_files = LibraryFilesCreator(library_spectra, base_file_name, ms2ds_model_file_name=os.path.join(path_to_general_test_files, 'ms2ds_siamese_210301_5000_500_400.hdf5')) - test_create_files.store_ms2ds_embeddings() - - new_embeddings_file_name = os.path.join(base_file_name, "ms2ds_embeddings.pickle") - assert os.path.isfile(new_embeddings_file_name), \ - "Expected file to be created" - # Test if correct embeddings are stored - embeddings = load_pickled_file(new_embeddings_file_name) + embeddings = test_create_files.create_ms2ds_embeddings() pd.testing.assert_frame_equal(embeddings, expected_ms2ds_embeddings, check_exact=False, atol=1e-5) -def test_store_s2v_embeddings(tmp_path, path_to_general_test_files, hundred_test_spectra, +def test_create_s2v_embeddings(tmp_path, path_to_general_test_files, hundred_test_spectra, expected_s2v_embeddings): """Tests store_ms2ds_embeddings""" base_file_name = os.path.join(tmp_path, '100_test_spectra') @@ -46,20 +38,20 @@ def test_store_s2v_embeddings(tmp_path, path_to_general_test_files, hundred_test test_create_files = LibraryFilesCreator(library_spectra, base_file_name, s2v_model_file_name=os.path.join(path_to_general_test_files, "100_test_spectra_s2v_model.model")) - test_create_files.store_s2v_embeddings() - - new_embeddings_file_name = os.path.join(base_file_name, "s2v_embeddings.pickle") - assert os.path.isfile(new_embeddings_file_name), \ - "Expected file to be created" - embeddings = load_pickled_file(new_embeddings_file_name) + embeddings = test_create_files.create_s2v_embeddings() pd.testing.assert_frame_equal(embeddings, expected_s2v_embeddings, check_exact=False, atol=1e-5) -def test_create_sqlite_file(tmp_path, path_to_general_test_files, hundred_test_spectra): +def test_create_sqlite_file_with_embeddings(hundred_test_spectra, path_to_general_test_files): test_create_files = LibraryFilesCreator( - hundred_test_spectra[:20], output_directory=os.path.join(tmp_path, '100_test_spectra'), - add_compound_classes=False) + hundred_test_spectra[:20], + output_directory=os.path.join(path_to_general_test_files), + add_compound_classes=False, + ms2ds_model_file_name=os.path.join(path_to_general_test_files, + 'ms2ds_siamese_210301_5000_500_400.hdf5'), + s2v_model_file_name=os.path.join(path_to_general_test_files, + "100_test_spectra_s2v_model.model") + ) test_create_files.create_sqlite_file() - From 9329b228f18d97fbb06c2926477ef910812bff88 Mon Sep 17 00:00:00 2001 From: niekdejonge Date: Thu, 23 Nov 2023 23:46:37 +0100 Subject: [PATCH 04/19] Add get_ms2deepscore_embeddings (from sqlite) --- ms2query/query_from_sqlite_database.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/ms2query/query_from_sqlite_database.py b/ms2query/query_from_sqlite_database.py index 83a6773d..648e4f3f 100644 --- a/ms2query/query_from_sqlite_database.py +++ b/ms2query/query_from_sqlite_database.py @@ -158,3 +158,14 @@ def contains_class_annotation(self) -> bool: if has_class_annotations is False: print("SQLite file does not contain compound class information (download a newer version)") return has_class_annotations + + def get_ms2deepscore_embeddings(self): + # Connect to the SQLite database + conn = sqlite3.connect(self.sqlite_file_name) + # Write an SQL query to select data from the table + query = "SELECT * FROM MS2Deepscore_embeddings" + # Use the read_sql_query function to execute the query and read the results into a DataFrame + ms2deepscore_embeddings = pd.read_sql_query(query, conn, index_col="spectrumid") + # Close the connection + conn.close() + return ms2deepscore_embeddings \ No newline at end of file From a1367da7f0aafb4b9460e4fd45b1197b5298f536 Mon Sep 17 00:00:00 2001 From: niekdejonge Date: Thu, 23 Nov 2023 23:46:59 +0100 Subject: [PATCH 05/19] Add get_ms2deepscore_embeddings (from sqlite) to the test create sqlite file with embeddings --- tests/test_library_files_creator.py | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/tests/test_library_files_creator.py b/tests/test_library_files_creator.py index 005ece74..ee38a3b7 100644 --- a/tests/test_library_files_creator.py +++ b/tests/test_library_files_creator.py @@ -4,7 +4,7 @@ from ms2query.clean_and_filter_spectra import normalize_and_filter_peaks from ms2query.create_new_library.library_files_creator import \ LibraryFilesCreator - +from ms2query.query_from_sqlite_database import SqliteLibrary def test_give_already_used_file_name(tmp_path, path_to_general_test_files, hundred_test_spectra): already_existing_file = os.path.join(tmp_path, "ms2query_library.sqlite") @@ -44,10 +44,11 @@ def test_create_s2v_embeddings(tmp_path, path_to_general_test_files, hundred_tes atol=1e-5) -def test_create_sqlite_file_with_embeddings(hundred_test_spectra, path_to_general_test_files): +def test_create_sqlite_file_with_embeddings(tmp_path, hundred_test_spectra, path_to_general_test_files, expected_ms2ds_embeddings): + library_spectra = [normalize_and_filter_peaks(s) for s in hundred_test_spectra[:20] if s is not None] test_create_files = LibraryFilesCreator( - hundred_test_spectra[:20], - output_directory=os.path.join(path_to_general_test_files), + library_spectra, + output_directory=os.path.join(tmp_path), add_compound_classes=False, ms2ds_model_file_name=os.path.join(path_to_general_test_files, 'ms2ds_siamese_210301_5000_500_400.hdf5'), @@ -55,3 +56,14 @@ def test_create_sqlite_file_with_embeddings(hundred_test_spectra, path_to_genera "100_test_spectra_s2v_model.model") ) test_create_files.create_sqlite_file() + sqlite_library = SqliteLibrary(os.path.join(tmp_path, "ms2query_library.sqlite")) + ms2deepscore_embeddings = sqlite_library.get_ms2deepscore_embeddings() + ms2deepscore_embeddings.columns = pd.RangeIndex(start=0, + stop=len(ms2deepscore_embeddings.columns), + step=1) + + pd.testing.assert_frame_equal(ms2deepscore_embeddings, + expected_ms2ds_embeddings.loc[:19], + check_exact=False, + atol=1e-5, + check_names=False) From bc878182ab358bed549eb8a0a9208f8d40fac911 Mon Sep 17 00:00:00 2001 From: niekdejonge Date: Fri, 24 Nov 2023 09:37:21 +0100 Subject: [PATCH 06/19] Add get_spec2vec_embeddings (from sqlite) to the test create sqlite file with embeddings --- ms2query/query_from_sqlite_database.py | 13 ++++++++++++- tests/test_library_files_creator.py | 14 ++++++++++++-- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/ms2query/query_from_sqlite_database.py b/ms2query/query_from_sqlite_database.py index 648e4f3f..d925371f 100644 --- a/ms2query/query_from_sqlite_database.py +++ b/ms2query/query_from_sqlite_database.py @@ -168,4 +168,15 @@ def get_ms2deepscore_embeddings(self): ms2deepscore_embeddings = pd.read_sql_query(query, conn, index_col="spectrumid") # Close the connection conn.close() - return ms2deepscore_embeddings \ No newline at end of file + return ms2deepscore_embeddings + + def get_spec2vec_embeddings(self): + # Connect to the SQLite database + conn = sqlite3.connect(self.sqlite_file_name) + # Write an SQL query to select data from the table + query = "SELECT * FROM Spec2Vec_embeddings" + # Use the read_sql_query function to execute the query and read the results into a DataFrame + spec2vec_embeddings = pd.read_sql_query(query, conn, index_col="spectrumid") + # Close the connection + conn.close() + return spec2vec_embeddings \ No newline at end of file diff --git a/tests/test_library_files_creator.py b/tests/test_library_files_creator.py index ee38a3b7..3a1034b2 100644 --- a/tests/test_library_files_creator.py +++ b/tests/test_library_files_creator.py @@ -44,7 +44,9 @@ def test_create_s2v_embeddings(tmp_path, path_to_general_test_files, hundred_tes atol=1e-5) -def test_create_sqlite_file_with_embeddings(tmp_path, hundred_test_spectra, path_to_general_test_files, expected_ms2ds_embeddings): +def test_create_sqlite_file_with_embeddings(tmp_path, hundred_test_spectra, path_to_general_test_files, + expected_ms2ds_embeddings, + expected_s2v_embeddings): library_spectra = [normalize_and_filter_peaks(s) for s in hundred_test_spectra[:20] if s is not None] test_create_files = LibraryFilesCreator( library_spectra, @@ -58,12 +60,20 @@ def test_create_sqlite_file_with_embeddings(tmp_path, hundred_test_spectra, path test_create_files.create_sqlite_file() sqlite_library = SqliteLibrary(os.path.join(tmp_path, "ms2query_library.sqlite")) ms2deepscore_embeddings = sqlite_library.get_ms2deepscore_embeddings() + # set the columnn names to a range index instead of string, to match the stored test file. ms2deepscore_embeddings.columns = pd.RangeIndex(start=0, stop=len(ms2deepscore_embeddings.columns), step=1) - pd.testing.assert_frame_equal(ms2deepscore_embeddings, expected_ms2ds_embeddings.loc[:19], check_exact=False, atol=1e-5, check_names=False) + + spec2vec_embeddings = sqlite_library.get_spec2vec_embeddings() + spec2vec_embeddings.columns = pd.RangeIndex(start=0, stop=len(spec2vec_embeddings.columns), step=1) + pd.testing.assert_frame_equal(spec2vec_embeddings, + expected_s2v_embeddings.loc[:19], + check_exact=False, + atol=1e-5, + check_names=False) From dcdf8ff1c87b30af3811fbffd62266fee3916707 Mon Sep 17 00:00:00 2001 From: niekdejonge Date: Fri, 24 Nov 2023 10:48:24 +0100 Subject: [PATCH 07/19] UPdate ms2library to use new sqlite file --- .../train_ms2query_model.py | 5 +---- ms2query/ms2library.py | 19 +++--------------- .../benchmarking/benchmark_speed_ms2query.py | 14 ++++--------- tests/conftest.py | 9 +-------- .../100_test_spectra.sqlite | Bin 5 files changed, 9 insertions(+), 38 deletions(-) rename tests/test_files/{ => backwards_compatibility}/100_test_spectra.sqlite (100%) diff --git a/ms2query/create_new_library/train_ms2query_model.py b/ms2query/create_new_library/train_ms2query_model.py index db544388..7f776e1c 100644 --- a/ms2query/create_new_library/train_ms2query_model.py +++ b/ms2query/create_new_library/train_ms2query_model.py @@ -133,10 +133,7 @@ def train_ms2query_model(training_spectra, ms2library_for_training = MS2Library(sqlite_file_name=library_creator_for_training.sqlite_file_name, s2v_model_file_name=s2v_model_file_name, - ms2ds_model_file_name=ms2ds_model_file_name, - pickled_s2v_embeddings_file_name=library_creator_for_training.s2v_embeddings_file_name, - pickled_ms2ds_embeddings_file_name=library_creator_for_training.ms2ds_embeddings_file_name, - ms2query_model_file_name=None) + ms2ds_model_file_name=ms2ds_model_file_name, ms2query_model_file_name=None) # Create training data MS2Query model collector = DataCollectorForTraining(ms2library_for_training) training_scores, training_labels = collector.get_matches_info_and_tanimoto(query_spectra_for_training) diff --git a/ms2query/ms2library.py b/ms2query/ms2library.py index 38a58c99..c3c0dbc0 100644 --- a/ms2query/ms2library.py +++ b/ms2query/ms2library.py @@ -41,8 +41,6 @@ def __init__(self, sqlite_file_name: str, s2v_model_file_name: str, ms2ds_model_file_name: str, - pickled_s2v_embeddings_file_name: str, - pickled_ms2ds_embeddings_file_name: str, ms2query_model_file_name: Union[str, None]): """ Parameters @@ -57,12 +55,6 @@ def __init__(self, .trainables.syn1neg.npy and .wv.vectors.npy. ms2ds_model_file_name: File location of a trained ms2ds model. - pickled_s2v_embeddings_file_name: - File location of a pickled file with Spec2Vec embeddings in a - pd.Dataframe with as index the spectrum id. - pickled_ms2ds_embeddings_file_name: - File location of a pickled file with ms2ds embeddings in a - pd.Dataframe with as index the spectrum id. ms2query_model_file_name: File location of ms2query model with .hdf5 extension. """ @@ -71,18 +63,14 @@ def __init__(self, # Load models and set file locations assert os.path.isfile(sqlite_file_name), f"The given sqlite file does not exist: {sqlite_file_name}" self.sqlite_library = SqliteLibrary(sqlite_file_name) + self.s2v_embeddings = self.sqlite_library.get_spec2vec_embeddings() + self.ms2ds_embeddings = self.sqlite_library.get_ms2deepscore_embeddings() if ms2query_model_file_name is not None: self.ms2query_model = load_ms2query_model(ms2query_model_file_name) self.s2v_model = Word2Vec.load(s2v_model_file_name) self.ms2ds_model = load_ms2ds_model(ms2ds_model_file_name) - - # loads the library embeddings into memory - self.s2v_embeddings: pd.DataFrame = load_pickled_file( - pickled_s2v_embeddings_file_name) - self.ms2ds_embeddings: pd.DataFrame = load_pickled_file( - pickled_ms2ds_embeddings_file_name) assert self.ms2ds_model.base.output_shape[1] == self.ms2ds_embeddings.shape[1], \ "Dimension of pre-computed MS2DeepScore embeddings does not fit given model." @@ -453,5 +441,4 @@ def create_library_object_from_one_dir(directory_containing_library_and_models: else: dict_with_file_paths[key] = None return MS2Library(dict_with_file_paths["sqlite"], dict_with_file_paths["s2v_model"], - dict_with_file_paths["ms2ds_model"], dict_with_file_paths["s2v_embeddings"], - dict_with_file_paths["ms2ds_embeddings"], dict_with_file_paths["ms2query_model"]) + dict_with_file_paths["ms2ds_model"], dict_with_file_paths["ms2query_model"]) diff --git a/notebooks/GNPS_15_12_2021/benchmarking/benchmark_speed_ms2query.py b/notebooks/GNPS_15_12_2021/benchmarking/benchmark_speed_ms2query.py index 5f586d58..75dc44eb 100644 --- a/notebooks/GNPS_15_12_2021/benchmarking/benchmark_speed_ms2query.py +++ b/notebooks/GNPS_15_12_2021/benchmarking/benchmark_speed_ms2query.py @@ -17,16 +17,10 @@ ms2_spectra_directory = "C:/Users/jonge094/PycharmProjects/PhD_MS2Query/ms2query/data/libraries_and_models/gnps_15_12_2021/benchmarking/test_spectra" # Create a MS2Library object -ms2library = MS2Library( - sqlite_file_name=os.path.join(path_library, "library_GNPS_15_12_2021.sqlite"), - s2v_model_file_name=os.path.join(path_library, "spec2vec_model_GNPS_15_12_2021.model"), - ms2ds_model_file_name=os.path.join(path_library, "ms2ds_model_GNPS_15_12_2021.hdf5"), - pickled_s2v_embeddings_file_name=os.path.join(path_library, "library_GNPS_15_12_2021_s2v_embeddings.pickle"), - pickled_ms2ds_embeddings_file_name=os.path.join(path_library, "library_GNPS_15_12_2021_ms2ds_embeddings.pickle"), - ms2query_model_file_name=os.path.join(path_library, "ms2query_random_forest_model.pickle"), - # classifier_csv_file_name=os.path.join( - # path_root, "../data/libraries_and_models/gnps_09_04_2021/ALL_GNPS_210409_positive_processed_annotated_CF_NPC_classes.txt") -) +ms2library = MS2Library(sqlite_file_name=os.path.join(path_library, "library_GNPS_15_12_2021.sqlite"), + s2v_model_file_name=os.path.join(path_library, "spec2vec_model_GNPS_15_12_2021.model"), + ms2ds_model_file_name=os.path.join(path_library, "ms2ds_model_GNPS_15_12_2021.hdf5"), + ms2query_model_file_name=os.path.join(path_library, "ms2query_random_forest_model.pickle")) # Run library search and analog search on your files. run_complete_folder(ms2library, ms2_spectra_directory) diff --git a/tests/conftest.py b/tests/conftest.py index 6e492d7e..bd1981d6 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -31,19 +31,12 @@ def ms2library(path_to_general_test_files) -> MS2Library: spec2vec_model_file_loc = os.path.join( path_to_general_test_files, "100_test_spectra_s2v_model.model") - s2v_pickled_embeddings_file = os.path.join( - path_to_general_test_files, - "100_test_spectra_s2v_embeddings.pickle") ms2ds_model_file_name = os.path.join( path_to_general_test_files, "ms2ds_siamese_210301_5000_500_400.hdf5") - ms2ds_embeddings_file_name = os.path.join( - path_to_general_test_files, - "100_test_spectra_ms2ds_embeddings.pickle") ms2q_model_file_name = os.path.join(path_to_general_test_files, "test_ms2q_rf_model.onnx") - ms2library = MS2Library(sqlite_file_loc, spec2vec_model_file_loc, ms2ds_model_file_name, - s2v_pickled_embeddings_file, ms2ds_embeddings_file_name, ms2q_model_file_name) + ms2library = MS2Library(sqlite_file_loc, spec2vec_model_file_loc, ms2ds_model_file_name, ms2q_model_file_name) return ms2library diff --git a/tests/test_files/100_test_spectra.sqlite b/tests/test_files/backwards_compatibility/100_test_spectra.sqlite similarity index 100% rename from tests/test_files/100_test_spectra.sqlite rename to tests/test_files/backwards_compatibility/100_test_spectra.sqlite From 80652dbcb315e15264019fef7e97e8a968152a4e Mon Sep 17 00:00:00 2001 From: niekdejonge Date: Fri, 24 Nov 2023 10:56:52 +0100 Subject: [PATCH 08/19] Fix mistake in test --- tests/test_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_utils.py b/tests/test_utils.py index ca731519..cb9f9fbf 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -59,6 +59,6 @@ def check_correct_results_csv_file(dataframe_found: pd.DataFrame, def check_expected_headers(dataframe_found: pd.DataFrame, expected_headers: List[str]): found_headers = list(dataframe_found.columns) - assert len(found_headers) == len(found_headers) + assert len(found_headers) == len(expected_headers) for i, header in enumerate(expected_headers): assert header == found_headers[i] \ No newline at end of file From c2a6829afb00a80a4887cce27b8d33b14d891363 Mon Sep 17 00:00:00 2001 From: niekdejonge Date: Fri, 24 Nov 2023 18:20:43 +0100 Subject: [PATCH 09/19] Added missing compound classes again --- tests/test_files/100_test_spectra.sqlite | Bin 0 -> 389120 bytes .../100_test_spectra.sqlite | Bin 163840 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/test_files/100_test_spectra.sqlite delete mode 100644 tests/test_files/backwards_compatibility/100_test_spectra.sqlite diff --git a/tests/test_files/100_test_spectra.sqlite b/tests/test_files/100_test_spectra.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..20679bf6e8ebb156b561daf9fa942fa222d64058 GIT binary patch literal 389120 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

J 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 BD?$JO literal 0 HcmV?d00001 diff --git a/tests/test_files/backwards_compatibility/100_test_spectra.sqlite b/tests/test_files/backwards_compatibility/100_test_spectra.sqlite deleted file mode 100644 index 06d4e2d1832b162dd2d9bebef30c8b1e3137f790..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 163840 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%0Dvth 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 N9|MZJa~<;h^-~KQkwO3f From afdea16beee0fa67bb1298b5e6b4ceaceaa582df Mon Sep 17 00:00:00 2001 From: niekdejonge Date: Fri, 24 Nov 2023 18:29:22 +0100 Subject: [PATCH 10/19] Disable test_add_classifier_annotations.py since the classifier api is out --- tests/test_add_classifier_annotations.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/test_add_classifier_annotations.py b/tests/test_add_classifier_annotations.py index f6852cdf..c5898ab2 100644 --- a/tests/test_add_classifier_annotations.py +++ b/tests/test_add_classifier_annotations.py @@ -19,7 +19,7 @@ def spectra(): return [spectrum1, spectrum2] -def test_add_classifier_annotation(spectra): - result = select_compound_classes(spectra) - assert sorted(result) == [['WRIPSIKIDAUKBP', 'Organic compounds', 'Phenylpropanoids and polyketides', 'Macrolactams', '', 'Macrolactams', '', '', 'Alkaloids', 'False'], - ['WXDBUBIFYCCNLE', 'Organic compounds', 'Organoheterocyclic compounds', 'Oxepanes', '', 'Oxepanes', 'Lipopeptides', 'Oligopeptides', 'Amino acids and Peptides', 'False']] +# def test_add_classifier_annotation(spectra): +# result = select_compound_classes(spectra) +# assert sorted(result) == [['WRIPSIKIDAUKBP', 'Organic compounds', 'Phenylpropanoids and polyketides', 'Macrolactams', '', 'Macrolactams', '', '', 'Alkaloids', 'False'], +# ['WXDBUBIFYCCNLE', 'Organic compounds', 'Organoheterocyclic compounds', 'Oxepanes', '', 'Oxepanes', 'Lipopeptides', 'Oligopeptides', 'Amino acids and Peptides', 'False']] From f195e7f54b1d246957b4b39073d92ae68fc88873 Mon Sep 17 00:00:00 2001 From: niekdejonge Date: Fri, 24 Nov 2023 19:27:54 +0100 Subject: [PATCH 11/19] Fix issue with check_expected_headers in tests --- tests/test_ms2library.py | 35 ++++++++++++++++++++++------------- tests/test_run_ms2query.py | 34 +++++++++------------------------- tests/test_utils.py | 10 +++++----- 3 files changed, 36 insertions(+), 43 deletions(-) diff --git a/tests/test_ms2library.py b/tests/test_ms2library.py index e37674e0..4495a15a 100644 --- a/tests/test_ms2library.py +++ b/tests/test_ms2library.py @@ -4,7 +4,7 @@ import pandas as pd from ms2query.ms2library import MS2Library, create_library_object_from_one_dir from ms2query.utils import SettingsRunMS2Query, column_names_for_output -from tests.test_utils import check_correct_results_csv_file +from tests.test_utils import check_correct_results_csv_file, check_expected_headers def test_get_all_ms2ds_scores(ms2library, test_spectra): @@ -65,12 +65,15 @@ def test_analog_search_store_in_csv(ms2library, test_spectra, tmp_path): settings = SettingsRunMS2Query(additional_metadata_columns=(("spectrum_id", ))) ms2library.analog_search_store_in_csv(test_spectra, results_csv_file, settings) assert os.path.exists(results_csv_file) - expected_headers = \ - ['query_spectrum_nr', "ms2query_model_prediction", "precursor_mz_difference", "precursor_mz_query_spectrum", - "precursor_mz_analog", "inchikey", "analog_compound_name", "smiles", "spectrum_id"] - check_correct_results_csv_file( - pd.read_csv(results_csv_file), - expected_headers) + + results = pd.read_csv(results_csv_file) + check_expected_headers(results, + expected_headers= + ['query_spectrum_nr', 'ms2query_model_prediction', 'precursor_mz_difference', + 'precursor_mz_query_spectrum', 'precursor_mz_analog', 'inchikey', 'analog_compound_name', + 'smiles', 'spectrum_id', 'cf_kingdom', 'cf_superclass', 'cf_class', 'cf_subclass', + 'cf_direct_parent', 'npc_class_results', 'npc_superclass_results', 'npc_pathway_results']) + check_correct_results_csv_file(results) def test_create_library_object_from_one_dir(path_to_general_test_files): @@ -82,10 +85,15 @@ def test_create_library_object_from_one_dir(path_to_general_test_files): def test_analog_yield_df(ms2library, test_spectra, tmp_path): settings = SettingsRunMS2Query(additional_metadata_columns=("spectrum_id", ),) result = ms2library.analog_search_yield_df(test_spectra, settings) - expected_headers = \ - ['query_spectrum_nr', "ms2query_model_prediction", "precursor_mz_difference", "precursor_mz_query_spectrum", - "precursor_mz_analog", "inchikey", "analog_compound_name", "smiles", "spectrum_id"] - check_correct_results_csv_file(list(result)[0], expected_headers, nr_of_rows_to_check=1) + result = list(result)[0] + check_expected_headers(result, + expected_headers= + ['query_spectrum_nr', 'ms2query_model_prediction', 'precursor_mz_difference', + 'precursor_mz_query_spectrum', 'precursor_mz_analog', 'inchikey', 'analog_compound_name', + 'smiles', 'spectrum_id', 'cf_kingdom', 'cf_superclass', 'cf_class', 'cf_subclass', + 'cf_direct_parent', 'npc_class_results', 'npc_superclass_results', 'npc_pathway_results']) + + check_correct_results_csv_file(result, nr_of_rows_to_check=1) def test_analog_yield_df_additional_columns(ms2library, test_spectra, tmp_path): @@ -93,7 +101,8 @@ def test_analog_yield_df_additional_columns(ms2library, test_spectra, tmp_path): additional_ms2query_score_columns=("s2v_score", "ms2ds_score",),) result = ms2library.analog_search_yield_df(test_spectra, settings) result_first_spectrum = list(result)[0] + check_expected_headers(result_first_spectrum, + expected_headers=column_names_for_output(True, True, ("charge", "retention_time"), + ("s2v_score", "ms2ds_score",)),) check_correct_results_csv_file(result_first_spectrum, - column_names_for_output(True, True, ("charge", "retention_time"), - ("s2v_score", "ms2ds_score",)), nr_of_rows_to_check=1) diff --git a/tests/test_run_ms2query.py b/tests/test_run_ms2query.py index 3110bb4d..a1ea2c4e 100644 --- a/tests/test_run_ms2query.py +++ b/tests/test_run_ms2query.py @@ -8,7 +8,7 @@ zenodo_dois) from ms2query.utils import SettingsRunMS2Query from tests.test_ms2library import MS2Library -from tests.test_utils import check_correct_results_csv_file +from tests.test_utils import check_correct_results_csv_file, check_expected_headers if sys.version_info < (3, 8): @@ -67,24 +67,6 @@ def create_test_folder_with_spectra_files(path, spectra): def test_run_complete_folder(tmp_path, ms2library, test_spectra): folder_with_spectra = create_test_folder_with_spectra_files(tmp_path, test_spectra) results_directory = os.path.join(folder_with_spectra, "results") - - run_complete_folder(ms2library=ms2library, - folder_with_spectra=folder_with_spectra) - assert os.path.exists(results_directory), "Expected results directory to be created" - assert os.listdir(os.path.join(results_directory)).sort() == ['spectra_file_1.csv', 'spectra_file_2.csv'].sort() - - expected_headers = ['query_spectrum_nr', 'ms2query_model_prediction', 'precursor_mz_difference', - 'precursor_mz_query_spectrum', 'precursor_mz_analog', 'inchikey', - 'analog_compound_name', 'smiles', 'retention_time', 'retention_index'] - check_correct_results_csv_file(pd.read_csv(os.path.join(os.path.join(results_directory, 'spectra_file_1.csv'))), - expected_headers) - check_correct_results_csv_file(pd.read_csv(os.path.join(os.path.join(results_directory, 'spectra_file_2.csv'))), - expected_headers) - - -def test_run_complete_folder_with_classifiers(tmp_path, ms2library, test_spectra): - folder_with_spectra = create_test_folder_with_spectra_files(tmp_path, test_spectra) - results_directory = os.path.join(folder_with_spectra, "results") settings = SettingsRunMS2Query(minimal_ms2query_metascore=0, additional_metadata_columns=("charge",), additional_ms2query_score_columns=("s2v_score", "ms2ds_score")) @@ -101,9 +83,11 @@ def test_run_complete_folder_with_classifiers(tmp_path, ms2library, test_spectra "precursor_mz_analog", "inchikey", "analog_compound_name", "smiles", "charge", "s2v_score", "ms2ds_score", "cf_kingdom", "cf_superclass", "cf_class", "cf_subclass", "cf_direct_parent", "npc_class_results", "npc_superclass_results", "npc_pathway_results"] - check_correct_results_csv_file( - pd.read_csv(os.path.join(os.path.join(results_directory, 'spectra_file_1.csv'))), - expected_headers) - check_correct_results_csv_file( - pd.read_csv(os.path.join(os.path.join(results_directory, 'spectra_file_2.csv'))), - expected_headers) + + result_1 = pd.read_csv(os.path.join(os.path.join(results_directory, 'spectra_file_1.csv'))) + result_2 = pd.read_csv(os.path.join(os.path.join(results_directory, 'spectra_file_2.csv'))) + check_expected_headers(result_1, expected_headers) + check_expected_headers(result_2, expected_headers) + + check_correct_results_csv_file(result_1) + check_correct_results_csv_file(result_2) \ No newline at end of file diff --git a/tests/test_utils.py b/tests/test_utils.py index cb9f9fbf..a7a847ab 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -37,19 +37,17 @@ def test_add_unknown_charges_to_spectra(hundred_test_spectra): def check_correct_results_csv_file(dataframe_found: pd.DataFrame, - expected_headers: List[str], nr_of_rows_to_check=2): + """For the columns available check if they match the results""" # Define expected results csv_format_expected_results ="""query_spectrum_nr,ms2query_model_prediction,precursor_mz_difference,precursor_mz_query_spectrum,precursor_mz_analog,inchikey,spectrum_id,analog_compound_name,charge,s2v_score,ms2ds_score,retention_time,retention_index,smiles,cf_kingdom,cf_superclass,cf_class,cf_subclass,cf_direct_parent,npc_class_results,npc_superclass_results,npc_pathway_results\n 1,0.5645,33.2500,907.0000,940.2500,KNGPFNUOXXLKCN,CCMSLIB00000001760,Hoiamide B,1,0.9996,0.9232,,,CCC[C@@H](C)[C@@H]([C@H](C)[C@@H]1[C@H]([C@H](Cc2nc(cs2)C3=N[C@](CS3)(C4=N[C@](CS4)(C(=O)N[C@H]([C@H]([C@H](C(=O)O[C@H](C(=O)N[C@H](C(=O)O1)[C@@H](C)O)[C@@H](C)CC)C)O)[C@@H](C)CC)C)C)OC)C)O,b,c,d,e,f,g,h,i\n 2,0.4090,61.3670,928.0000,866.6330,GRJSOZDXIUZXEW,CCMSLIB00000001761,Halovir A,0,0.9621,0.4600,,,CCCCCCCCCCCCCC(=O)NC(C)(C)C(=O)N1C[C@H](O)C[C@H]1C(=O)NC(CC(C)C)C(=O)N[C@@H](C(C)C)C(=O)N[C@@H](CCC(N)=O)C(=O)N[C@H](CO)CC(C)C,b,c,d,e,f,g,h,i\n""" dataframe_expected_results = pd.read_csv(StringIO(csv_format_expected_results), sep=",", header=0) - # convert csv rows to dataframe - check_expected_headers(dataframe_found, expected_headers) - # Select only the matching columns selection_of_matching_headers = dataframe_expected_results[dataframe_found.columns] + pd.testing.assert_frame_equal(dataframe_found.iloc[:nr_of_rows_to_check, :], selection_of_matching_headers.iloc[:nr_of_rows_to_check, :], check_dtype=False, @@ -58,7 +56,9 @@ def check_correct_results_csv_file(dataframe_found: pd.DataFrame, def check_expected_headers(dataframe_found: pd.DataFrame, expected_headers: List[str]): + """Checks if the correct headers are found""" found_headers = list(dataframe_found.columns) assert len(found_headers) == len(expected_headers) + # check the order of the headers is the same. for i, header in enumerate(expected_headers): - assert header == found_headers[i] \ No newline at end of file + assert header == found_headers[i] From 9a7b270c04b7d4f9fff5d2a56a104b007b4d1c07 Mon Sep 17 00:00:00 2001 From: niekdejonge Date: Sun, 26 Nov 2023 17:11:54 +0100 Subject: [PATCH 12/19] Include convert_to_dataframe in select_compound_classes --- .../create_new_library/add_classifire_classifications.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ms2query/create_new_library/add_classifire_classifications.py b/ms2query/create_new_library/add_classifire_classifications.py index e28f3ef8..4453ff0c 100644 --- a/ms2query/create_new_library/add_classifire_classifications.py +++ b/ms2query/create_new_library/add_classifire_classifications.py @@ -127,10 +127,12 @@ def select_compound_classes(spectra): if npc_results is None: print(f"no npc annotation was found for inchikey {inchikey14}") inchikey_results_list[i] += ["", "", "", ""] - return inchikey_results_list + compound_classes_df = _convert_to_dataframe(inchikey_results_list) + assert compound_classes_df.index.name == "inchikey", "Expected a pandas dataframe with inchikey as index name" + return compound_classes_df -def convert_to_dataframe(inchikey_results_lists)->pd.DataFrame: +def _convert_to_dataframe(inchikey_results_lists)->pd.DataFrame: header_list = [ 'inchikey', 'cf_kingdom', 'cf_superclass', 'cf_class', 'cf_subclass', 'cf_direct_parent', From 546f2675f505d74527b5e4e6af25c9e69d109f20 Mon Sep 17 00:00:00 2001 From: niekdejonge Date: Sun, 26 Nov 2023 17:13:07 +0100 Subject: [PATCH 13/19] Add ms2deepscore model file name and spec2vec model file name to conftest --- tests/conftest.py | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index bd1981d6..ecd40d0f 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -23,20 +23,35 @@ def sqlite_library(path_to_general_test_files): @pytest.fixture(scope="package") -def ms2library(path_to_general_test_files) -> MS2Library: - """Returns file names of the files needed to create MS2Library object""" - sqlite_file_loc = os.path.join( +def ms2deepscore_model_file_name(path_to_general_test_files): + ms2ds_model_file_name = os.path.join( path_to_general_test_files, - "100_test_spectra.sqlite") + "ms2ds_siamese_210301_5000_500_400.hdf5") + return ms2ds_model_file_name + + +@pytest.fixture(scope="package") +def spec2vec_model_file_name(path_to_general_test_files): spec2vec_model_file_loc = os.path.join( path_to_general_test_files, "100_test_spectra_s2v_model.model") - ms2ds_model_file_name = os.path.join( + return spec2vec_model_file_loc + + +@pytest.fixture(scope="package") +def ms2library(path_to_general_test_files, + ms2deepscore_model_file_name, + spec2vec_model_file_name) -> MS2Library: + """Returns file names of the files needed to create MS2Library object""" + sqlite_file_loc = os.path.join( path_to_general_test_files, - "ms2ds_siamese_210301_5000_500_400.hdf5") + "100_test_spectra.sqlite") ms2q_model_file_name = os.path.join(path_to_general_test_files, "test_ms2q_rf_model.onnx") - ms2library = MS2Library(sqlite_file_loc, spec2vec_model_file_loc, ms2ds_model_file_name, ms2q_model_file_name) + ms2library = MS2Library(sqlite_file_loc, + spec2vec_model_file_name, + ms2deepscore_model_file_name, + ms2q_model_file_name) return ms2library From 95b9fdbd21b822f52f0e0ba9ab3166098feb3966 Mon Sep 17 00:00:00 2001 From: niekdejonge Date: Sun, 26 Nov 2023 17:16:23 +0100 Subject: [PATCH 14/19] Move make_sqlfile_wrapper to method of LibraryFilesCreator --- .../create_sqlite_database.py | 49 ----- .../library_files_creator.py | 205 +++++++++++------- ms2query/create_new_library/train_models.py | 5 +- .../train_ms2query_model.py | 15 +- tests/test_library_files_creator.py | 151 ++++++++----- tests/test_sqlite.py | 122 +---------- 6 files changed, 243 insertions(+), 304 deletions(-) diff --git a/ms2query/create_new_library/create_sqlite_database.py b/ms2query/create_new_library/create_sqlite_database.py index 33f40be6..80dc2b20 100644 --- a/ms2query/create_new_library/create_sqlite_database.py +++ b/ms2query/create_new_library/create_sqlite_database.py @@ -10,55 +10,6 @@ from tqdm import tqdm from ms2query.create_new_library.calculate_tanimoto_scores import \ calculate_highest_tanimoto_score -from ms2query.utils import return_non_existing_file_name - - -def make_sqlfile_wrapper(sqlite_file_name: str, - list_of_spectra: List[Spectrum], - ms2ds_embeddings: pd.DataFrame, - s2v_embeddings: pd.DataFrame, - columns_dict: Dict[str, str] = None, - compound_classes: pd.DataFrame = None, - progress_bars: bool = True, - ): - """Wrapper to create sqlite file containing spectrum information needed for MS2Query - - Args: - ------- - sqlite_file_name: - Name of sqlite_file that should be created, if it already exists the - tables are added. If the tables in this sqlite file already exist, they - will be overwritten. - list_of_spectra: - A list with spectrum objects - columns_dict: - Dictionary with as keys columns that need to be added in addition to - the default columns and as values the datatype. The defaults columns - are spectrum_id, peaks, intensities and metadata. The additional - columns should be the same names that are in the metadata dictionary, - since these values will be automatically added in the function - add_list_of_spectra_to_sqlite. - Default = None results in the default columns. - progress_bars: - If progress_bars is True progress bars will be shown for the different - parts of the progress. - """ - sqlite_file_name = return_non_existing_file_name(sqlite_file_name) - additional_inchikey_columns = [] - if compound_classes is not None: - additional_inchikey_columns = list(compound_classes.columns) - assert compound_classes.index.name == "inchikey", "Expected a pandas dataframe with inchikey as index name" - - initialize_tables(sqlite_file_name, additional_metadata_columns_dict=columns_dict, - additional_inchikey_columns=additional_inchikey_columns) - fill_spectrum_data_table(sqlite_file_name, list_of_spectra, progress_bar=progress_bars) - - fill_inchikeys_table(sqlite_file_name, list_of_spectra, - compound_classes=compound_classes, - progress_bars=progress_bars) - - add_dataframe_to_sqlite(sqlite_file_name, 'MS2Deepscore_embeddings', ms2ds_embeddings) - add_dataframe_to_sqlite(sqlite_file_name, 'Spec2Vec_embeddings', s2v_embeddings) def add_dataframe_to_sqlite(sqlite_file_name, diff --git a/ms2query/create_new_library/library_files_creator.py b/ms2query/create_new_library/library_files_creator.py index 9c5d55ed..48ac8c2e 100644 --- a/ms2query/create_new_library/library_files_creator.py +++ b/ms2query/create_new_library/library_files_creator.py @@ -5,21 +5,22 @@ import os from pathlib import Path -from typing import List, Union +from typing import List, Union, Dict import matchms.filtering as msfilters import numpy as np import pandas as pd from gensim.models import Word2Vec +from matchms import Spectrum from matchms.Spectrum import Spectrum from ms2deepscore import MS2DeepScore from ms2deepscore.models import load_model as load_ms2ds_model from spec2vec.vector_operations import calc_vector from tqdm import tqdm from ms2query.clean_and_filter_spectra import create_spectrum_documents -from ms2query.create_new_library.add_classifire_classifications import ( - convert_to_dataframe, select_compound_classes) -from ms2query.create_new_library.create_sqlite_database import \ - make_sqlfile_wrapper, add_dataframe_to_sqlite +from ms2query.create_new_library.add_classifire_classifications import select_compound_classes +from ms2query.create_new_library.create_sqlite_database import initialize_tables, fill_spectrum_data_table, \ + fill_inchikeys_table, add_dataframe_to_sqlite +from ms2query.utils import return_non_existing_file_name class LibraryFilesCreator: @@ -47,10 +48,10 @@ class LibraryFilesCreator: """ def __init__(self, library_spectra: List[Spectrum], - output_directory: Union[str, Path], + sqlite_file_name: Union[str, Path], s2v_model_file_name: str = None, ms2ds_model_file_name: str = None, - add_compound_classes: bool = True + compound_classes: Union[bool, pd.DataFrame, None] = True ): """Creates files needed to run queries on a library @@ -70,90 +71,134 @@ def __init__(self, File name of a ms2ds model """ # pylint: disable=too-many-arguments - self.progress_bars = True - self.output_directory = output_directory - if not os.path.exists(self.output_directory): - os.mkdir(self.output_directory) - self.sqlite_file_name = os.path.join(output_directory, "ms2query_library.sqlite") - # These checks are performed at the start, since the filtering of spectra can take long - self._check_for_existing_files() - # Load in spec2vec model - if s2v_model_file_name is None: - self.s2v_model = None + if os.path.exists(sqlite_file_name): + raise FileExistsError("The sqlite file already exists") else: - assert os.path.exists(s2v_model_file_name), "Spec2Vec model file does not exists" + self.sqlite_file_name = sqlite_file_name + + # Load in spec2vec model + if os.path.exists(s2v_model_file_name): self.s2v_model = Word2Vec.load(s2v_model_file_name) - # load in ms2ds model - if ms2ds_model_file_name is None: - self.ms2ds_model = None else: - assert os.path.exists(ms2ds_model_file_name), "MS2Deepscore model file does not exists" + raise FileNotFoundError("Spec2Vec model file does not exists") + # load in ms2ds model + if os.path.exists(ms2ds_model_file_name): self.ms2ds_model = load_ms2ds_model(ms2ds_model_file_name) + else: + raise FileNotFoundError("MS2Deepscore model file does not exists") # Initialise spectra self.list_of_spectra = library_spectra # Run default filters self.list_of_spectra = [msfilters.default_filters(s) for s in tqdm(self.list_of_spectra, desc="Applying default filters to spectra")] - self.add_compound_classes = add_compound_classes + self.compound_classes = self.add_compound_classes(compound_classes) + if self.compound_classes is not None: + self.additional_inchikey_columns = list(compound_classes.columns) + else: + self.additional_inchikey_columns = [] - def _check_for_existing_files(self): - assert not os.path.exists(self.sqlite_file_name), \ - f"The file {self.sqlite_file_name} already exists," \ - f" choose a different output_base_filename" + self.progress_bars = True + self.additional_metadata_columns = {"precursor_mz": "REAL"} - def create_sqlite_file(self): - if self.add_compound_classes: - compound_classes = select_compound_classes(self.list_of_spectra) - compound_classes_df = convert_to_dataframe(compound_classes) - else: - compound_classes_df = None - make_sqlfile_wrapper( - self.sqlite_file_name, - self.list_of_spectra, - self.create_ms2ds_embeddings(), - self.create_s2v_embeddings(), - columns_dict={"precursor_mz": "REAL"}, - compound_classes=compound_classes_df, - progress_bars=self.progress_bars, - ) - - def create_ms2ds_embeddings(self): - """Creates the ms2deepscore embeddings for all spectra - - A dataframe with as index randomly generated spectrum indexes and as columns the indexes - of the vector is converted to pickle. + def add_compound_classes(self, + compound_classes: Union[pd.DataFrame, bool, None]): + """Calculates compound classes if True, otherwise uses given compound_classes """ - assert self.ms2ds_model is not None, "No MS2deepscore model was provided" - ms2ds = MS2DeepScore(self.ms2ds_model, - progress_bar=self.progress_bars) - # Compute spectral embeddings - embeddings = ms2ds.calculate_vectors(self.list_of_spectra) - spectrum_ids = np.arange(0, len(self.list_of_spectra)) - all_embeddings_df = pd.DataFrame(embeddings, index=spectrum_ids) - return all_embeddings_df - - def create_s2v_embeddings(self): - """Creates and stored a dataframe with embeddings as pickled file - - A dataframe with as index randomly generated spectrum indexes and as columns the indexes - of the vector is converted to pickle. + if compound_classes is True: + compound_classes = select_compound_classes(self.list_of_spectra) + elif compound_classes is not None: + if not isinstance(compound_classes, pd.DataFrame): + raise ValueError("Expected a dataframe or True or None for compound classes") + if not compound_classes.index.name == "inchikey": + raise ValueError("Expected a pandas dataframe with inchikey as index name") + elif compound_classes is False or compound_classes is None: + compound_classes = None + return compound_classes + + def create_sqlite_file(self): + """Wrapper to create sqlite file containing spectrum information needed for MS2Query + + Args: + ------- + sqlite_file_name: + Name of sqlite_file that should be created, if it already exists the + tables are added. If the tables in this sqlite file already exist, they + will be overwritten. + list_of_spectra: + A list with spectrum objects + columns_dict: + Dictionary with as keys columns that need to be added in addition to + the default columns and as values the datatype. The defaults columns + are spectrum_id, peaks, intensities and metadata. The additional + columns should be the same names that are in the metadata dictionary, + since these values will be automatically added in the function + add_list_of_spectra_to_sqlite. + Default = None results in the default columns. + progress_bars: + If progress_bars is True progress bars will be shown for the different + parts of the progress. """ - assert self.s2v_model is not None, "No spec2vec model was specified" - # Convert Spectrum objects to SpectrumDocument - spectrum_documents = create_spectrum_documents( - self.list_of_spectra, - progress_bar=self.progress_bars) - embeddings_dict = {} - for spectrum_id, spectrum_document in tqdm(enumerate(spectrum_documents), - desc="Calculating embeddings", - disable=not self.progress_bars): - embedding = calc_vector(self.s2v_model, - spectrum_document, - allowed_missing_percentage=100) - embeddings_dict[spectrum_id] = embedding - - # Convert to pandas Dataframe - embeddings_dataframe = pd.DataFrame.from_dict(embeddings_dict, - orient="index") - return embeddings_dataframe \ No newline at end of file + if os.path.exists(self.sqlite_file_name): + raise FileExistsError("The sqlite file already exists") + initialize_tables(self.sqlite_file_name, + additional_metadata_columns_dict=self.additional_metadata_columns, + additional_inchikey_columns=self.additional_inchikey_columns) + fill_spectrum_data_table(self.sqlite_file_name, self.list_of_spectra, progress_bar=self.progress_bars) + + fill_inchikeys_table(self.sqlite_file_name, self.list_of_spectra, + compound_classes=self.compound_classes, + progress_bars=self.progress_bars) + + add_dataframe_to_sqlite(self.sqlite_file_name, + 'MS2Deepscore_embeddings', + create_ms2ds_embeddings(self.ms2ds_model, self.list_of_spectra, self.progress_bars), ) + add_dataframe_to_sqlite(self.sqlite_file_name, + 'Spec2Vec_embeddings', + create_s2v_embeddings(self.s2v_model, self.list_of_spectra, self.progress_bars)) + + +def create_ms2ds_embeddings(ms2ds_model, + list_of_spectra, + progress_bar=True): + """Creates the ms2deepscore embeddings for all spectra + + A dataframe with as index randomly generated spectrum indexes and as columns the indexes + of the vector is converted to pickle. + """ + assert ms2ds_model is not None, "No MS2deepscore model was provided" + ms2ds = MS2DeepScore(ms2ds_model, + progress_bar=progress_bar) + # Compute spectral embeddings + embeddings = ms2ds.calculate_vectors(list_of_spectra) + spectrum_ids = np.arange(0, len(list_of_spectra)) + all_embeddings_df = pd.DataFrame(embeddings, index=spectrum_ids) + return all_embeddings_df + + +def create_s2v_embeddings(s2v_model, + list_of_spectra, + progress_bar=True): + """Creates and stored a dataframe with embeddings as pickled file + + A dataframe with as index randomly generated spectrum indexes and as columns the indexes + of the vector is converted to pickle. + """ + assert s2v_model is not None, "No spec2vec model was specified" + # Convert Spectrum objects to SpectrumDocument + spectrum_documents = create_spectrum_documents( + list_of_spectra, + progress_bar=progress_bar) + embeddings_dict = {} + for spectrum_id, spectrum_document in tqdm(enumerate(spectrum_documents), + desc="Calculating embeddings", + disable=not progress_bar): + embedding = calc_vector(s2v_model, + spectrum_document, + allowed_missing_percentage=100) + embeddings_dict[spectrum_id] = embedding + + # Convert to pandas Dataframe + embeddings_dataframe = pd.DataFrame.from_dict(embeddings_dict, + orient="index") + return embeddings_dataframe diff --git a/ms2query/create_new_library/train_models.py b/ms2query/create_new_library/train_models.py index 052f5111..50f8a9a0 100644 --- a/ms2query/create_new_library/train_models.py +++ b/ms2query/create_new_library/train_models.py @@ -47,6 +47,7 @@ def train_all_models(annotated_training_spectra, spec2vec_model_file_name = os.path.join(output_folder, "spec2vec_model.model") ms2query_model_file_name = os.path.join(output_folder, "ms2query_model.onnx") ms2ds_history_figure_file_name = os.path.join(output_folder, "ms2deepscore_training_history.svg") + sqlite_model_file = os.path.join(output_folder, "ms2query_model.sqlite") # Train MS2Deepscore model train_ms2deepscore_wrapper(annotated_training_spectra, @@ -75,10 +76,10 @@ def train_all_models(annotated_training_spectra, # Create library with all training spectra library_files_creator = LibraryFilesCreator(annotated_training_spectra, - output_folder, + sqlite_model_file, spec2vec_model_file_name, ms2deepscore_model_file_name, - add_compound_classes=settings.add_compound_classes) + compound_classes=settings.add_compound_classes) library_files_creator.create_sqlite_file() diff --git a/ms2query/create_new_library/train_ms2query_model.py b/ms2query/create_new_library/train_ms2query_model.py index 7f776e1c..e2b632bb 100644 --- a/ms2query/create_new_library/train_ms2query_model.py +++ b/ms2query/create_new_library/train_ms2query_model.py @@ -116,6 +116,8 @@ def train_ms2query_model(training_spectra, ms2ds_model_file_name, s2v_model_file_name, fraction_for_training): + os.makedirs(library_files_folder, exist_ok=True) + # Select spectra belonging to a single InChIKey library_spectra, unique_inchikey_query_spectra = split_spectra_on_inchikeys(training_spectra, fraction_for_training) @@ -125,15 +127,18 @@ def train_ms2query_model(training_spectra, query_spectra_for_training = unique_inchikey_query_spectra + single_spectra_query_spectra # Create library files for training ms2query - library_creator_for_training = LibraryFilesCreator(library_spectra, output_directory=library_files_folder, - s2v_model_file_name=s2v_model_file_name, - ms2ds_model_file_name=ms2ds_model_file_name, - add_compound_classes=False) + library_creator_for_training = LibraryFilesCreator( + library_spectra, + sqlite_file_name=os.path.join(library_files_folder, "ms2query_library.sqlite"), + s2v_model_file_name=s2v_model_file_name, + ms2ds_model_file_name=ms2ds_model_file_name, + compound_classes=None) library_creator_for_training.create_sqlite_file() ms2library_for_training = MS2Library(sqlite_file_name=library_creator_for_training.sqlite_file_name, s2v_model_file_name=s2v_model_file_name, - ms2ds_model_file_name=ms2ds_model_file_name, ms2query_model_file_name=None) + ms2ds_model_file_name=ms2ds_model_file_name, + ms2query_model_file_name=None) # Create training data MS2Query model collector = DataCollectorForTraining(ms2library_for_training) training_scores, training_labels = collector.get_matches_info_and_tanimoto(query_spectra_for_training) diff --git a/tests/test_library_files_creator.py b/tests/test_library_files_creator.py index 3a1034b2..febe63b7 100644 --- a/tests/test_library_files_creator.py +++ b/tests/test_library_files_creator.py @@ -1,79 +1,132 @@ import os +import sqlite3 + +import numpy as np import pandas as pd import pytest -from ms2query.clean_and_filter_spectra import normalize_and_filter_peaks -from ms2query.create_new_library.library_files_creator import \ - LibraryFilesCreator -from ms2query.query_from_sqlite_database import SqliteLibrary +from gensim.models import Word2Vec +from ms2deepscore.models import load_model as load_ms2ds_model + +from ms2query.clean_and_filter_spectra import normalize_and_filter_peaks_multiple_spectra, normalize_and_filter_peaks +from ms2query.create_new_library.add_classifire_classifications import _convert_to_dataframe +from ms2query.create_new_library.library_files_creator import LibraryFilesCreator, create_ms2ds_embeddings, \ + create_s2v_embeddings + def test_give_already_used_file_name(tmp_path, path_to_general_test_files, hundred_test_spectra): already_existing_file = os.path.join(tmp_path, "ms2query_library.sqlite") with open(already_existing_file, "w") as file: file.write("test") - with pytest.raises(AssertionError): + with pytest.raises(FileExistsError): LibraryFilesCreator(hundred_test_spectra, tmp_path) def test_create_ms2ds_embeddings(tmp_path, path_to_general_test_files, hundred_test_spectra, - expected_ms2ds_embeddings): + expected_ms2ds_embeddings, + ms2deepscore_model_file_name): """Tests store_ms2ds_embeddings""" - base_file_name = os.path.join(tmp_path, '100_test_spectra') library_spectra = [normalize_and_filter_peaks(s) for s in hundred_test_spectra if s is not None] - test_create_files = LibraryFilesCreator(library_spectra, base_file_name, - ms2ds_model_file_name=os.path.join(path_to_general_test_files, - 'ms2ds_siamese_210301_5000_500_400.hdf5')) - embeddings = test_create_files.create_ms2ds_embeddings() + embeddings = create_ms2ds_embeddings(ms2ds_model=load_ms2ds_model(ms2deepscore_model_file_name), + list_of_spectra=library_spectra) pd.testing.assert_frame_equal(embeddings, expected_ms2ds_embeddings, check_exact=False, atol=1e-5) def test_create_s2v_embeddings(tmp_path, path_to_general_test_files, hundred_test_spectra, - expected_s2v_embeddings): + expected_s2v_embeddings, + spec2vec_model_file_name): """Tests store_ms2ds_embeddings""" - base_file_name = os.path.join(tmp_path, '100_test_spectra') library_spectra = [normalize_and_filter_peaks(s) for s in hundred_test_spectra if s is not None] - test_create_files = LibraryFilesCreator(library_spectra, base_file_name, - s2v_model_file_name=os.path.join(path_to_general_test_files, - "100_test_spectra_s2v_model.model")) - embeddings = test_create_files.create_s2v_embeddings() + + embeddings = create_s2v_embeddings(Word2Vec.load(spec2vec_model_file_name), library_spectra) pd.testing.assert_frame_equal(embeddings, expected_s2v_embeddings, check_exact=False, atol=1e-5) +def check_sqlite_files_are_equal(new_sqlite_file_name, reference_sqlite_file, check_metadata=True): + """Raises an error if the two sqlite files are not equal""" + # Test if file is made + assert os.path.isfile(new_sqlite_file_name), \ + "Expected a file to be created" + assert os.path.isfile(reference_sqlite_file), \ + "The reference file given does not exist" -def test_create_sqlite_file_with_embeddings(tmp_path, hundred_test_spectra, path_to_general_test_files, - expected_ms2ds_embeddings, - expected_s2v_embeddings): - library_spectra = [normalize_and_filter_peaks(s) for s in hundred_test_spectra[:20] if s is not None] - test_create_files = LibraryFilesCreator( - library_spectra, - output_directory=os.path.join(tmp_path), - add_compound_classes=False, - ms2ds_model_file_name=os.path.join(path_to_general_test_files, - 'ms2ds_siamese_210301_5000_500_400.hdf5'), - s2v_model_file_name=os.path.join(path_to_general_test_files, - "100_test_spectra_s2v_model.model") - ) - test_create_files.create_sqlite_file() - sqlite_library = SqliteLibrary(os.path.join(tmp_path, "ms2query_library.sqlite")) - ms2deepscore_embeddings = sqlite_library.get_ms2deepscore_embeddings() - # set the columnn names to a range index instead of string, to match the stored test file. - ms2deepscore_embeddings.columns = pd.RangeIndex(start=0, - stop=len(ms2deepscore_embeddings.columns), - step=1) - pd.testing.assert_frame_equal(ms2deepscore_embeddings, - expected_ms2ds_embeddings.loc[:19], - check_exact=False, - atol=1e-5, - check_names=False) + # Test if the file has the correct information + get_table_names = \ + "SELECT name FROM sqlite_master WHERE type='table' order by name" + conn1 = sqlite3.connect(new_sqlite_file_name) + cur1 = conn1.cursor() + table_names1 = cur1.execute(get_table_names).fetchall() - spec2vec_embeddings = sqlite_library.get_spec2vec_embeddings() - spec2vec_embeddings.columns = pd.RangeIndex(start=0, stop=len(spec2vec_embeddings.columns), step=1) - pd.testing.assert_frame_equal(spec2vec_embeddings, - expected_s2v_embeddings.loc[:19], - check_exact=False, - atol=1e-5, - check_names=False) + conn2 = sqlite3.connect(reference_sqlite_file) + cur2 = conn2.cursor() + table_names2 = cur2.execute(get_table_names).fetchall() + + assert table_names1 == table_names2, \ + "Different sqlite tables are created than expected" + + for table_nr, table_name1 in enumerate(table_names1): + table_name1 = table_name1[0] + # Get column names and settings like primary key etc. + table_info1 = cur1.execute( + f"PRAGMA table_info({table_name1});").fetchall() + table_info2 = cur2.execute( + f"PRAGMA table_info({table_name1});").fetchall() + assert table_info1 == table_info2, \ + f"Different column names or table settings " \ + f"were expected in table {table_name1}" + column_names = [column_info[1] for column_info in table_info1] + for column in column_names: + # Get all rows from both tables + rows_1 = cur1.execute(f"SELECT {column} FROM " + + table_name1).fetchall() + rows_2 = cur2.execute(f"SELECT {column} FROM " + + table_name1).fetchall() + error_msg = f"Different data was expected in column {column} " \ + f"in table {table_name1}. \n Expected {rows_2} \n got {rows_1}" + if column == "precursor_mz": + np.testing.assert_almost_equal(rows_1, + rows_2, + err_msg=error_msg, + verbose=True) + elif column == "metadata" and not check_metadata: + pass + else: + assert len(rows_1) == len(rows_2) + for i in range(len(rows_1)): + assert rows_1[i] == rows_2[i], f"Different data was expected in column {column} row {i}" \ + f"in table {table_name1}. \n Expected {rows_2[i]} \n got {rows_1[i]}" + conn1.close() + conn2.close() + + +def test_create_sqlite_file_with_embeddings(tmp_path, + hundred_test_spectra, + ms2deepscore_model_file_name, + spec2vec_model_file_name, + sqlite_library): + """Makes a temporary sqlite file and tests if it contains the correct info + """ + def generate_compound_classes(spectra): + inchikeys = {spectrum.get("inchikey")[:14] for spectrum in spectra} + inchikey_results_list = [] + for inchikey in inchikeys: + inchikey_results_list.append([inchikey, "b", "c", "d", "e", "f", "g", "h", "i", "j"]) + compound_class_df = _convert_to_dataframe(inchikey_results_list) + return compound_class_df + new_sqlite_file_name = os.path.join(tmp_path, + "test_spectra_database.sqlite") + + list_of_spectra = normalize_and_filter_peaks_multiple_spectra(hundred_test_spectra) + library_creator = \ + LibraryFilesCreator(library_spectra=list_of_spectra, + sqlite_file_name=new_sqlite_file_name, + s2v_model_file_name=spec2vec_model_file_name, + ms2ds_model_file_name=ms2deepscore_model_file_name, + compound_classes=generate_compound_classes(spectra=list_of_spectra)) + library_creator.create_sqlite_file() + + check_sqlite_files_are_equal(new_sqlite_file_name, sqlite_library.sqlite_file_name, check_metadata=False) diff --git a/tests/test_sqlite.py b/tests/test_sqlite.py index 3274dda7..504d0352 100644 --- a/tests/test_sqlite.py +++ b/tests/test_sqlite.py @@ -1,126 +1,10 @@ -"""Tests all sqlite related functions +"""Tests load from sqlite functions -These functions are creating a new sqlite file with spectra data and -tanimoto scores (create_sqlite_database.py) and functions to retrieve -information from the sqlite database. +These functions are functions to retrieve information from the sqlite database. """ -import os -import sqlite3 -import numpy as np import pandas as pd -from ms2query.clean_and_filter_spectra import \ - normalize_and_filter_peaks_multiple_spectra -from ms2query.create_new_library.add_classifire_classifications import \ - convert_to_dataframe -from ms2query.create_new_library.create_sqlite_database import \ - make_sqlfile_wrapper -from ms2query.utils import column_names_for_output, load_pickled_file - - -def check_sqlite_files_are_equal(new_sqlite_file_name, reference_sqlite_file, check_metadata=True): - """Raises an error if the two sqlite files are not equal""" - # Test if file is made - assert os.path.isfile(new_sqlite_file_name), \ - "Expected a file to be created" - assert os.path.isfile(reference_sqlite_file), \ - "The reference file given does not exist" - - # Test if the file has the correct information - get_table_names = \ - "SELECT name FROM sqlite_master WHERE type='table' order by name" - conn1 = sqlite3.connect(new_sqlite_file_name) - cur1 = conn1.cursor() - table_names1 = cur1.execute(get_table_names).fetchall() - - conn2 = sqlite3.connect(reference_sqlite_file) - cur2 = conn2.cursor() - table_names2 = cur2.execute(get_table_names).fetchall() - - assert table_names1 == table_names2, \ - "Different sqlite tables are created than expected" - - for table_nr, table_name1 in enumerate(table_names1): - table_name1 = table_name1[0] - # Get column names and settings like primary key etc. - table_info1 = cur1.execute( - f"PRAGMA table_info({table_name1});").fetchall() - table_info2 = cur2.execute( - f"PRAGMA table_info({table_name1});").fetchall() - assert table_info1 == table_info2, \ - f"Different column names or table settings " \ - f"were expected in table {table_name1}" - column_names = [column_info[1] for column_info in table_info1] - for column in column_names: - # Get all rows from both tables - rows_1 = cur1.execute(f"SELECT {column} FROM " + - table_name1).fetchall() - rows_2 = cur2.execute(f"SELECT {column} FROM " + - table_name1).fetchall() - error_msg = f"Different data was expected in column {column} " \ - f"in table {table_name1}. \n Expected {rows_2} \n got {rows_1}" - if column == "precursor_mz": - np.testing.assert_almost_equal(rows_1, - rows_2, - err_msg=error_msg, - verbose=True) - elif column == "metadata" and not check_metadata: - pass - else: - assert len(rows_1) == len(rows_2) - for i in range(len(rows_1)): - assert rows_1[i] == rows_2[i], f"Different data was expected in column {column} row {i}" \ - f"in table {table_name1}. \n Expected {rows_2[i]} \n got {rows_1[i]}" - conn1.close() - conn2.close() - - -def test_making_sqlite_file_without_classes(tmp_path, hundred_test_spectra, path_to_general_test_files): - """Makes a temporary sqlite file and tests if it contains the correct info - """ - # tmp_path is a fixture that makes sure a temporary file is created - new_sqlite_file_name = os.path.join(tmp_path, - "test_spectra_database.sqlite") - - reference_sqlite_file = os.path.join(path_to_general_test_files, - "backwards_compatibility", - "100_test_spectra_without_classes.sqlite") - - list_of_spectra = normalize_and_filter_peaks_multiple_spectra(hundred_test_spectra) - - # Create sqlite file, with 3 tables - make_sqlfile_wrapper(new_sqlite_file_name, - list_of_spectra, - columns_dict={"precursor_mz": "REAL"}) - check_sqlite_files_are_equal(new_sqlite_file_name, reference_sqlite_file, check_metadata=False) - - -def test_making_sqlite_file_with_compound_classes(tmp_path, path_to_general_test_files, hundred_test_spectra): - """Makes a temporary sqlite file and tests if it contains the correct info - """ - def generate_compound_classes(spectra): - inchikeys = {spectrum.get("inchikey")[:14] for spectrum in spectra} - inchikey_results_list = [] - for inchikey in inchikeys: - inchikey_results_list.append([inchikey, "b", "c", "d", "e", "f", "g", "h", "i", "j"]) - compound_class_df = convert_to_dataframe(inchikey_results_list) - return compound_class_df - # tmp_path is a fixture that makes sure a temporary file is created - new_sqlite_file_name = os.path.join(tmp_path, - "test_spectra_database.sqlite") - - reference_sqlite_file = os.path.join(path_to_general_test_files, - "100_test_spectra.sqlite") - - list_of_spectra = normalize_and_filter_peaks_multiple_spectra(hundred_test_spectra) - - # Create sqlite file, with 3 tables - make_sqlfile_wrapper(new_sqlite_file_name, - list_of_spectra, - columns_dict={"precursor_mz": "REAL"}, - compound_classes=generate_compound_classes(spectra=list_of_spectra)) - - check_sqlite_files_are_equal(new_sqlite_file_name, reference_sqlite_file, check_metadata=False) +from ms2query.utils import column_names_for_output def test_get_metadata_from_sqlite(sqlite_library): From 0cead597a13341445afb378665fa793cd56712e2 Mon Sep 17 00:00:00 2001 From: niekdejonge Date: Sun, 26 Nov 2023 17:25:16 +0100 Subject: [PATCH 15/19] Allow for compound classes = False --- ms2query/create_new_library/library_files_creator.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ms2query/create_new_library/library_files_creator.py b/ms2query/create_new_library/library_files_creator.py index 48ac8c2e..336f99f1 100644 --- a/ms2query/create_new_library/library_files_creator.py +++ b/ms2query/create_new_library/library_files_creator.py @@ -107,13 +107,13 @@ def add_compound_classes(self, """ if compound_classes is True: compound_classes = select_compound_classes(self.list_of_spectra) - elif compound_classes is not None: - if not isinstance(compound_classes, pd.DataFrame): - raise ValueError("Expected a dataframe or True or None for compound classes") + elif compound_classes is not None and isinstance(compound_classes, pd.DataFrame): if not compound_classes.index.name == "inchikey": raise ValueError("Expected a pandas dataframe with inchikey as index name") elif compound_classes is False or compound_classes is None: compound_classes = None + else: + raise ValueError("Expected a dataframe or True or None for compound classes") return compound_classes def create_sqlite_file(self): From 47ce4f5b49b290dace654ae171c98388b57d841d Mon Sep 17 00:00:00 2001 From: niekdejonge Date: Sun, 26 Nov 2023 17:26:02 +0100 Subject: [PATCH 16/19] isort --- ms2query/create_new_library/library_files_creator.py | 10 ++++++---- tests/test_library_files_creator.py | 12 ++++++------ tests/test_ms2library.py | 3 ++- tests/test_run_ms2query.py | 3 ++- 4 files changed, 16 insertions(+), 12 deletions(-) diff --git a/ms2query/create_new_library/library_files_creator.py b/ms2query/create_new_library/library_files_creator.py index 336f99f1..c2ebc4a9 100644 --- a/ms2query/create_new_library/library_files_creator.py +++ b/ms2query/create_new_library/library_files_creator.py @@ -5,7 +5,7 @@ import os from pathlib import Path -from typing import List, Union, Dict +from typing import Dict, List, Union import matchms.filtering as msfilters import numpy as np import pandas as pd @@ -17,9 +17,11 @@ from spec2vec.vector_operations import calc_vector from tqdm import tqdm from ms2query.clean_and_filter_spectra import create_spectrum_documents -from ms2query.create_new_library.add_classifire_classifications import select_compound_classes -from ms2query.create_new_library.create_sqlite_database import initialize_tables, fill_spectrum_data_table, \ - fill_inchikeys_table, add_dataframe_to_sqlite +from ms2query.create_new_library.add_classifire_classifications import \ + select_compound_classes +from ms2query.create_new_library.create_sqlite_database import ( + add_dataframe_to_sqlite, fill_inchikeys_table, fill_spectrum_data_table, + initialize_tables) from ms2query.utils import return_non_existing_file_name diff --git a/tests/test_library_files_creator.py b/tests/test_library_files_creator.py index febe63b7..34f74475 100644 --- a/tests/test_library_files_creator.py +++ b/tests/test_library_files_creator.py @@ -1,16 +1,16 @@ import os import sqlite3 - import numpy as np import pandas as pd import pytest from gensim.models import Word2Vec from ms2deepscore.models import load_model as load_ms2ds_model - -from ms2query.clean_and_filter_spectra import normalize_and_filter_peaks_multiple_spectra, normalize_and_filter_peaks -from ms2query.create_new_library.add_classifire_classifications import _convert_to_dataframe -from ms2query.create_new_library.library_files_creator import LibraryFilesCreator, create_ms2ds_embeddings, \ - create_s2v_embeddings +from ms2query.clean_and_filter_spectra import ( + normalize_and_filter_peaks, normalize_and_filter_peaks_multiple_spectra) +from ms2query.create_new_library.add_classifire_classifications import \ + _convert_to_dataframe +from ms2query.create_new_library.library_files_creator import ( + LibraryFilesCreator, create_ms2ds_embeddings, create_s2v_embeddings) def test_give_already_used_file_name(tmp_path, path_to_general_test_files, hundred_test_spectra): diff --git a/tests/test_ms2library.py b/tests/test_ms2library.py index 4495a15a..8054c359 100644 --- a/tests/test_ms2library.py +++ b/tests/test_ms2library.py @@ -4,7 +4,8 @@ import pandas as pd from ms2query.ms2library import MS2Library, create_library_object_from_one_dir from ms2query.utils import SettingsRunMS2Query, column_names_for_output -from tests.test_utils import check_correct_results_csv_file, check_expected_headers +from tests.test_utils import (check_correct_results_csv_file, + check_expected_headers) def test_get_all_ms2ds_scores(ms2library, test_spectra): diff --git a/tests/test_run_ms2query.py b/tests/test_run_ms2query.py index a1ea2c4e..59d261fc 100644 --- a/tests/test_run_ms2query.py +++ b/tests/test_run_ms2query.py @@ -8,7 +8,8 @@ zenodo_dois) from ms2query.utils import SettingsRunMS2Query from tests.test_ms2library import MS2Library -from tests.test_utils import check_correct_results_csv_file, check_expected_headers +from tests.test_utils import (check_correct_results_csv_file, + check_expected_headers) if sys.version_info < (3, 8): From 39f92735ada50e24626c9781167ab4f994b00b3a Mon Sep 17 00:00:00 2001 From: niekdejonge Date: Sun, 26 Nov 2023 17:29:37 +0100 Subject: [PATCH 17/19] prospector --- ms2query/create_new_library/library_files_creator.py | 7 ++----- ms2query/ms2library.py | 4 +--- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/ms2query/create_new_library/library_files_creator.py b/ms2query/create_new_library/library_files_creator.py index c2ebc4a9..64878c5f 100644 --- a/ms2query/create_new_library/library_files_creator.py +++ b/ms2query/create_new_library/library_files_creator.py @@ -5,12 +5,11 @@ import os from pathlib import Path -from typing import Dict, List, Union +from typing import List, Union import matchms.filtering as msfilters import numpy as np import pandas as pd from gensim.models import Word2Vec -from matchms import Spectrum from matchms.Spectrum import Spectrum from ms2deepscore import MS2DeepScore from ms2deepscore.models import load_model as load_ms2ds_model @@ -22,7 +21,6 @@ from ms2query.create_new_library.create_sqlite_database import ( add_dataframe_to_sqlite, fill_inchikeys_table, fill_spectrum_data_table, initialize_tables) -from ms2query.utils import return_non_existing_file_name class LibraryFilesCreator: @@ -75,8 +73,7 @@ def __init__(self, # pylint: disable=too-many-arguments if os.path.exists(sqlite_file_name): raise FileExistsError("The sqlite file already exists") - else: - self.sqlite_file_name = sqlite_file_name + self.sqlite_file_name = sqlite_file_name # Load in spec2vec model if os.path.exists(s2v_model_file_name): diff --git a/ms2query/ms2library.py b/ms2query/ms2library.py index c3c0dbc0..da726ad3 100644 --- a/ms2query/ms2library.py +++ b/ms2query/ms2library.py @@ -15,7 +15,7 @@ from ms2query.query_from_sqlite_database import SqliteLibrary from ms2query.results_table import ResultsTable from ms2query.utils import (SettingsRunMS2Query, column_names_for_output, - load_ms2query_model, load_pickled_file, + load_ms2query_model, predict_onnx_model, return_non_existing_file_name, select_files_in_directory) @@ -58,8 +58,6 @@ def __init__(self, ms2query_model_file_name: File location of ms2query model with .hdf5 extension. """ - # pylint: disable=too-many-arguments - # Load models and set file locations assert os.path.isfile(sqlite_file_name), f"The given sqlite file does not exist: {sqlite_file_name}" self.sqlite_library = SqliteLibrary(sqlite_file_name) From 9d1fd33118cba8f19209560e367caa607796056a Mon Sep 17 00:00:00 2001 From: niekdejonge Date: Sun, 26 Nov 2023 17:39:22 +0100 Subject: [PATCH 18/19] Remove pickled embeddings from tests and update select_files_for_ms2query --- ms2query/ms2library.py | 3 +-- tests/conftest.py | 16 ------------ .../100_test_spectra_ms2ds_embeddings.pickle | Bin 321514 -> 0 bytes .../100_test_spectra_s2v_embeddings.pickle | Bin 9500 -> 0 bytes tests/test_library_files_creator.py | 24 ------------------ 5 files changed, 1 insertion(+), 42 deletions(-) delete mode 100644 tests/test_files/100_test_spectra_ms2ds_embeddings.pickle delete mode 100644 tests/test_files/100_test_spectra_s2v_embeddings.pickle diff --git a/ms2query/ms2library.py b/ms2query/ms2library.py index da726ad3..9c5c7cc2 100644 --- a/ms2query/ms2library.py +++ b/ms2query/ms2library.py @@ -386,8 +386,7 @@ def select_files_for_ms2query(file_names: List[str], files_to_select=None): """Selects the files needed for MS2Library based on their file extensions. """ dict_with_file_extensions = \ {"sqlite": ".sqlite", "s2v_model": ".model", "ms2ds_model": ".hdf5", - "ms2query_model": ".onnx", "s2v_embeddings": "s2v_embeddings.pickle", - "ms2ds_embeddings": "ms2ds_embeddings.pickle"} + "ms2query_model": ".onnx"} if files_to_select is not None: dict_with_file_extensions = {key: value for key, value in dict_with_file_extensions.items() if key in files_to_select} diff --git a/tests/conftest.py b/tests/conftest.py index ecd40d0f..7cea3296 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -112,19 +112,3 @@ def hundred_test_spectra(path_to_general_test_files): def expected_tanimoto_scores_df(path_to_general_test_files): return pd.read_csv(os.path.join(path_to_general_test_files, "tanimoto_scores_100_test_spectra.csv"), index_col=0) - - -@pytest.fixture(scope="package") -def expected_ms2ds_embeddings(path_to_general_test_files): - expected_embeddings = load_pickled_file(os.path.join( - path_to_general_test_files, - "100_test_spectra_ms2ds_embeddings.pickle")) - return expected_embeddings - - -@pytest.fixture(scope="package") -def expected_s2v_embeddings(path_to_general_test_files): - expected_embeddings = load_pickled_file(os.path.join( - path_to_general_test_files, - "100_test_spectra_s2v_embeddings.pickle")) - return expected_embeddings diff --git a/tests/test_files/100_test_spectra_ms2ds_embeddings.pickle b/tests/test_files/100_test_spectra_ms2ds_embeddings.pickle deleted file mode 100644 index e712e5adb30e32737207d3d4fb3e34a7c9195c8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 321514 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 PlN@YFqn~6xryL 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%0D`Y;yvBYX4FIe0n3}|l>a=4!+VW! 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 aK(7Ys8Wq{4Z`W>-eTT%1A2PIC$^QrN$ARSl diff --git a/tests/test_files/100_test_spectra_s2v_embeddings.pickle b/tests/test_files/100_test_spectra_s2v_embeddings.pickle deleted file mode 100644 index 4ed6e822849d05384b7f989dd0fc10c0f64e4e19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9500 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 ZY*rd{A5mspRI(^K4jxY`&d7?k_&-lRF|Yst diff --git a/tests/test_library_files_creator.py b/tests/test_library_files_creator.py index 34f74475..bb50b390 100644 --- a/tests/test_library_files_creator.py +++ b/tests/test_library_files_creator.py @@ -22,30 +22,6 @@ def test_give_already_used_file_name(tmp_path, path_to_general_test_files, hundr LibraryFilesCreator(hundred_test_spectra, tmp_path) -def test_create_ms2ds_embeddings(tmp_path, path_to_general_test_files, - hundred_test_spectra, - expected_ms2ds_embeddings, - ms2deepscore_model_file_name): - """Tests store_ms2ds_embeddings""" - library_spectra = [normalize_and_filter_peaks(s) for s in hundred_test_spectra if s is not None] - embeddings = create_ms2ds_embeddings(ms2ds_model=load_ms2ds_model(ms2deepscore_model_file_name), - list_of_spectra=library_spectra) - pd.testing.assert_frame_equal(embeddings, expected_ms2ds_embeddings, - check_exact=False, - atol=1e-5) - - -def test_create_s2v_embeddings(tmp_path, path_to_general_test_files, hundred_test_spectra, - expected_s2v_embeddings, - spec2vec_model_file_name): - """Tests store_ms2ds_embeddings""" - library_spectra = [normalize_and_filter_peaks(s) for s in hundred_test_spectra if s is not None] - - embeddings = create_s2v_embeddings(Word2Vec.load(spec2vec_model_file_name), library_spectra) - pd.testing.assert_frame_equal(embeddings, expected_s2v_embeddings, - check_exact=False, - atol=1e-5) - def check_sqlite_files_are_equal(new_sqlite_file_name, reference_sqlite_file, check_metadata=True): """Raises an error if the two sqlite files are not equal""" # Test if file is made From 162d44004d87c5f0f2da14de6aa06e6cdf7241b7 Mon Sep 17 00:00:00 2001 From: niekdejonge Date: Sun, 26 Nov 2023 17:41:29 +0100 Subject: [PATCH 19/19] isort --- ms2query/ms2library.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ms2query/ms2library.py b/ms2query/ms2library.py index 9c5c7cc2..284535cf 100644 --- a/ms2query/ms2library.py +++ b/ms2query/ms2library.py @@ -15,8 +15,8 @@ from ms2query.query_from_sqlite_database import SqliteLibrary from ms2query.results_table import ResultsTable from ms2query.utils import (SettingsRunMS2Query, column_names_for_output, - load_ms2query_model, - predict_onnx_model, return_non_existing_file_name, + load_ms2query_model, predict_onnx_model, + return_non_existing_file_name, select_files_in_directory)