mass-fragmentation
Advanced tools
Comparing version
470
lib/index.js
@@ -7,3 +7,8 @@ 'use strict'; | ||
var openchemlibUtils = require('openchemlib-utils'); | ||
var OCL = require('openchemlib'); | ||
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } | ||
var OCL__default = /*#__PURE__*/_interopDefaultLegacy(OCL); | ||
/** | ||
@@ -330,2 +335,467 @@ * The function performs the fragmentation of all single linear bonds | ||
const cid = { | ||
positive: [ | ||
{ | ||
Label: 'Alpha cleavage', | ||
rxnCode: | ||
'gCa@@duPGtF@!fI@Gu` eM@bXzB#qbq a` qQp#!RtEJHC^h@GPhB !RGUi| !R@FN?Dquz_@', | ||
}, | ||
{ | ||
Label: 'Alpha cleavage', | ||
rxnCode: | ||
'gJPI@DBTijhCzB@!gK`I@DJTcj`OhH@#qbqh qfUH#!Rmwwp_[]|_g|]lcp !R?`BE@[_|b@H]vgp', | ||
}, | ||
{ | ||
Label: 'Alpha cleavage', | ||
rxnCode: | ||
'gJPa@eJSKTA}E@!eMH`eIxH eFHBLGtP#qbqh qbH qu#!Rw`BH?J_|bMt]|hH !Rwpq?Dquz?@ !R?`@]vgp', | ||
}, | ||
{ | ||
Label: 'Alpha cleavage', | ||
rxnCode: | ||
'gJQIL@`ReMS@_PP!eMH`eIxH eFB@HcA}D@#qbqh qJh Ql#!Rm?wpwXE?y{p]lmp !Rwxq?Dquz?@ !R@NL]vgp', | ||
}, | ||
{ | ||
Label: 'Alpha cleavage', | ||
rxnCode: | ||
'gJXA@IRij`OhH@!gKhAAirPFhB#qbuH qfjH#!RM{upoPD@Mwp]lgp !R@BL?x~WAwrp]Vgp', | ||
}, | ||
{ | ||
Label: 'Alpha cleavage', | ||
rxnCode: | ||
'gJYADEJSKTA}E`!eMH`eIxH eF`BLGtX#qbqh qbH qu#!RO`BH?C_|bGt]|hH !Rwtq?Dquz_@ !R?`@]vgp', | ||
}, | ||
{ | ||
Label: 'Alpha cleavage', | ||
rxnCode: | ||
'gC`AAJTu@P!eF@bXpP eF@HpP#qTq qa Q\\#!R@AM?DpAlGTJB !R@DQCrip !R_sL}Nmp', | ||
}, | ||
{ | ||
Label: 'Alpha cleavage', | ||
rxnCode: | ||
'gChA@IRfhCzC@!eF`BLD eF@bXpP#qbq Ql qQ#!R{|L@p~~lG[K| !R@DL]Vgp !R_xp]ngp', | ||
}, | ||
{ | ||
Label: 'Aromatic Indicutive Cleavage', | ||
rxnCode: | ||
'gC`AAJTu@]SP!eF@bXpP eF@HhP#qrL QX qq#!Rgzp@kI}cG]K| !R@BL]vgp !R@BL]~kp', | ||
}, | ||
{ | ||
Label: 'Benzyl carbocation Resonance', | ||
rxnCode: | ||
'gOpAGJUKutkPD!gOpAMJUNusMHD#qkOfP qi{tP#!Rm?w~@Hc}mpJw@ox@GWHB !R?`BH?[_}mpJw@k_}G]k|', | ||
}, | ||
{ | ||
Label: 'Benzyl carbocation Resonance', | ||
rxnCode: | ||
'gOpAMJUNusMHD!gOpAGJUKutkPD#qkyfP qkOfP#!Rb@Jw@oy?bOvH?_y?G_H| !Rb@K~_{\\BbOvH?_y?GXY|', | ||
}, | ||
{ | ||
Label: 'Benzyl carbocation Resonance', | ||
rxnCode: | ||
'gOpAMJUNusMHD!gOpAMJUKua@@D#qi{tP qkOfP#!R?`BH?[_}mpJw@k_}GWK| !Rm?w~@Hc}mpJw@ox@G]k|', | ||
}, | ||
{ | ||
Label: 'Carbon monoxide eliminations from cyclic carbonyls compounds', | ||
rxnCode: | ||
'gOp`@tfUkZj`H!gKQ@@eKcUPD eFHBND#q~QeX q\\jH q~#!RmpK~@K_}mpJw@k_}GUJB !RXFUSY?y?KF\\]Vmp !R_vp]^gp', | ||
}, | ||
{ | ||
Label: 'Dioxolane elimination (aromatic)', | ||
rxnCode: | ||
'detDB@iiRfUwJFZB@H@H!eFHBJD daDHB@RTfUVyiZPB#IaLhfGed Ql IZdDezP#!RXJhcFCx@NALlFC`Lp@[@FZJpGWK| !R@FL]vkp !R@CzbuzJppAg@Ac`LNAL]aop', | ||
}, | ||
{ | ||
Label: 'Displacement Reaction a.', | ||
rxnCode: | ||
'daxDB@XIRUUzj`CZNcGPpUqDX`d_{G@!gKQA@IReqjhB eFHBND#qbqkx q~Yh Qd#!R_g}~_?A}|Gsp?_A||Gt]Rap !R_g|_za~eTv\\]vcp !R@FL]Agp', | ||
}, | ||
{ | ||
Label: 'Displacement Reaction a.', | ||
rxnCode: | ||
'daxHbN@HzTiuZjl@vaHpdLE\\QFHIG~p`!gKPI@DBTi\\Zj@` eFHBND#q{ENT q~Yh Qd#!Rm?vH?[\\Bm?vw@ox@?`@]ThH !R?g|_Fa}eTv\\]vcp !R@AL]Agp', | ||
}, | ||
{ | ||
Label: 'Displacement Reaction a.', | ||
rxnCode: | ||
'dazHBF@IRUUzj`CZNcGPpUqDX`d_{G@!gKXA@IReqjhB eFHBND#q]|VH qOtP q]#!RO`@~@N\\Byswg@n\\}y?p]XbH !RcLbLipBe@Lh]Ngp !R_pp]~op', | ||
}, | ||
{ | ||
Label: 'Displacement Reaction b.', | ||
rxnCode: | ||
'gJXA@IRUjPH!eM@fXvB eF`BLGtP#qlVH qrH ql#!R@FL@[@CC@Fp]bgp !RGtL@PqwZO@ !R@DL]~gp', | ||
}, | ||
{ | ||
Label: 'Displacement Reaction b.', | ||
rxnCode: | ||
'gFpa@eJSJZuLA}E@!gBQA@IReZf@~`` eFHBND#qYuT quT qY#!RE?rQ@G\\M[xYsAAwR`` !R@Cx~Gsx_GUj| !R_pp]nop', | ||
}, | ||
{ | ||
Label: 'Displacement Reaction b.', | ||
rxnCode: | ||
'gFpa@eJSJZuRA|eE`!gCaA@IRUdCzB@ eFHBND#qYuT qre qY#!RM?sQ@D}MW|YKAAwb`` !R_rq?Dw|lGYk| !R_rp]~gp', | ||
}, | ||
{ | ||
Label: 'Displacement Reaction b.', | ||
rxnCode: | ||
'gFpa@eJSJZuTA|eE`!gJQA@IRUzPH fI@Gu`#qYuT qYlP Qp#!RM?sQ@D}MW|YKAAvR`` !R_`A~@M\\Buwt]fdH !RGWi|', | ||
}, | ||
{ | ||
Label: 'Displacement Reaction b.', | ||
rxnCode: | ||
'gFqIL@`ReLfts@_HQX@!gC`I@DBTeY@~`` eFHBND#qrlK quY Qd#!Rsg}_qdc}Stw}mquRw@ !R_rq?Dw|lGYk| !R_rp]~gp', | ||
}, | ||
{ | ||
Label: 'Displacement Reaction b.', | ||
rxnCode: | ||
'gFqIL@`ReLftt`_PP!gBPI@DBTiVi`OhH@ eFHBND#qrlK qqk Qd#!Rsg}_qdc}Stu}mqvrw@ !R@Gy~Owx?GUj| !R_rp]ngp', | ||
}, | ||
{ | ||
Label: 'Displacement Reaction b.', | ||
rxnCode: | ||
'gFqIL@`ReLftu@_HQX@!gJQA@IRUzPH fH`PA}X#qrlK qbKh Qp#!RSg}_Q`a}Sxu}mqtrw@ !Ro`B~@I_|e{t]fdH !RGWi|', | ||
}, | ||
{ | ||
Label: 'Displacement Reaction b.', | ||
rxnCode: | ||
'gFyADEJSJZuTA|ee`!gJQA@IRUzPH fJ@Gup#qYuT qYlP Qp#!R]?pq@B?MOrXkAAvR`` !R?`C~@K\\Bm?t]fdH !RG_i|', | ||
}, | ||
{ | ||
Label: 'Displacement Reaction b.', | ||
rxnCode: | ||
'gOpiEPDBTfVKZj`OdHl@!gGQIJ@`Rdj|tHgzV@ fI@Gu`#qbqkx qbOn qX#!RU?qQ@@~MGtXYGplDG^K| !Rog~~_{B}lCrpoQtzg@ !RGPY|', | ||
}, | ||
{ | ||
Label: 'Displacement Reaction b.', | ||
rxnCode: | ||
'gOqa@jIRYXmjj@~Pbp!gGPaAQJRksPb_iX@ fI@Gu`#qYuW` qYlV qx#!RU?qQ@@~MGtXYGplDG^K| !Rog~~_{B}lCrpoQtzg@ !RGPY|', | ||
}, | ||
{ | ||
Label: 'Grob-Wharton', | ||
rxnCode: | ||
'gNpaAQJSOMU@_HQX@!gCa@@duPGtD@ eMH`eIXOh`#qNWeX qNW qlX#!Rb@JH_Wx@b@I~@Ha}GWJB !Ru?sW_Wx@GYjB !R_rq?Dqwz_@', | ||
}, | ||
{ | ||
Label: 'Grob-Wharton', | ||
rxnCode: | ||
'gNxaLJIRU[jXCzZ@!eMH`eIxH eF`BJGtP eFHBND#q{iV` Qv qM q{#!Rm?vw?[\\|m?v~_{\\|GXJ\\ !R@Kx@oauZ_@ !R@BL]^gp !R_tp]Agp', | ||
}, | ||
{ | ||
Label: 'Inductive cleavage', | ||
rxnCode: | ||
'gChA@IRVhCTB!eF``fJD eF@Hp_za@#qbq Qd qq#!R@AL@[@@SGPi| !R@AL]Vgp !R@AL]^kp', | ||
}, | ||
{ | ||
Label: 'Inductive cleavages assisted by β-hydrogen removal', | ||
rxnCode: | ||
'daxHB@zTeVVjh@~ah@!gGQA@IRUVi@~`` eF@HhP#IaLJnXP qbqk IxP#!RtEsPO]A\\tCwPWCy?tCt]Bkp !R@DL@[@AC@Fp@Pquz_@ !R@DL]akp', | ||
}, | ||
{ | ||
Label: 'Inductive cleavages assisted by β-hydrogen removal', | ||
rxnCode: | ||
'gFqAAYRe|Zj`OiH@!gGQA@IRezY@~``#qbqk qbqk#!R_O@T~pAYDEKp@quJ_@ !R@Fq?[@@S_qM?[AwZ_@', | ||
}, | ||
{ | ||
Label: 'Ionization', | ||
rxnCode: 'eF`BLGtX!eF``fLGt\\#Qd Qd#!R@FL]Rgp !R@FL]vgp', | ||
}, | ||
{ | ||
Label: 'Ionization', | ||
rxnCode: 'eM`BN`~b@!eM``fN`~c@#Q[ Q[#!R@AM?DquRo@ !R@AM?Dqtzo@', | ||
}, | ||
{ | ||
Label: 'Ionization', | ||
rxnCode: 'gCh@AGj@`!gChA@Icu@_PP#qTq qTq#!RbOvw?_x@GYK| !RbOvw?_x@GWk|', | ||
}, | ||
{ | ||
Label: 'Ionization', | ||
rxnCode: | ||
'gCa@@dmPFtwhHcMCAlp!eMH`eIhOhp#Qv@ Qv#!R@AL@[@@SGSH| !R@Fp@Dqwz``', | ||
}, | ||
{ | ||
Label: 'Ionization', | ||
rxnCode: 'eFB@HcA}D@!eFB`HIcA}F@#QX QX#!R_vp]bgp !R_vp]vgp', | ||
}, | ||
{ | ||
Label: 'Ionization', | ||
rxnCode: 'eMB@HchH!eMB`HIchOh`#Q[ Q[#!R@AM?Dqtbo@ !R@AM?Dquz@`', | ||
}, | ||
{ | ||
Label: 'Ionization', | ||
rxnCode: 'eMHAIXMicLLG~r!eFH`fJGtP#QX QX#!R@AL@[AtbO@ !R@AL]nkp', | ||
}, | ||
{ | ||
Label: 'Ionization', | ||
rxnCode: 'eMHBN``!eMH`fN`~b@#Qg Qg#!R@FL?XqtJ_@ !R@FL?XqwZ_@', | ||
}, | ||
{ | ||
Label: 'Ionization', | ||
rxnCode: 'eFB@HcA}D@!eFB`HIcA}F@#QX QX#!R_vp]bgp !R_vp]vgp', | ||
}, | ||
{ | ||
Label: 'Ionization', | ||
rxnCode: 'eFHBLGtP!eFH`fLGtX#QX QX#!R@AL]Pmp !R@AL]^gp', | ||
}, | ||
{ | ||
Label: 'Ionization', | ||
rxnCode: 'eM`BN`~b@!eM``fN`~bOza@#Qg Qg#!R@Fq?[AuJ?@ !R@FM?Dqvz_@', | ||
}, | ||
{ | ||
Label: 'Oxonium Resonance', | ||
rxnCode: 'eFH`fJGtP!eFHbfLGtP#QX QX#!R@Fp]rgp !R@FL]Nkp', | ||
}, | ||
{ | ||
Label: 'Remote Hydrogen rearrangement', | ||
rxnCode: | ||
'gCa@@dmPGtD@!fI@Gu` eM@HvB#qbq a` qrH#!RuKWT|`AIw[I\\ !RGUi| !RTMq?[Ivz_@', | ||
}, | ||
{ | ||
Label: 'Remote Hydrogen rearrangement', | ||
rxnCode: | ||
'gCa@@eMPD!eFHBLGtP eF@HhP#qTq Q\\ qa#!R@NL?xpAlG_K\\ !R@FL]Ngp !R@FL]Akp', | ||
}, | ||
{ | ||
Label: 'Remote Hydrogen rearrangement', | ||
rxnCode: | ||
'dcN@B@J\\bRbRaWCUUUL@_ITC@!gFpAEJTjZuRA@ eM`AIhH eM@HvB#IO^adkBFU qb^i IO^ IeQ#!Rm?u~_?C}|Gq~_?A}|Gu~_?A||Gwp_Atr{@ !R_g~w_K_}mwvw_AvZo@ !R@Fp@XqtF_@ !ROvL@XquFo@', | ||
}, | ||
{ | ||
Label: 'Resonance', | ||
rxnCode: 'eMB`HIRVB!eMB`HiRZB#Qg Qg#!R@Fp@HquJ_@ !R@Fp@Hqtz?@', | ||
}, | ||
{ | ||
Label: 'Resonance', | ||
rxnCode: 'eM``eIXH!eM`beIhH#Qg Qg#!R@Fp@XquJ_@ !R@Fp@Xqtz?@', | ||
}, | ||
{ | ||
Label: 'Retro-Diels–Alder ', | ||
rxnCode: | ||
'daD@@DiURijj`B!gC`@Die@` gC`@DiZDC@#IZhILxP q]a ISND#!RmwvH__y??g~H_Xa}?g|]lnp !R@Fq?[@@SGWk| !Rb@K~_xc}GUj|', | ||
}, | ||
{ | ||
Label: 'Retro-Diels–Alder ', | ||
rxnCode: | ||
'daDH@@RfVijZj@H!gGQ@@dsMLA@ eF@HhP#IhfpXS` IhlEN qc#!RbGw~@H`B?g~H@ox@bGt]Bgp !RmpJw?_x@?g~w@atZ?@ !R@AL]~kp', | ||
}, | ||
{ | ||
Label: 'Retro-Diels–Alder ', | ||
rxnCode: | ||
'dclD@@QIeUeieujZij@H!eFHBJD deTH@@RUf\\YYif`aF#ItYyRkFMH IeP It^JlMd`#!R?g~H?[_}?g?~_{_}m?w~_xc}?g~w?QuRK@ !R_vp]~gp !RmpK~@K\\Bm?w~@Oy?m?rw@ox@G^hb', | ||
}, | ||
{ | ||
Label: 'Retro-Diels–Alder ', | ||
rxnCode: | ||
'dieH@DxLbbbQ[fjZ`B!gGY@BDeUYaLp eM`BM``#IgBRnaa IgDaa qMx#!RmpJw__x@mpK~_{\\B?`Bw@atb@` !Rb@JH@hc}b@K~@Atz`` !R_qL@DqtF_@', | ||
}, | ||
{ | ||
Label: 'Retro-Diels–Alder ', | ||
rxnCode: | ||
'dif@@@Ri^zZjfh@`!gGP@DjZY`H eM`BM``#IZhddp^ Ipdza IZI#!R?g~H@k\\BbGvH_X`B?g~H_Qurg@ !Rm?w~@Hc}mpK~_qvZo@ !R_qL@Dqwz_@', | ||
}, | ||
{ | ||
Label: 'Retro-Diels–Alder ', | ||
rxnCode: | ||
'dclDB@{iRYeevz]ZA`b@B!gGPa@QJRmsPbX gFp@DiTt@@B#IwbFleVPx IwaeS qb^i#!RbCvH?Ky_bCv~@H`}oe~H?Hc|oe~~@Aurw@ !RbKvHoX`Bo`BHoQtz_@ !Rog~wOK_}m?vwOAwzO@', | ||
}, | ||
{ | ||
Label: 'Retro-Diels–Alder ', | ||
rxnCode: | ||
'dmLDB@{irJJIQEneV`hB@B!eF@HhP didDB@hIRVY~G``@@`#IwlDdeZa` IFP IwlIEjF#!Rg`BH?H_|g`BHGYx@a?rH?Hc|bAt]\\bH !R_uP]Fop !RmuvwWYy?mrr`g[^]muvwKAtzg@', | ||
}, | ||
{ | ||
Label: 'Retro-Diels–Alder ', | ||
rxnCode: | ||
'fdeA`D@\\brTfYY_m]gIZ|EhJB@@h@@~aF@!didHB@BTfUvfZVV@OhB@ didD@@iIYgxUie`B#iup`jXdibCPcXKoI iSxKhvMHP IwbkEYH#!RbOrHW]x@bOs^[xc|w`BHWXa]w`C^[xc|ipK^@Mx@i?s^@AuRx` !Ri?rgW]x@i?rg?Mx@i?rg?Aujp` !RmsvwO]y?mqrPw[_]msvwGAwzG@', | ||
}, | ||
{ | ||
Label: 'Retro-heteroene (Claisen rearrangement)', | ||
rxnCode: | ||
'daxH@@Re^jf`B!daxH@@RUiZjPB#IphiFG` IrDZax`#!RbOrW?Hb}e{vH?Hb}o`@]|hH !R@BL@[@@c@FqlWrM_@BL]~cp', | ||
}, | ||
{ | ||
Label: 'Retro-heteroene (McLafferty-type rearrangement)', | ||
rxnCode: | ||
'daxH@@RUiZjPB!gJP@DjYdB eMHAIdOh`#IaLJfxP IJfxP Qg#!R@FL@[@Ac@FqlOvL?@FL]Bcp !R|Grw_Gy?|Ot]vkp !R@Fp@XqtF_@', | ||
}, | ||
{ | ||
Label: 'Tropylium rearragement', | ||
rxnCode: | ||
'gOpAMJUKua@@D!gOpAGJTju`@@D#qgVMX qYoTp#!Rg`BGgXb]a?rG?H^]GPhB !RN@swnix@C[AkCDJpGSkB', | ||
}, | ||
{ | ||
Label: 'Tropylium resonance', | ||
rxnCode: | ||
'gOpAGJTju`@@D!gOpAGJTju`@@D#IaLkit I{MbTh#!Rh@VUDFcl?H`N@HCfGXiB !R[X~@abJwFEL@F[y_GSi\\', | ||
}, | ||
{ | ||
Label: 'Tropylium resonance', | ||
rxnCode: | ||
'gOpAGJTju`@@D!gOpAGJTju`@@D#q]yfP qgSuH#!R[X?@qaJONGO@v_y?GWK\\ !RQps~_}?YQwMmc}?FG[i|', | ||
}, | ||
{ | ||
Label: 'Tropylium resonance', | ||
rxnCode: | ||
'gOpAGJTju`@@D!gOpAGJTju`@@D#qrLoX qMsW`#!RN@s_qox@[[AGCAJpGWKB !R[[C@vQJpN@s@qox@G_iB', | ||
}, | ||
{ | ||
Label: 'Tropylium resonance', | ||
rxnCode: | ||
'gOpAGJTju`@@D!gOpAGJTju`@@D#qMsW` q{eQp#!R[[C@vQJpN@s@qox@GPkB !Rw}dx\\vvO?g|Rct]sGP[\\', | ||
}, | ||
{ | ||
Label: 'Tropylium resonance', | ||
rxnCode: | ||
'gOpAGJTju`@@D!gOpAGJTju`@@D#q{eQp qTwKh#!Rw}dx\\vvO?g|Rct]sG]K\\ !R?`AG\\t\\Lw|[_vVvpGSiB', | ||
}, | ||
{ | ||
Label: 'Tropylium resonance', | ||
rxnCode: | ||
'gOpAGJTju`@@D!gOpAGJTju`@@D#qTwKh qqUcx#!R?`AG\\t\\Lw|[_vVvpG]JB !Rw|XxCFvp?`@RlD\\LG[kB', | ||
}, | ||
{ | ||
Label: 'Tropylium resonance ', | ||
rxnCode: | ||
'gOpAGJTju`@@D!gOpAGJTju`@@D#qgSuH qrLoX#!RQps~_}?YQwMmc}?FGUH| !RN@s_qox@[[AGCAJpGXXb', | ||
}, | ||
], | ||
negative: [], | ||
}; | ||
function applyFragmentationReactions( | ||
ionizedFragments, | ||
reactions, | ||
maxDepth, | ||
) { | ||
const fragmentationReactions = reactions.filter( | ||
(reaction) => reaction.Label !== 'Ionization', | ||
); | ||
for (let ionizedMolecule of ionizedFragments.products) { | ||
if (ionizedMolecule.children?.length > 0) { | ||
for (let child of ionizedMolecule.children) { | ||
applyFragmentationReactions(child, fragmentationReactions, maxDepth); | ||
} | ||
} else { | ||
let moleculeToFragment = OCL__default["default"].Molecule.fromIDCode(ionizedMolecule.idCode); | ||
let fragmentation = openchemlibUtils.applyReactions( | ||
[moleculeToFragment], | ||
fragmentationReactions, | ||
{ | ||
maxDepth, | ||
}, | ||
); | ||
ionizedMolecule.children = fragmentation; | ||
} | ||
} | ||
} | ||
function applyIonizationReactions(molecule, reactions, ionizationLevel) { | ||
const ionizationReaction = reactions.filter( | ||
(reaction) => reaction.Label === 'Ionization', | ||
); | ||
let ionization = openchemlibUtils.applyReactions([molecule], ionizationReaction, { | ||
maxDepth: 1, | ||
}); | ||
function ionize(reactant, ionizationReactions, currentIonizationLevel) { | ||
for (let product of reactant.products) { | ||
if (currentIonizationLevel < ionizationLevel) { | ||
let currentMolecule = OCL__default["default"].Molecule.fromIDCode(product.idCode); | ||
let ionizedFragments = openchemlibUtils.applyReactions( | ||
[currentMolecule], | ||
ionizationReactions, | ||
{ | ||
maxDepth: 1, | ||
}, | ||
); | ||
product.children = ionizedFragments; | ||
currentIonizationLevel = currentIonizationLevel + 1; | ||
if (product.children.length > 0) { | ||
for (let child of product.children) { | ||
ionize(child, ionizationReactions, currentIonizationLevel); | ||
} | ||
} | ||
} | ||
} | ||
} | ||
for (let ionizedFragment of ionization) { | ||
ionize(ionizedFragment, ionizationReaction, 1); | ||
} | ||
return ionization; | ||
} | ||
const masses = {}; | ||
function insertMfInfoFragments(fragmentation) { | ||
for (let fragment of fragmentation) { | ||
mfInfoFragments(fragment); | ||
} | ||
return { | ||
masses: Object.keys(masses).map(Number), | ||
tree: fragmentation, | ||
}; | ||
} | ||
function mfInfoFragments(reaction) { | ||
if (reaction?.reactant) { | ||
const reactantMF = new mfParser.MF(reaction.reactant.mf); | ||
reaction.reactant.monoisotopicMass = | ||
Math.round( | ||
(reactantMF.getInfo().observedMonoisotopicMass ?? | ||
reactantMF.getInfo().monoisotopicMass) * 10000, | ||
) / 10000; | ||
masses[reaction.reactant.monoisotopicMass] = true; | ||
} | ||
if (reaction?.products?.length > 0) { | ||
for (const product of reaction.products) { | ||
if (product.children?.length > 0) { | ||
for (const child of product.children) { | ||
mfInfoFragments(child); | ||
} | ||
} | ||
const productMF = new mfParser.MF(product.mf); | ||
product.monoisotopicMass = | ||
Math.round( | ||
(productMF.getInfo().observedMonoisotopicMass ?? | ||
productMF.getInfo().monoisotopicMass) * 10000, | ||
) / 10000; | ||
masses[product.monoisotopicMass] = true; | ||
} | ||
} | ||
} | ||
const databases = { | ||
cid, | ||
}; | ||
//ionizationLevel fix the maximum depth of the ionization reactions in the molecule | ||
function reactionFragmentation(molecule, options = {}) { | ||
let { | ||
database = 'cid', | ||
mode = 'positive', | ||
maxDepth = 0, | ||
ionizationLevel = 1, | ||
} = options; | ||
if (maxDepth === 0) { | ||
let mass = molecule.getMolecularFormula().absoluteWeight; | ||
maxDepth = Math.round(mass / 10); | ||
} | ||
const reactions = databases[database][mode]; | ||
let ionizedFragments = applyIonizationReactions( | ||
molecule, | ||
reactions, | ||
ionizationLevel, | ||
); | ||
for (let ionizedFragment of ionizedFragments) { | ||
applyFragmentationReactions(ionizedFragment, reactions, maxDepth); | ||
} | ||
let { masses, tree } = insertMfInfoFragments(ionizedFragments); | ||
return { | ||
masses, | ||
tree, | ||
}; | ||
} | ||
exports.fragment = fragment; | ||
exports.reactionFragmentation = reactionFragmentation; |
{ | ||
"name": "mass-fragmentation", | ||
"version": "0.3.0", | ||
"version": "0.4.0", | ||
"description": "Code to fragment molecules", | ||
@@ -29,3 +29,3 @@ "main": "lib/index.js", | ||
}, | ||
"gitHead": "2f92cd4423018e7dad9594565f1fae4557de0ca3" | ||
"gitHead": "bc42b1937c4d78b61bf0548c5bf1397ab52d645a" | ||
} |
export * from './fragment.js'; | ||
export * from './reactionFragmentation.js'; |
1054757
441.3%26
44.44%2962
47.14%