Source code for matchms.similarity.IntersectMz
import numpy as np
from matchms.typing import SpectrumType
from .BaseSimilarity import BaseSimilarity
[docs]class IntersectMz(BaseSimilarity):
"""Example score for illustrating how to build custom spectra similarity score.
IntersectMz will count all exact matches of peaks and divide it by all unique
peaks found in both spectrums.
Example of how matchms similarity functions can be used:
.. testcode::
import numpy as np
from matchms import Spectrum
from matchms.similarity import IntersectMz
spectrum_1 = Spectrum(mz=np.array([100, 150, 200.]),
intensities=np.array([0.7, 0.2, 0.1]))
spectrum_2 = Spectrum(mz=np.array([100, 140, 190.]),
intensities=np.array([0.4, 0.2, 0.1]))
# Construct a similarity function
similarity_measure = IntersectMz(scaling=1.0)
score = similarity_measure.pair(spectrum_1, spectrum_2)
print(f"IntersectMz score is {score:.2f}")
Should output
.. testoutput::
IntersectMz score is 0.20
"""
[docs] def __init__(self, scaling: float = 1.0):
"""Constructor. Here, function parameters are defined.
Parameters
----------
scaling
Scale scores to maximum possible score being 'scaling'.
"""
self.scaling = scaling
[docs] def pair(self, reference: SpectrumType, query: SpectrumType) -> float:
"""This will calculate the similarity score between two spectra."""
mz_ref = set(reference.peaks.mz)
mz_query = set(query.peaks.mz)
intersected = mz_query.intersection(mz_ref)
unioned = mz_query.union(mz_ref)
if len(unioned) == 0:
return 0
return np.float64(self.scaling * len(intersected) / len(unioned))