Compare two spectrum
import nomspectra.draw as draw
from nomspectra.spectrum import Spectrum
from nomspectra.spectra import SpectrumList
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
Load and plot
Load and assign spectrum. Than drop unassigned masses and normilize by sum of intensity
spec1 = Spectrum.read_csv("data/sample1.csv",
mapper = {"mw": "mass", "relativeAbundance": 'intensity'},
sep=',',
ignore_columns=["peakNo", "errorPPM",'formula', "DBE", "class", "z"],
)
spec1 = spec1.assign(brutto_dict={'C':(4,41),'H':(4,81),'O':(0,26),'N':(0,4)})
spec1 = spec1.drop_unassigned().normalize()
spec2 = Spectrum.read_csv("data/sample2.txt").assign(brutto_dict={'C':(4,41),'H':(4,81),'O':(0,26),'N':(0,4)})
spec2 = spec2.drop_unassigned().normalize()
Plot two spectra
fig, ax = plt.subplots(figsize=(4,4), dpi=75)
draw.spectrum(spec2, color='red', alpha=0.5, ax=ax)
draw.spectrum(spec1, color='blue', alpha=0.5, ax=ax)

calculate metrics and Van Krevelen diagram
spec1 = spec1.calc_all_metrics()
spec2 = spec2.calc_all_metrics()
fig, ax = plt.subplots(figsize=(14,4),ncols=3, dpi=75)
draw.vk(spec2, color='red', ax=ax[0], title='')
draw.vk(spec1, color='blue', ax=ax[1], title='')
draw.vk(spec2, color='red', ax=ax[2], title='')
draw.vk(spec1, color='blue', ax=ax[2], title='')
ax[0].set_title('spec2')
ax[1].set_title('spec1')
ax[2].set_title('spec2, spec1')
Text(0.5, 1.0, 'spec2, spec1')

Boolean operations
Calculate and draw sum of spectrum
spec3 = spec1 + spec2 #'spec1 | spec2' - same
fig, ax = plt.subplots(figsize=(14,4),ncols=3, dpi=75)
draw.vk(spec2, color='red', ax=ax[0], title='')
draw.vk(spec1, color='blue', ax=ax[1], title='')
draw.vk(spec3, color='green', ax=ax[2], title='')
ax[0].set_title('spec2')
ax[1].set_title('spec1')
ax[2].set_title('spec2 + spec1')
Text(0.5, 1.0, 'spec2 + spec1')

Calculate and draw substrate spec1 from spec2
spec3 = spec2 - spec1
fig, ax = plt.subplots(figsize=(14,4),ncols=3, dpi=75)
draw.vk(spec2, color='red', ax=ax[0], title='')
draw.vk(spec1, color='blue', ax=ax[1], title='')
draw.vk(spec3, color='green', ax=ax[2], title='')
ax[0].set_title('spec2')
ax[1].set_title('spec1')
ax[2].set_title('spec2 - spec1')
Text(0.5, 1.0, 'spec2 - spec1')

Also we can look for spec prepared by substraction by intensity
spec3 = spec2.intens_sub(spec1)
fig, ax = plt.subplots(figsize=(14,4),ncols=3, dpi=75)
draw.vk(spec2, color='red', ax=ax[0], title='')
draw.vk(spec1, color='blue', ax=ax[1], title='')
draw.vk(spec3, color='green', ax=ax[2], title='')
ax[0].set_title('spec2')
ax[1].set_title('spec1')
ax[2].set_title('spec2 - spec1')
Text(0.5, 1.0, 'spec2 - spec1')

Calculate and draw common of spec1 and spec2
spec3 = spec1 & spec2
fig, ax = plt.subplots(figsize=(14,4),ncols=3, dpi=75)
draw.vk(spec2, color='red', ax=ax[0], title='')
draw.vk(spec1, color='blue', ax=ax[1], title='')
draw.vk(spec3, color='green', ax=ax[2], title='')
ax[0].set_title('spec2')
ax[1].set_title('spec1')
ax[2].set_title('spec2 & spec1')
Text(0.5, 1.0, 'spec2 & spec1')

