Snippets

Dénes Türei Collect MS2 fragmentation rules from the module `lipyd.ms2`

Created by Dénes Türei
#!/usr/bin/env python3

#
# Denes Turei (turei.denes@gmail.com) 2022
#

"""
Collect the MS2 identification rules from the module `lipyd.ms2`.
"""

import re
import docutils.core
from lipyd import ms2

REINDENT = re.compile(r'\n( {8}| {4})')
RECRLF = re.compile(r'[\r\n]{1,2}')
HEADER = [['Class', 'Ion mode', 'Subclass', 'Rules']]


def principle(docs: str) -> list[list[str, str]]:

    docs = REINDENT.sub(r'\n', docs)
    dtree = docutils.core.publish_doctree(docs)

    def _principle(dtree: docutils.nodes.document, section: str = ''):

        rules = []

        for elem, next_elem in zip(dtree, dtree[1:]):

            if elem.tagname == 'section':

                section = elem[0].astext()
                rules += _principle(elem, section = section)

            elif elem.astext().strip() == 'Principle:':

                rules.append([
                    section,
                    '; '.join(
                        f'{i + 1}) {RECRLF.sub(" ", li.astext())}'
                        for i, li in enumerate(next_elem)
                    )
                ])

        return rules

    return _principle(dtree)


def collect() -> list[list[str]]:

    ms2_rules = [
        name.split('_', maxsplit = 1) + rules
        for namespace in (ms2, ms2.Scan)
        for name, obj in namespace.__dict__.items()
        if obj.__doc__ and 'Principle' in obj.__doc__
        for rules in principle(obj.__doc__)
    ]

    return ms2_rules


def export(ms2_rules: list[list[str]], path: str = 'ms2_rules.csv'):

    with open(path, 'w') as fp:

        _ = fp.write('\n'.join('\t'.join(r) for r in HEADER + ms2_rules))


def main():

    ms2_rules = collect()
    export(ms2_rules)


if __name__ == '__main__':

    main()

Comments (0)

HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.