diff --git a/parsers/pom.xml b/parsers/pom.xml index 610f4010..cddc57a1 100644 --- a/parsers/pom.xml +++ b/parsers/pom.xml @@ -36,6 +36,7 @@ lipid-list.csv functional-groups.csv + trivial_mediators.csv **/*.g4 diff --git a/parsers/src/main/java/org/lifstools/jgoslin/domain/KnownFunctionalGroups.java b/parsers/src/main/java/org/lifstools/jgoslin/domain/KnownFunctionalGroups.java index 89665803..8906d5ca 100644 --- a/parsers/src/main/java/org/lifstools/jgoslin/domain/KnownFunctionalGroups.java +++ b/parsers/src/main/java/org/lifstools/jgoslin/domain/KnownFunctionalGroups.java @@ -33,11 +33,25 @@ public final class KnownFunctionalGroups extends HashMap { public static final int UNDEFINED_CLASS = 0; + private final HashMap> trivialMediators = new HashMap<>(); - private void loadData(List lines, SumFormulaParser sumFormulaParser) { + private void loadData(List lines, List linesTM, SumFormulaParser sumFormulaParser) { int lineCounter = 0; ArrayList< ArrayList> functional_data = new ArrayList<>(); HashSet functional_data_set = new HashSet<>(); + + for (String line : linesTM) { + if (line.isEmpty()) continue; + + ArrayList tokens = StringFunctions.splitString(line, '\t', '"', true); + if (tokens.size() != 2 || containsKey(tokens.get(0))) continue; + + ArrayList positions = new ArrayList<>(); + for (String pos : StringFunctions.splitString(tokens.get(1), ',', '"', true)){ + positions.add(Integer.parseInt(pos)); + } + trivialMediators.put(tokens.get(0), positions); + } for (String line : lines) { if (lineCounter++ == 0) { @@ -89,10 +103,18 @@ public KnownFunctionalGroups() { public KnownFunctionalGroups(List lines, SumFormulaParser sumFormulaParser) { super(); - loadData(lines, sumFormulaParser); + loadData(lines, StringFunctions.getResourceAsStringList(new ClassPathResource("trivial_mediators.csv")), sumFormulaParser); } public FunctionalGroup get(String s) { return super.get(s).copy(); } + + public HashMap> getTmDb() { + return trivialMediators; + } + + public ArrayList db(String s) { + return trivialMediators.get(s); + } } diff --git a/parsers/src/main/java/org/lifstools/jgoslin/parser/GoslinParserEventHandler.java b/parsers/src/main/java/org/lifstools/jgoslin/parser/GoslinParserEventHandler.java index 45b7e9ba..dd9b4a95 100644 --- a/parsers/src/main/java/org/lifstools/jgoslin/parser/GoslinParserEventHandler.java +++ b/parsers/src/main/java/org/lifstools/jgoslin/parser/GoslinParserEventHandler.java @@ -36,6 +36,7 @@ import static java.util.Map.entry; import java.util.TreeMap; import org.lifstools.jgoslin.domain.Element; +import static org.lifstools.jgoslin.parser.Parser.EOF_SIGN; /** * Event handler implementation for the {@link GoslinParser}. @@ -53,6 +54,7 @@ public class GoslinParserEventHandler extends LipidBaseParserEventHandler { private boolean mediatorSuffix; private Element heavyElement; private int heavyElementNumber; + private boolean trivialMediator; private final static Map MEDIATOR_FA = Map.of( "H", 17, "O", 18, "E", 20, "Do", 22); @@ -162,6 +164,7 @@ protected void resetParser(TreeNode node) { headgroupDecorators.clear(); heavyElement = Element.C; heavyElementNumber = 0; + trivialMediator = false; } private void setHeadGroupName(TreeNode node) { @@ -265,6 +268,19 @@ private void buildLipid(TreeNode node) { } Headgroup headgroup = prepareHeadgroupAndChecks(); + String lipidName = node.getText(); + if (lipidName.charAt(lipidName.length() - 1) == EOF_SIGN) lipidName = lipidName.substring(0, lipidName.length() - 1); + HashMap> trivialDb = knownFunctionalGroups.getTmDb(); + + if (trivialMediator && trivialDb.containsKey(lipidName)){ + ArrayList dbPos = trivialDb.get(lipidName); + faList.get(0).getDoubleBonds().setNumDoubleBonds(dbPos.size()); + Map doubleBondPositions = faList.get(0).getDoubleBonds().getDoubleBondPositions(); + doubleBondPositions.clear(); + + for (Integer p : dbPos) doubleBondPositions.put(p, ""); + level = LipidLevel.FULL_STRUCTURE; + } LipidAdduct lipid = new LipidAdduct(assembleLipid(headgroup), adduct); content = lipid; @@ -368,6 +384,7 @@ private void setMediatorTetranor(TreeNode node) { } private void setMediatorCarbon(TreeNode node) { + trivialMediator = true; currentFa.setNumCarbon(currentFa.getNumCarbon() + MEDIATOR_FA.get(node.getText())); } @@ -398,13 +415,13 @@ private void addMediatorFunction(TreeNode node) { if (mediatorFunctionPositions.size() > 0) { functionalGroup.setPosition(mediatorFunctionPositions.get(0)); } - } else if (mediatorFunction.equals("Hp")) { + } else if (mediatorFunction.toLowerCase().equals("hp")) { functionalGroup = knownFunctionalGroups.get("OOH"); fg = "OOH"; if (mediatorFunctionPositions.size() > 0) { functionalGroup.setPosition(mediatorFunctionPositions.get(0)); } - } else if (mediatorFunction.equals("E") || mediatorFunction.equals("Ep")) { + } else if (mediatorFunction.equals("E") || mediatorFunction.toLowerCase().equals("ep")) { functionalGroup = knownFunctionalGroups.get("Ep"); fg = "Ep"; if (mediatorFunctionPositions.size() > 0) {