Calculate and draw symmetric difference of spec1 and spec2
spec3 = spec1 ^ spec2
fig, ax = plt.subplots(figsize=(14,4),ncols=3, dpi=75)
draw.vk(spec2, color='red', ax=ax[0], title='')
draw.vk(spec1, color='blue', ax=ax[1], title='')
draw.vk(spec3, color='green', ax=ax[2], title='')
ax[0].set_title('spec2')
ax[1].set_title('spec1')
ax[2].set_title('spec2 ^ spec1')
Text(0.5, 1.0, 'spec2 ^ spec1')

Simmilarity
Calculate simmilarity indexes. For now you can use common indexes - Cosine, Tanimoto and Jaccard
for index in ['cosine', 'tanimoto', 'jaccard']:
value = spec1.simmilarity(spec2, mode=index)
print(f'{index}: {round(value,3)} ')
cosine: 0.381
tanimoto: 0.233
jaccard: 0.362
You can plot venn diagram for two ore three spectrum
draw.venn(spec1, spec2)

Calculate metrics
Calculate molecular class zones and get density. For plot we can use SpectrumList class from nomspectra.spectra
specs = SpectrumList([spec1, spec2])
specs.draw_mol_density()

Calculate DBE vs nO
fig, ax = plt.subplots(figsize=(4,4), dpi=75)
spec1.get_dbe_vs_o(olim=(5,17), ax=ax, color='blue')
spec2.get_dbe_vs_o(olim=(5,17), ax=ax, color='red')
(0.7450505598639487, 2.425647197353448)

Also we can compare metrics
specs.get_mol_metrics()
| sample1 | sample2 | |
|---|---|---|
| AI | 0.009488 | -0.070687 |
| C | 24.073906 | 18.514470 |
| CAI | 12.290746 | 10.215714 |
| CRAM | 0.811543 | 0.689125 |
| DBE | 12.464717 | 8.424983 |
| DBE-O | 0.681662 | 0.206055 |
| DBE-OC | 0.024155 | 0.005604 |
| DBE_AI | 0.681557 | 0.126226 |
| H | 25.218483 | 22.258804 |
| H/C | 1.051983 | 1.201142 |
| N | 0.000105 | 0.079829 |
| NOSC | -0.065208 | -0.278672 |
| O | 11.783056 | 8.218927 |
| O/C | 0.493383 | 0.453804 |
| mass | 501.765864 | 376.178194 |
And van krevelen square density
fig, ax = plt.subplots(figsize=(11,4), ncols=2, dpi=75)
spec1.get_squares_vk(ax=ax[0], draw=True)
spec2.get_squares_vk(ax=ax[1], draw=True)
ax[0].set_title('spec1')
ax[1].set_title('spec2')
specs.get_square_vk()
| sample1 | sample2 | |
|---|---|---|
| 1 | 0.000029 | 0.000058 |
| 2 | 0.001932 | 0.001132 |
| 3 | 0.001253 | 0.013009 |
| 4 | 0.000423 | 0.010109 |
| 5 | 0.001258 | 0.034803 |
| 6 | 0.002057 | 0.003226 |
| 7 | 0.198128 | 0.053871 |
| 8 | 0.257610 | 0.383808 |
| 9 | 0.020047 | 0.117417 |
| 10 | 0.000127 | 0.003145 |
| 11 | 0.000901 | 0.011694 |
| 12 | 0.151511 | 0.110428 |
| 13 | 0.348971 | 0.193620 |
| 14 | 0.012930 | 0.028199 |
| 15 | 0.000270 | 0.000609 |
| 16 | 0.000034 | 0.002311 |
| 17 | 0.000561 | 0.016007 |
| 18 | 0.001676 | 0.013422 |
| 19 | 0.000056 | 0.001571 |
| 20 | 0.000225 | 0.001560 |
