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)

png

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')

png

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')

png

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')

png

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')

png

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')

png

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')

png

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)

png

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()

png

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)

png

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

png