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