Beispiel #1
0
    def parse(cls, string: str) -> Lipid:
        """
        Parse a string represntation of a lipid and create Lipid class.

        :param string: The input string.
        :return: An instance of Lipid
        """
        # TODO refactor, too much code repeated in the two if blocks

        # identify abbreviation type
        if '(' in string and ')' in string:
            string = string.strip()

            if not string.endswith(')'):
                raise TypeError(f"Cannot parse abbreviation {string}")

            lipid_class_name = string.split('(', 1)[0]
            # second part of split at first ( is residue string, add leading ( again!
            residue_string = '(' + string.split('(', 1)[1]

            lipidclass = LipidClass.parse(lipid_class_name)

            residuelist = ResidueList.parse(residue_string)

            lipid = cls(lipidclass, residuelist)
            lipid._input = string

            return lipid

        # CE 22:4;0
        elif ' ' in string:
            lipid_class_name, residue_string = string.split(' ', 1)

            lipidclass = LipidClass.parse(lipid_class_name)
            residuelist = ResidueList.parse(residue_string)

            lipid = cls(lipidclass, residuelist)
            lipid._input = string

            return lipid

        else:
            lipid = Lipid(LipidClass(string))
            lipid._input = string
            return lipid
def test_residuelist_parse():
    test_string = '18:1;0_19:1;0'

    residuelist = ResidueList.parse(test_string)

    assert len(residuelist) == 2

    assert residuelist[0].carbon_atoms == 18
    assert residuelist[0].double_bonds == 1
    assert residuelist[0].oxidation == 0

    assert residuelist[1].carbon_atoms == 19
    assert residuelist[1].double_bonds == 1
    assert residuelist[1].oxidation == 0

    test_string = '18:1_19:1'

    residuelist = ResidueList.parse(test_string)

    assert len(residuelist) == 2

    assert residuelist[0].carbon_atoms == 18
    assert residuelist[0].double_bonds == 1
    assert residuelist[0].oxidation == None

    assert residuelist[1].carbon_atoms == 19
    assert residuelist[1].double_bonds == 1
    assert residuelist[1].oxidation == None

    test_string = 'O-16:0;0/18:1;0'

    residuelist = ResidueList.parse(test_string)

    assert len(residuelist) == 2

    assert residuelist[0].carbon_atoms == 16
    assert residuelist[0].double_bonds == 0
    assert residuelist[0].oxidation == 0
    assert residuelist[0].modification.name == 'O-'

    assert residuelist[1].carbon_atoms == 18
    assert residuelist[1].double_bonds == 1
    assert residuelist[1].oxidation == 0