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