From 54134e725afd93491dcc247487431fcc7a551994 Mon Sep 17 00:00:00 2001 From: Piotr Gawron <piotr.gawron@uni.lu> Date: Tue, 6 Feb 2018 13:42:56 +0100 Subject: [PATCH] full import/export of reaction kinetics --- .../model/sbml/SbmlElementParser.java | 7 +++++ .../converter/model/sbml/SbmlParser.java | 3 +- .../model/sbml/SbmlReactionExporter.java | 8 ----- .../model/sbml/SbmlReactionParser.java | 29 ++++++++++++++++++- 4 files changed, 36 insertions(+), 11 deletions(-) diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlElementParser.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlElementParser.java index 7cd9676e7a..c84692525e 100644 --- a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlElementParser.java +++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlElementParser.java @@ -40,10 +40,16 @@ public abstract class SbmlElementParser<T extends org.sbml.jsbml.Symbol> extends Map<String, Element> elementBySbmlId = new HashMap<>(); + Map<String, String> sbmlIdByElementId = new HashMap<>(); + public Element getAnyElementBySbmlElementId(String id) { return elementBySbmlId.get(id); } + public String getSbmlIdByElementId(String compartmentId) { + return sbmlIdByElementId.get(compartmentId); + } + protected List<Element> mergeLayout(List<? extends Element> elements, Layout sbmlLayout, Model sbmlModel) throws InvalidInputDataExecption { Set<String> used = new HashSet<>(); @@ -70,6 +76,7 @@ public abstract class SbmlElementParser<T extends org.sbml.jsbml.Symbol> extends result.add(elementWithLayout); elementBySbmlId.put(id, elementWithLayout); elementBySbmlId.put(elementWithLayout.getElementId(), elementWithLayout); + sbmlIdByElementId.put(elementWithLayout.getElementId(), id); } for (Element element : elements) { if (!used.contains(element.getElementId())) { diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlParser.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlParser.java index 07429d9d30..38045d6103 100644 --- a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlParser.java +++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlParser.java @@ -64,7 +64,7 @@ public class SbmlParser implements IConverter { SbmlCompartmentParser compartmentParser = new SbmlCompartmentParser(layout, model); SbmlSpeciesParser speciesParser = new SbmlSpeciesParser(layout, model); - SbmlReactionParser reactionParser = new SbmlReactionParser(layout, model, speciesParser); + SbmlReactionParser reactionParser = new SbmlReactionParser(layout, model, speciesParser, compartmentParser); SbmlUnitsParser unitParser = new SbmlUnitsParser(model); Set<MiriamData> annotations = compartmentParser.parseAnnotation(sbmlModel.getAnnotation()); @@ -226,7 +226,6 @@ public class SbmlParser implements IConverter { throws ConverterException, InconsistentModelException, IOException { File file = new File(filePath); String exportedString = toXml(model); - logger.debug(exportedString); FileWriter fileWriter = new FileWriter(file); fileWriter.write(exportedString); fileWriter.flush(); diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlReactionExporter.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlReactionExporter.java index 02ec6cbdf8..7f39759342 100644 --- a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlReactionExporter.java +++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlReactionExporter.java @@ -111,21 +111,13 @@ public class SbmlReactionExporter extends SbmlBioEntityExporter<Reaction, org.sb } else { sbmlId = compartmentExporter.sbmlElementByElementId.get(id).getId(); } - - logger.debug(id); - logger.debug(element.getElementId()); - logger.debug(speciesExporter); - logger.debug(speciesExporter.sbmlElementByElementId); - logger.debug(speciesExporter.sbmlElementByElementId.get(element.getElementId())); ciNode.setTextContent(sbmlId); } } String definition = super.nodeToString(node); definition = definition.replace(" xmlns=\"http://www.sbml.org/sbml/level2/version4\"", ""); definition = definition.replace("<math>", "<math xmlns=\"http://www.w3.org/1998/Math/MathML\">"); - logger.debug(definition); result.setMath(ASTNode.parseMathML(definition)); - logger.debug(result.getMathMLString()); return result; } catch (InvalidXmlSchemaException e) { throw new InconsistentModelException(e); diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlReactionParser.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlReactionParser.java index cceec32e95..acb2305454 100644 --- a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlReactionParser.java +++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlReactionParser.java @@ -60,12 +60,14 @@ public class SbmlReactionParser extends SbmlBioEntityParser { ElementUtils eu = new ElementUtils(); SbmlSpeciesParser speciesParser; + SbmlCompartmentParser compartmentParser; public SbmlReactionParser(Layout sbmlLayout, lcsb.mapviewer.model.map.model.Model minervaModel, - SbmlSpeciesParser speciesParser) { + SbmlSpeciesParser speciesParser, SbmlCompartmentParser compartmentParser) { this.layout = sbmlLayout; this.minervaModel = minervaModel; this.speciesParser = speciesParser; + this.compartmentParser = compartmentParser; } public List<Reaction> parseList(Model sbmlModel) throws InvalidInputDataExecption { @@ -184,6 +186,12 @@ public class SbmlReactionParser extends SbmlBioEntityParser { } } } + updateKinetics(reactionWithLayout, minervaElement.getElementId(), minervaNode.getElement().getElementId()); + if (minervaElement.getCompartment() != null) { + String newCompartmentId = minervaElement.getCompartment().getElementId(); + String oldCompartmentId = compartmentParser.getSbmlIdByElementId(newCompartmentId); + updateKinetics(reactionWithLayout, newCompartmentId, oldCompartmentId); + } minervaNode.setLine(line); minervaNode.setElement(minervaElement); if (nodeClass != minervaNode.getClass()) { @@ -246,6 +254,25 @@ public class SbmlReactionParser extends SbmlBioEntityParser { } } + private void updateKinetics(Reaction reactionWithLayout, String newElementId, String oldElementId) { + SbmlKinetics kinetics = reactionWithLayout.getKinetics(); + if (kinetics != null) { + String newDefinition = kinetics.getDefinition().replace(">" + oldElementId + "<", ">" + newElementId + "<"); + kinetics.setDefinition(newDefinition); + Element elementToRemove = null; + for (Element element : kinetics.getElements()) { + if (element.getElementId().equals(oldElementId)) { + elementToRemove = element; + } + } + if (elementToRemove != null) { + kinetics.removeElement(elementToRemove); + kinetics.addElement(minervaModel.getElementByElementId(newElementId)); + } + } + + } + protected Reaction parse(org.sbml.jsbml.Reaction sbmlReaction, Model sbmlModel) throws InvalidInputDataExecption { Reaction reaction = new StateTransitionReaction(); assignBioEntityData(sbmlReaction, reaction); -- GitLab