sonarcloud[bot]: Kudos, SonarCloud Quality Gate passed!

[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug.png' alt='Bug' width='16' height='16' />](https://sonarcloud.io/project/issues?id=matchms_matchms&pullRequest=79&resolved=false&types=BUG) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/issues?id=matchms_matchms&pullRequest=79&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=matchms_matchms&pullRequest=79&resolved=false&types=BUG)  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/vulnerability.png' alt='Vulnerability' width='16' height='16' />](https://sonarcloud.io/project/issues?id=matchms_matchms&pullRequest=79&resolved=false&types=VULNERABILITY) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/issues?id=matchms_matchms&pullRequest=79&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=matchms_matchms&pullRequest=79&resolved=false&types=VULNERABILITY) (and [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/security_hotspot.png' alt='Security Hotspot' width='16' height='16' />](https://sonarcloud.io/project/issues?id=matchms_matchms&pullRequest=79&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/issues?id=matchms_matchms&pullRequest=79&resolved=false&types=SECURITY_HOTSPOT) to review)  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/code_smell.png' alt='Code Smell' width='16' height='16' />](https://sonarcloud.io/project/issues?id=matchms_matchms&pullRequest=79&resolved=false&types=CODE_SMELL) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/issues?id=matchms_matchms&pullRequest=79&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonarcloud.io/project/issues?id=matchms_matchms&pullRequest=79&resolved=false&types=CODE_SMELL)

[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/NoCoverageInfo.png' alt='No Coverage information' width='16' height='16' />](https://sonarcloud.io/component_measures?id=matchms_matchms&pullRequest=79) No Coverage information  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/NoDuplicationInfo.png' alt='No Duplication information' width='16' height='16' />](https://sonarcloud.io/component_measures?id=matchms_matchms&pullRequest=79&metric=duplicated_lines_density&view=list) No Duplication information


diff --git a/CHANGELOG.md b/CHANGELOG.md
index 31a27315..79391e9d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 
 ## [Unreleased]
 
+### Added
+
+- Added similarity score based on comparing parent masses [#79](https://github.com/matchms/matchms/pull/79)
+
 ## [0.4.0] - 2020-06-11
 
 ### Added
diff --git a/matchms/similarity/ParentmassMatch.py b/matchms/similarity/ParentmassMatch.py
new file mode 100644
index 00000000..91ed0608
--- /dev/null
+++ b/matchms/similarity/ParentmassMatch.py
@@ -0,0 +1,21 @@
+from matchms.typing import SpectrumType
+
+
+class ParentmassMatch:
+    """Return True if spectrums match in parent mass (within tolerance), and False otherwise."""
+
+    def __init__(self, tolerance: float = 0.1):
+        """
+        Parameters:
+        ----------
+        tolerance
+            Specify tolerance below which two masses are counted as match.
+        """
+        self.tolerance = tolerance
+
+    def __call__(self, spectrum: SpectrumType, reference_spectrum: SpectrumType) -> bool:
+        """Compare parent masses"""
+        parentmass = spectrum.get("parent_mass")
+        parentmass_ref = reference_spectrum.get("parent_mass")
+        assert parentmass is not None and parentmass_ref is not None, "Missing parent mass."
+        return abs(parentmass-parentmass_ref) <= self.tolerance
diff --git a/matchms/similarity/ParentmassMatchParallel.py b/matchms/similarity/ParentmassMatchParallel.py
new file mode 100644
index 00000000..e51de2ee
--- /dev/null
+++ b/matchms/similarity/ParentmassMatchParallel.py
@@ -0,0 +1,42 @@
+from typing import List
+import numba
+import numpy
+from matchms.typing import SpectrumType
+
+
+class ParentmassMatchParallel:
+    """Return True if spectrums match in parent mass (within tolerance), and False otherwise."""
+
+    def __init__(self, tolerance: float = 0.1):
+        """
+        Parameters:
+        ----------
+        tolerance
+            Specify tolerance below which two masses are counted as match.
+        """
+        self.tolerance = tolerance
+
+    def __call__(self, reference_spectrums: List[SpectrumType],
+                 spectrums: List[SpectrumType]) -> numpy.ndarray:
+        """Compare parent masses between all reference_spectrums and spectrums."""
+        def collect_parentmasses(spectrums):
+            """Collect parentmasses."""
+            parentmasses = []
+            for spectrum in spectrums:
+                parentmass = spectrum.get("parent_mass")
+                assert parentmass is not None, "Missing parent mass."
+                parentmasses.append(parentmass)
+            return numpy.asarray(parentmasses)
+
+        parentmasses_ref = collect_parentmasses(reference_spectrums)
+        parentmasses_query = collect_parentmasses(spectrums)
+        return calculate_parentmass_scores(parentmasses_ref, parentmasses_query, self.tolerance)
+
+
+@numba.njit
+def calculate_parentmass_scores(parentmasses_ref, parentmasses_query, tolerance):
+    scores = numpy.zeros((len(parentmasses_ref), len(parentmasses_query)))
+    for i, parentmass_ref in enumerate(parentmasses_ref):
+        for j, parentmass_query in enumerate(parentmasses_query):
+            scores[i, j] = (abs(parentmass_ref-parentmass_query) <= tolerance)
+    return scores
diff --git a/matchms/similarity/__init__.py b/matchms/similarity/__init__.py
index 171aca27..d9117900 100644
--- a/matchms/similarity/__init__.py
+++ b/matchms/similarity/__init__.py
@@ -5,6 +5,8 @@ from .CosineHungarian import CosineHungarian
 from .FingerprintSimilarityParallel import FingerprintSimilarityParallel
 from .IntersectMz import IntersectMz
 from .ModifiedCosine import ModifiedCosine
+from .ParentmassMatch import ParentmassMatch
+from .ParentmassMatchParallel import ParentmassMatchParallel
 
 
 __all__ = [
@@ -14,4 +16,6 @@ __all__ = [
     "FingerprintSimilarityParallel",
     "IntersectMz",
     "ModifiedCosine",
+    "ParentmassMatch",
+    "ParentmassMatchParallel",
 ]

add equivalent filter of merge_ppm
https://github.com/matchms/matchms/blob/61602e744be587be98122d5964d5ed75cca2ecba/matchms/old/ms_functions.py#L74-L75
diff --git a/tests/test_ParentmassMatch.py b/tests/test_ParentmassMatch.py
new file mode 100644
index 00000000..03f11204
--- /dev/null
+++ b/tests/test_ParentmassMatch.py
@@ -0,0 +1,53 @@
+import numpy
+import pytest
+from matchms import Spectrum
+from matchms.similarity import ParentmassMatch
+
+
+def test_parentmass_match():
+    "Test with default tolerance."
+    spectrum_1 = Spectrum(mz=numpy.array([], dtype="float"),
+                          intensities=numpy.array([], dtype="float"),
+                          metadata={"parent_mass": 100.0})
+
+    spectrum_2 = Spectrum(mz=numpy.array([], dtype="float"),
+                          intensities=numpy.array([], dtype="float"),
+                          metadata={"parent_mass": 101.0})
+
+    similarity_score = ParentmassMatch()
+    score = similarity_score(spectrum_1, spectrum_2)
+    assert not score, "Expected different score."
+
+
+def test_parentmass_match_tolerance2():
+    "Test with tolerance > difference."
+    spectrum_1 = Spectrum(mz=numpy.array([], dtype="float"),
+                          intensities=numpy.array([], dtype="float"),
+                          metadata={"parent_mass": 100.0})
+
+    spectrum_2 = Spectrum(mz=numpy.array([], dtype="float"),
+                          intensities=numpy.array([], dtype="float"),
+                          metadata={"parent_mass": 101.0})
+
+    similarity_score = ParentmassMatch(tolerance=2.0)
+    score = similarity_score(spectrum_1, spectrum_2)
+    assert score, "Expected different score."
+
+
+def test_parentmass_match_missing_parentmass():
+    "Test with missing parentmass."
+    spectrum_1 = Spectrum(mz=numpy.array([], dtype="float"),
+                          intensities=numpy.array([], dtype="float"),
+                          metadata={"parent_mass": 100.0})
+
+    spectrum_2 = Spectrum(mz=numpy.array([], dtype="float"),
+                          intensities=numpy.array([], dtype="float"),
+                          metadata={})
+
+    similarity_score = ParentmassMatch(tolerance=2.0)
+
+    with pytest.raises(AssertionError) as msg:
+        _ = similarity_score(spectrum_1, spectrum_2)
+
+    expected_message_part = "Missing parent mass."
+    assert expected_message_part in str(msg.value), "Expected particular error message."
diff --git a/tests/test_ParentmassMatchParallel.py b/tests/test_ParentmassMatchParallel.py
new file mode 100644
index 00000000..3d66692b
--- /dev/null
+++ b/tests/test_ParentmassMatchParallel.py
@@ -0,0 +1,73 @@
+import numpy
+from matchms import Spectrum
+from matchms.similarity import ParentmassMatchParallel
+from matchms.similarity.ParentmassMatchParallel import \
+    calculate_parentmass_scores
+
+
+def test_parentmass_match():
+    "Test with default tolerance."
+    spectrum_1 = Spectrum(mz=numpy.array([], dtype="float"),
+                          intensities=numpy.array([], dtype="float"),
+                          metadata={"parent_mass": 100.0})
+
+    spectrum_2 = Spectrum(mz=numpy.array([], dtype="float"),
+                          intensities=numpy.array([], dtype="float"),
+                          metadata={"parent_mass": 101.0})
+
+    spectrum_a = Spectrum(mz=numpy.array([], dtype="float"),
+                          intensities=numpy.array([], dtype="float"),
+                          metadata={"parent_mass": 99.0})
+
+    spectrum_b = Spectrum(mz=numpy.array([], dtype="float"),
+                          intensities=numpy.array([], dtype="float"),
+                          metadata={"parent_mass": 98.0})
+
+    similarity_score = ParentmassMatchParallel()
+    scores = similarity_score([spectrum_1, spectrum_2], [spectrum_a, spectrum_b])
+    assert numpy.all(scores == numpy.array([[False, False],
+                                            [False, False]])), "Expected different scores."
+
+
+def test_parentmass_match_tolerance2():
+    """Test with tolerance=2."""
+    spectrum_1 = Spectrum(mz=numpy.array([], dtype="float"),
+                          intensities=numpy.array([], dtype="float"),
+                          metadata={"parent_mass": 100.0})
+
+    spectrum_2 = Spectrum(mz=numpy.array([], dtype="float"),
+                          intensities=numpy.array([], dtype="float"),
+                          metadata={"parent_mass": 101.0})
+
+    spectrum_a = Spectrum(mz=numpy.array([], dtype="float"),
+                          intensities=numpy.array([], dtype="float"),
+                          metadata={"parent_mass": 99.0})
+
+    spectrum_b = Spectrum(mz=numpy.array([], dtype="float"),
+                          intensities=numpy.array([], dtype="float"),
+                          metadata={"parent_mass": 98.0})
+
+    similarity_score = ParentmassMatchParallel(tolerance=2.0)
+    scores = similarity_score([spectrum_1, spectrum_2], [spectrum_a, spectrum_b])
+    assert numpy.all(scores == numpy.array([[True, True],
+                                            [True, False]])), "Expected different scores."
+
+
+def test_calculate_parentmass_scores_compiled():
+    """Test the underlying score function (numba compiled)."""
+    parentmasses_ref = numpy.asarray([101, 200, 300])
+    parentmasses_query = numpy.asarray([100, 301])
+    scores = calculate_parentmass_scores(parentmasses_ref, parentmasses_query, tolerance=2.0)
+    assert numpy.all(scores == numpy.array([[1., 0.],
+                                            [0., 0.],
+                                            [0., 1.]])), "Expected different scores."
+
+
+def test_calculate_parentmass_scores():
+    """Test the underlying score function (non-compiled)."""
+    parentmasses_ref = numpy.asarray([101, 200, 300])
+    parentmasses_query = numpy.asarray([100, 301])
+    scores = calculate_parentmass_scores.py_func(parentmasses_ref, parentmasses_query, tolerance=2.0)
+    assert numpy.all(scores == numpy.array([[True, False],
+                                            [False, False],
+                                            [False, True]])), "Expected different scores."

conda/environment.yml conda/environment-dev.yml
pip install -e .[dev]
parse_log_pytest
environment.yml
pytest
3.7
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
Bottleneck @ file:///home/conda/feedstock_root/build_artifacts/bottleneck_1656803757560/work
certifi @ file:///home/conda/feedstock_root/build_artifacts/certifi_1725278078093/work/certifi
cycler @ file:///home/conda/feedstock_root/build_artifacts/cycler_1635519461629/work
exceptiongroup==1.2.2
fonttools @ file:///home/conda/feedstock_root/build_artifacts/fonttools_1666389892786/work
gensim @ file:///home/conda/feedstock_root/build_artifacts/gensim_1653483196026/work
greenlet @ file:///home/conda/feedstock_root/build_artifacts/greenlet_1661444174803/work
importlib-metadata @ file:///home/conda/feedstock_root/build_artifacts/importlib-metadata_1653252814274/work
iniconfig==2.0.0
kiwisolver @ file:///home/conda/feedstock_root/build_artifacts/kiwisolver_1657953088445/work
llvmlite==0.39.1
lxml @ file:///home/conda/feedstock_root/build_artifacts/lxml_1656759367847/work
-e git+https://github.com/matchms/matchms.git@6f43c9bf199747d14cb35ab9b5d03e53ab19ba11#egg=matchms
matplotlib @ file:///home/conda/feedstock_root/build_artifacts/matplotlib-suite_1661439848456/work
numba @ file:///home/conda/feedstock_root/build_artifacts/numba_1665771418417/work
numexpr @ file:///home/conda/feedstock_root/build_artifacts/numexpr_1658076415990/work
numpy @ file:///home/conda/feedstock_root/build_artifacts/numpy_1649806299270/work
packaging @ file:///home/conda/feedstock_root/build_artifacts/packaging_1696202382185/work
pandas==1.3.5
Pillow @ file:///home/conda/feedstock_root/build_artifacts/pillow_1660385854171/work
pluggy==1.2.0
ply @ file:///home/conda/feedstock_root/build_artifacts/ply_1712242996588/work
pycairo==1.21.0
pyparsing @ file:///home/conda/feedstock_root/build_artifacts/pyparsing_1724616129934/work
PyQt5==5.15.7
PyQt5-sip==12.11.0
pyteomics==4.7.5
pytest==7.4.4
python-dateutil @ file:///home/conda/feedstock_root/build_artifacts/python-dateutil_1709299778482/work
pytz @ file:///home/conda/feedstock_root/build_artifacts/pytz_1726055524169/work
PyYAML @ file:///home/conda/feedstock_root/build_artifacts/pyyaml_1648757092905/work
reportlab==3.5.68
scipy @ file:///home/conda/feedstock_root/build_artifacts/scipy_1637806658031/work
sip @ file:///home/conda/feedstock_root/build_artifacts/sip_1665592359543/work
six @ file:///home/conda/feedstock_root/build_artifacts/six_1620240208055/work
smart_open @ file:///home/conda/feedstock_root/build_artifacts/smart_open_1728143129233/work/dist
SQLAlchemy @ file:///home/conda/feedstock_root/build_artifacts/sqlalchemy_1665944338818/work
toml @ file:///home/conda/feedstock_root/build_artifacts/toml_1604308577558/work
tomli==2.0.1
tornado @ file:///home/conda/feedstock_root/build_artifacts/tornado_1656937818679/work
typing_extensions @ file:///home/conda/feedstock_root/build_artifacts/typing_extensions_1688315532570/work
unicodedata2 @ file:///home/conda/feedstock_root/build_artifacts/unicodedata2_1649111917568/work
wrapt @ file:///home/conda/feedstock_root/build_artifacts/wrapt_1651495229974/work
zipp @ file:///home/conda/feedstock_root/build_artifacts/zipp_1677313463193/work

name: matchms
channels:
  - defaults
  - bioconda
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=conda_forge
  - _openmp_mutex=4.5=2_gnu
  - alsa-lib=1.2.8=h166bdaf_0
  - attr=2.5.1=h166bdaf_1
  - boost=1.78.0=py37h48bf904_0
  - boost-cpp=1.78.0=h5adbc97_2
  - bottleneck=1.3.5=py37hda87dfa_0
  - brotli=1.1.0=hb9d3cd8_2
  - brotli-bin=1.1.0=hb9d3cd8_2
  - bzip2=1.0.8=h4bc722e_7
  - ca-certificates=2025.1.31=hbcca054_0
  - cairo=1.16.0=ha61ee94_1012
  - certifi=2024.8.30=pyhd8ed1ab_0
  - cycler=0.11.0=pyhd8ed1ab_0
  - dbus=1.13.6=h5008d03_3
  - expat=2.6.4=h5888daf_0
  - fftw=3.3.10=nompi_hf1063bd_110
  - font-ttf-dejavu-sans-mono=2.37=hab24e00_0
  - font-ttf-inconsolata=3.000=h77eed37_0
  - font-ttf-source-code-pro=2.038=h77eed37_0
  - font-ttf-ubuntu=0.83=h77eed37_3
  - fontconfig=2.15.0=h7e30c49_1
  - fonts-conda-ecosystem=1=0
  - fonts-conda-forge=1=0
  - fonttools=4.38.0=py37h540881e_0
  - freetype=2.13.3=h48d6fc4_0
  - gensim=4.2.0=py37hfb7772e_0
  - gettext=0.23.1=h5888daf_0
  - gettext-tools=0.23.1=h5888daf_0
  - glib=2.84.0=h07242d1_0
  - glib-tools=2.84.0=h4833e2c_0
  - graphite2=1.3.13=h59595ed_1003
  - greenlet=1.1.3=py37hd23a5d3_0
  - gst-plugins-base=1.22.0=h4243ec0_2
  - gstreamer=1.22.0=h25f0c4b_2
  - gstreamer-orc=0.4.41=h17648ed_0
  - harfbuzz=6.0.0=h8e241bc_0
  - icu=70.1=h27087fc_0
  - importlib-metadata=4.11.4=py37h89c1867_0
  - jack=1.9.22=h11f4161_0
  - jpeg=9e=h0b41bf4_3
  - keyutils=1.6.1=h166bdaf_0
  - kiwisolver=1.4.4=py37h7cecad7_0
  - krb5=1.20.1=h81ceb04_0
  - lame=3.100=h166bdaf_1003
  - lcms2=2.14=h6ed2654_0
  - ld_impl_linux-64=2.43=h712a8e2_4
  - lerc=4.0.0=h27087fc_0
  - libasprintf=0.23.1=h8e693c7_0
  - libasprintf-devel=0.23.1=h8e693c7_0
  - libblas=3.9.0=20_linux64_openblas
  - libbrotlicommon=1.1.0=hb9d3cd8_2
  - libbrotlidec=1.1.0=hb9d3cd8_2
  - libbrotlienc=1.1.0=hb9d3cd8_2
  - libcap=2.67=he9d0100_0
  - libcblas=3.9.0=20_linux64_openblas
  - libclang=15.0.7=default_h127d8a8_5
  - libclang13=15.0.7=default_h5d6823c_5
  - libcups=2.3.3=h36d4200_3
  - libdb=6.2.32=h9c3ff4c_0
  - libdeflate=1.14=h166bdaf_0
  - libedit=3.1.20250104=pl5321h7949ede_0
  - libevent=2.1.10=h28343ad_4
  - libexpat=2.6.4=h5888daf_0
  - libffi=3.4.6=h2dba641_0
  - libflac=1.4.3=h59595ed_0
  - libgcc=14.2.0=h767d61c_2
  - libgcc-ng=14.2.0=h69a702a_2
  - libgcrypt=1.11.0=ha770c72_2
  - libgcrypt-devel=1.11.0=hb9d3cd8_2
  - libgcrypt-lib=1.11.0=hb9d3cd8_2
  - libgcrypt-tools=1.11.0=hb9d3cd8_2
  - libgettextpo=0.23.1=h5888daf_0
  - libgettextpo-devel=0.23.1=h5888daf_0
  - libgfortran=14.2.0=h69a702a_2
  - libgfortran-ng=14.2.0=h69a702a_2
  - libgfortran5=14.2.0=hf1ad2bd_2
  - libglib=2.84.0=h2ff4ddf_0
  - libgomp=14.2.0=h767d61c_2
  - libgpg-error=1.51=hbd13f7d_1
  - libiconv=1.18=h4ce23a2_1
  - liblapack=3.9.0=20_linux64_openblas
  - libllvm11=11.1.0=he0ac6c6_5
  - libllvm15=15.0.7=hadd5161_1
  - libltdl=2.4.3a=h5888daf_0
  - liblzma=5.6.4=hb9d3cd8_0
  - liblzma-devel=5.6.4=hb9d3cd8_0
  - libnsl=2.0.1=hd590300_0
  - libogg=1.3.5=h4ab18f5_0
  - libopenblas=0.3.25=pthreads_h413a1c8_0
  - libopus=1.3.1=h7f98852_1
  - libpng=1.6.47=h943b412_0
  - libpq=15.3=hbcd7760_1
  - libsndfile=1.2.2=hc60ed4a_1
  - libsqlite=3.49.1=hee588c1_2
  - libstdcxx=14.2.0=h8f9b012_2
  - libstdcxx-ng=14.2.0=h4852527_2
  - libsystemd0=253=h8c4010b_1
  - libtiff=4.4.0=h82bc61c_5
  - libtool=2.5.4=h5888daf_0
  - libudev1=253=h0b41bf4_1
  - libuuid=2.38.1=h0b41bf4_0
  - libvorbis=1.3.7=h9c3ff4c_0
  - libwebp-base=1.5.0=h851e524_0
  - libxcb=1.13=h7f98852_1004
  - libxkbcommon=1.5.0=h79f4944_1
  - libxml2=2.10.3=hca2bb57_4
  - libxslt=1.1.37=h873f0b0_0
  - libzlib=1.3.1=hb9d3cd8_2
  - llvmlite=0.39.1=py37h0761922_0
  - lxml=4.9.1=py37h540881e_0
  - lz4-c=1.9.4=hcb278e6_0
  - matplotlib=3.5.3=py37h89c1867_2
  - matplotlib-base=3.5.3=py37hf395dca_2
  - mpg123=1.32.9=hc50e24c_0
  - munkres=1.0.7=py_1
  - mysql-common=8.0.33=hf1915f5_6
  - mysql-libs=8.0.33=hca2cd23_6
  - ncurses=6.5=h2d0b736_3
  - nomkl=1.0=h5ca1d4c_0
  - nspr=4.36=h5888daf_0
  - nss=3.110=h159eef7_0
  - numba=0.56.3=py37hf081915_0
  - numexpr=2.8.3=py37h85a3170_100
  - numpy=1.21.6=py37h976b520_0
  - openjpeg=2.5.0=h7d73246_1
  - openssl=3.1.8=h7b32b05_0
  - packaging=23.2=pyhd8ed1ab_0
  - pandas=1.3.5=py37h8c16a72_0
  - pcre2=10.44=hba22ea6_2
  - pillow=9.2.0=py37h850a105_2
  - pip=24.0=pyhd8ed1ab_0
  - pixman=0.44.2=h29eaf8c_0
  - ply=3.11=pyhd8ed1ab_2
  - pthread-stubs=0.4=hb9d3cd8_1002
  - pulseaudio=16.1=hcb278e6_3
  - pulseaudio-client=16.1=h5195f5e_3
  - pulseaudio-daemon=16.1=ha8d29e2_3
  - pycairo=1.21.0=py37h0afab05_1
  - pyparsing=3.1.4=pyhd8ed1ab_0
  - pyqt=5.15.7=py37hf30b843_1
  - pyqt5-sip=12.11.0=py37hd23a5d3_1
  - pyteomics=4.7.5=pyh7e72e81_0
  - python=3.7.12=hf930737_100_cpython
  - python-dateutil=2.9.0=pyhd8ed1ab_0
  - python_abi=3.7=4_cp37m
  - pytz=2024.2=pyhd8ed1ab_0
  - pyyaml=6.0=py37h540881e_4
  - qt-main=5.15.8=h5d23da1_6
  - rdkit=2022.09.1=py37h97e29ec_1
  - readline=8.2=h8c095d6_2
  - reportlab=3.5.68=py37h69800bb_1
  - scipy=1.7.3=py37hf2a6cf1_0
  - setuptools=69.0.3=pyhd8ed1ab_0
  - sip=6.7.2=py37hd23a5d3_0
  - six=1.16.0=pyh6c4a22f_0
  - smart_open=7.0.5=pyhd8ed1ab_1
  - sqlalchemy=1.4.42=py37h540881e_0
  - sqlite=3.49.1=h9eae976_2
  - tk=8.6.13=noxft_h4845f30_101
  - toml=0.10.2=pyhd8ed1ab_0
  - tornado=6.2=py37h540881e_0
  - typing-extensions=4.7.1=hd8ed1ab_0
  - typing_extensions=4.7.1=pyha770c72_0
  - unicodedata2=14.0.0=py37h540881e_1
  - wheel=0.42.0=pyhd8ed1ab_0
  - wrapt=1.14.1=py37h540881e_0
  - xcb-util=0.4.0=h516909a_0
  - xcb-util-image=0.4.0=h166bdaf_0
  - xcb-util-keysyms=0.4.0=h516909a_0
  - xcb-util-renderutil=0.3.9=h166bdaf_0
  - xcb-util-wm=0.4.1=h516909a_0
  - xkeyboard-config=2.38=h0b41bf4_0
  - xorg-kbproto=1.0.7=hb9d3cd8_1003
  - xorg-libice=1.1.2=hb9d3cd8_0
  - xorg-libsm=1.2.6=he73a12e_0
  - xorg-libx11=1.8.4=h0b41bf4_0
  - xorg-libxau=1.0.12=hb9d3cd8_0
  - xorg-libxdmcp=1.1.5=hb9d3cd8_0
  - xorg-libxext=1.3.4=h0b41bf4_2
  - xorg-libxrender=0.9.10=h7f98852_1003
  - xorg-renderproto=0.11.1=hb9d3cd8_1003
  - xorg-xextproto=7.3.0=hb9d3cd8_1004
  - xorg-xproto=7.0.31=hb9d3cd8_1008
  - xz=5.6.4=hbcc6ac9_0
  - xz-gpl-tools=5.6.4=hbcc6ac9_0
  - xz-tools=5.6.4=hb9d3cd8_0
  - yaml=0.2.5=h7f98852_2
  - zipp=3.15.0=pyhd8ed1ab_0
  - zstd=1.5.7=hb8e6e7a_2
  - pip:
      - exceptiongroup==1.2.2
      - iniconfig==2.0.0
      - pluggy==1.2.0
      - pytest==7.4.4
      - tomli==2.0.1
prefix: /opt/conda/envs/matchms

tests/test_ParentmassMatch.py::test_parentmass_match tests/test_ParentmassMatch.py::test_parentmass_match_tolerance2 tests/test_ParentmassMatch.py::test_parentmass_match_missing_parentmass tests/test_ParentmassMatchParallel.py::test_parentmass_match tests/test_ParentmassMatchParallel.py::test_parentmass_match_tolerance2 tests/test_ParentmassMatchParallel.py::test_calculate_parentmass_scores_compiled tests/test_ParentmassMatchParallel.py::test_calculate_parentmass_scores
matchms/similarity/ParentmassMatchParallel.py matchms/similarity/__init__.py CHANGELOG.md matchms/similarity/ParentmassMatch.py
matchms/similarity/ParentmassMatchParallel.py matchms/similarity/__init__.py CHANGELOG.md matchms/similarity/ParentmassMatch.py