dennisegen / MOST

MOST - Metabolic Optimization and Simulation Tool
3 stars 4 forks source link

jsbml 0.8-b2 #16

Closed mentatpsi closed 11 years ago

mentatpsi commented 11 years ago

Hey guys, thought I'd bring this to your attention.

Most might support up to jsbml 0.8-b2, released about 2 months after the release of b1 (02-04-2011).

I haven't checked conclusively that it supports it entirely, but it seemed to load and simulate sbmls fine. It might have had issues loading csv metabolites and reactants however.

Most begins to lose support of the recent updates at around jsbml-0.8-r1 (released 12-12-2011). The newest version being jsbml-0.8 (released 08-24-2012). One thing rc1 and higher seem to no longer supports is:

But it didn't appear like our code uses it, we've imported it in GurobiSolver.java under Most.optimization.solvers, but it doesn't appear to be used.

I will list the error trace revealed on console in the comments for when it attempts to read in an sbml.

For the time being I'm going to focus on the writer, but the updates can be found here: http://sourceforge.net/projects/jsbml/files/jsbml/

mentatpsi commented 11 years ago

javax.xml.stream.XMLStreamException: Trying to write END_DOCUMENT when document has no root (ie. trying to output empty document). at com.ctc.wstx.sw.BaseStreamWriter.throwOutputError(BaseStreamWriter.java:1547) at com.ctc.wstx.sw.BaseStreamWriter.reportNwfStructure(BaseStreamWriter.java:1576) at com.ctc.wstx.sw.BaseStreamWriter._finishDocument(BaseStreamWriter.java:1402) at com.ctc.wstx.sw.BaseStreamWriter.close(BaseStreamWriter.java:264) at org.sbml.jsbml.xml.parsers.XMLNodeWriter.toXML(XMLNodeWriter.java:87) at org.sbml.jsbml.xml.XMLNode.toXMLString(XMLNode.java:609) at edu.rutgers.MOST.data.SBMLModelReader.load(SBMLModelReader.java:409) at edu.rutgers.MOST.presentation.GraphicalInterface$Task.doInBackground(GraphicalInterface.java:3612) at edu.rutgers.MOST.presentation.GraphicalInterface$Task.doInBackground(GraphicalInterface.java:1) at javax.swing.SwingWorker$1.call(Unknown Source) at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source) at java.util.concurrent.FutureTask.run(Unknown Source) at javax.swing.SwingWorker.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) java.lang.StringIndexOutOfBoundsException: String index out of range: -1 at java.lang.String.substring(Unknown Source) at edu.rutgers.MOST.data.SBMLModelReader.load(SBMLModelReader.java:424) at edu.rutgers.MOST.presentation.GraphicalInterface$Task.doInBackground(GraphicalInterface.java:3612) at edu.rutgers.MOST.presentation.GraphicalInterface$Task.doInBackground(GraphicalInterface.java:1) at javax.swing.SwingWorker$1.call(Unknown Source) at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source) at java.util.concurrent.FutureTask.run(Unknown Source) at javax.swing.SwingWorker.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source)

desmondlun commented 11 years ago

Hi Shay,

I had some (rare) time to do some coding this weekend, so I fixed this problem. Turns out it has to do with empty children of notes elements. Not sure why empty children show up (and why they are not more gracefully handled by toXMLString() than by throwing an exception), but I put in a simple check. You can pull from my fork to get the update.

I also noticed that the charge attribute (used in the iAF1260 model) has been deprecated. The best explanation I could find of this is at http://sbml.org/Software/libSBML/docs/java-api/org/sbml/libsbml/Species.html#getCharge(). This is probably something we should take into account in the SBML writer. Perhaps charge should be a notes element?

On Fri, Nov 30, 2012 at 5:56 PM, Shay Maor notifications@github.com wrote:

javax.xml.stream.XMLStreamException: Trying to write END_DOCUMENT when document has no root (ie. trying to output empty document). at com.ctc.wstx.sw.BaseStreamWriter.throwOutputError(BaseStreamWriter.java:1547) at com.ctc.wstx.sw.BaseStreamWriter.reportNwfStructure(BaseStreamWriter.java:1576) at com.ctc.wstx.sw.BaseStreamWriter._finishDocument(BaseStreamWriter.java:1402) at com.ctc.wstx.sw.BaseStreamWriter.close(BaseStreamWriter.java:264) at org.sbml.jsbml.xml.parsers.XMLNodeWriter.toXML(XMLNodeWriter.java:87) at org.sbml.jsbml.xml.XMLNode.toXMLString(XMLNode.java:609) at edu.rutgers.MOST.data.SBMLModelReader.load(SBMLModelReader.java:409) at edu.rutgers.MOST.presentation.GraphicalInterface$Task.doInBackground(GraphicalInterface.java:3612) at edu.rutgers.MOST.presentation.GraphicalInterface$Task.doInBackground(GraphicalInterface.java:1) at javax.swing.SwingWorker$1.call(Unknown Source) at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source) at java.util.concurrent.FutureTask.run(Unknown Source) at javax.swing.SwingWorker.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) java.lang.StringIndexOutOfBoundsException: String index out of range: -1 at java.lang.String.substring(Unknown Source) at edu.rutgers.MOST.data.SBMLModelReader.load(SBMLModelReader.java:424) at edu.rutgers.MOST.presentation.GraphicalInterface$Task.doInBackground(GraphicalInterface.java:3612) at edu.rutgers.MOST.presentation.GraphicalInterface$Task.doInBackground(GraphicalInterface.java:1) at javax.swing.SwingWorker$1.call(Unknown Source) at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source) at java.util.concurrent.FutureTask.run(Unknown Source) at javax.swing.SwingWorker.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source)

— Reply to this email directly or view it on GitHubhttps://github.com/dennisegen/MOST/issues/16#issuecomment-10907462.

mentatpsi commented 11 years ago

Thanks Dr. Lun,

I had some issues when trying to incorporate SBMLModelReader. I made a couple modification to get it up and running:

added: public static final double FLUX_VALUE_DEFAULT = 0.0; public static final double LOWER_BOUND_DEFAULT = -999999.0; public static final double UPPER_BOUND_DEFAULT = 999999.0; public static final double BIOLOGICAL_OBJECTIVE_DEFAULT = 0.0; public static final String KO_DEFAULT = "false"; public static final String REVERSIBLE_DEFAULT = "false"; public static final String BOUNDARY_DEFAULT = "false";

to the GraphicalInterfaceConstants (required for SBMLModelReader lines 381:385).

Line 98 changed to: LocalConfig.getInstance().setProgress((i*ProgressConstants.METABOLITE_LOAD_PERCENT)/metabolites.size());

Line 276 changed to: LocalConfig.getInstance().setProgress((j*ProgressConstants.REACTION_LOAD_PERCENT)/reactions.size() + ProgressConstants.METABOLITE_LOAD_PERCENT);

Works well though. There are a couple issue on the writer side, but I'll try to see what I can manage.

desmondlun commented 11 years ago

That's weird that you were missing those constants (they are in my GraphicalInterfaceConstants), and the other lines you changed had to do with a small modification I made to the progress bar. You've got the old versions of the lines, which is fine--it's not a particularly important change. Perhaps I missed staging some files, or we're having some other problem with Git ...

On Sun, Dec 2, 2012 at 8:18 PM, Shay Maor notifications@github.com wrote:

Thanks Dr. Lun,

I had some issues when trying to incorporate SBMLModelReader. I made a couple modification to get it up and running:

added: public static final double FLUX_VALUE_DEFAULT = 0.0; public static final double LOWER_BOUND_DEFAULT = -999999.0; public static final double UPPER_BOUND_DEFAULT = 999999.0; public static final double BIOLOGICAL_OBJECTIVE_DEFAULT = 0.0; public static final String KO_DEFAULT = "false"; public static final String REVERSIBLE_DEFAULT = "false"; public static final String BOUNDARY_DEFAULT = "false";

to the GraphicalInterfaceConstants (required for SBMLModelReader lines 381:385).

Line 98 changed to:

LocalConfig.getInstance().setProgress((i*ProgressConstants.METABOLITE_LOAD_PERCENT)/metabolites.size());

Line 276 changed to: LocalConfig.getInstance().setProgress((j*ProgressConstants.REACTION_LOAD_PERCENT)/reactions.size()

  • ProgressConstants.METABOLITE_LOAD_PERCENT);

Works well though. There are a couple issue on the writer side, but I'll try to see what I can manage.

— Reply to this email directly or view it on GitHubhttps://github.com/dennisegen/MOST/issues/16#issuecomment-10938713.

jimkell commented 11 years ago

Actually some sbml files have charge as a note. There is great inconsistency with format in sbml files which is why there are so many conditions in reading the files. I had to account for all the different file types, including xml namespaces in the SbmlModelReader class, and I have an analysis of various sbml files i have encountered stored on my computer if anyone is interested.   Jim

--- On Sun, 12/2/12, desmondlun notifications@github.com wrote:

From: desmondlun notifications@github.com Subject: Re: [MOST] jsbml 0.8-b2 (#16) To: "dennisegen/MOST" MOST@noreply.github.com Date: Sunday, December 2, 2012, 6:13 PM

Hi Shay,

I had some (rare) time to do some coding this weekend, so I fixed this problem. Turns out it has to do with empty children of notes elements. Not sure why empty children show up (and why they are not more gracefully handled by toXMLString() than by throwing an exception), but I put in a simple check. You can pull from my fork to get the update.

I also noticed that the charge attribute (used in the iAF1260 model) has been deprecated. The best explanation I could find of this is at http://sbml.org/Software/libSBML/docs/java-api/org/sbml/libsbml/Species.html#getCharge(). This is probably something we should take into account in the SBML writer. Perhaps charge should be a notes element?

On Fri, Nov 30, 2012 at 5:56 PM, Shay Maor notifications@github.com wrote:

javax.xml.stream.XMLStreamException: Trying to write END_DOCUMENT when document has no root (ie. trying to output empty document). at com.ctc.wstx.sw.BaseStreamWriter.throwOutputError(BaseStreamWriter.java:1547) at com.ctc.wstx.sw.BaseStreamWriter.reportNwfStructure(BaseStreamWriter.java:1576) at com.ctc.wstx.sw.BaseStreamWriter._finishDocument(BaseStreamWriter.java:1402) at com.ctc.wstx.sw.BaseStreamWriter.close(BaseStreamWriter.java:264) at org.sbml.jsbml.xml.parsers.XMLNodeWriter.toXML(XMLNodeWriter.java:87) at org.sbml.jsbml.xml.XMLNode.toXMLString(XMLNode.java:609) at edu.rutgers.MOST.data.SBMLModelReader.load(SBMLModelReader.java:409) at edu.rutgers.MOST.presentation.GraphicalInterface$Task.doInBackground(GraphicalInterface.java:3612) at edu.rutgers.MOST.presentation.GraphicalInterface$Task.doInBackground(GraphicalInterface.java:1) at javax.swing.SwingWorker$1.call(Unknown Source) at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source) at java.util.concurrent.FutureTask.run(Unknown Source) at javax.swing.SwingWorker.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) java.lang.StringIndexOutOfBoundsException: String index out of range: -1 at java.lang.String.substring(Unknown Source) at edu.rutgers.MOST.data.SBMLModelReader.load(SBMLModelReader.java:424) at edu.rutgers.MOST.presentation.GraphicalInterface$Task.doInBackground(GraphicalInterface.java:3612) at edu.rutgers.MOST.presentation.GraphicalInterface$Task.doInBackground(GraphicalInterface.java:1) at javax.swing.SwingWorker$1.call(Unknown Source) at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source) at java.util.concurrent.FutureTask.run(Unknown Source) at javax.swing.SwingWorker.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source)

— Reply to this email directly or view it on GitHubhttps://github.com/dennisegen/MOST/issues/16#issuecomment-10907462.

— Reply to this email directly or view it on GitHub.

desmondlun commented 11 years ago

That's great, Jim. I'm glad you've thought of this. There is a huge variation in how the standard is used, as you've seen. Eventually, we'll have to look at an even larger repertoire of files, but I'd say that is of lower priority for now.

In the meantime, we should think about how we apply the standard for the writer. Shay, if you have doubts, Jim is a good resource--he's probably looked at more SBML files in detail than any of us!

On Mon, Dec 3, 2012 at 12:41 AM, jimkell notifications@github.com wrote:

Actually some sbml files have charge as a note. There is great inconsistency with format in sbml files which is why there are so many conditions in reading the files. I had to account for all the different file types, including xml namespaces in the SbmlModelReader class, and I have an analysis of various sbml files i have encountered stored on my computer if anyone is interested.

Jim

--- On Sun, 12/2/12, desmondlun notifications@github.com wrote:

From: desmondlun notifications@github.com Subject: Re: [MOST] jsbml 0.8-b2 (#16) To: "dennisegen/MOST" MOST@noreply.github.com Date: Sunday, December 2, 2012, 6:13 PM

Hi Shay,

I had some (rare) time to do some coding this weekend, so I fixed this problem. Turns out it has to do with empty children of notes elements. Not sure why empty children show up (and why they are not more gracefully handled by toXMLString() than by throwing an exception), but I put in a simple check. You can pull from my fork to get the update.

I also noticed that the charge attribute (used in the iAF1260 model) has been deprecated. The best explanation I could find of this is at

http://sbml.org/Software/libSBML/docs/java-api/org/sbml/libsbml/Species.html#getCharge().

This is probably something we should take into account in the SBML writer. Perhaps charge should be a notes element?

On Fri, Nov 30, 2012 at 5:56 PM, Shay Maor notifications@github.com wrote:

javax.xml.stream.XMLStreamException: Trying to write END_DOCUMENT when document has no root (ie. trying to output empty document). at

com.ctc.wstx.sw.BaseStreamWriter.throwOutputError(BaseStreamWriter.java:1547)

at

com.ctc.wstx.sw.BaseStreamWriter.reportNwfStructure(BaseStreamWriter.java:1576)

at

com.ctc.wstx.sw.BaseStreamWriter._finishDocument(BaseStreamWriter.java:1402)

at com.ctc.wstx.sw.BaseStreamWriter.close(BaseStreamWriter.java:264) at org.sbml.jsbml.xml.parsers.XMLNodeWriter.toXML(XMLNodeWriter.java:87) at org.sbml.jsbml.xml.XMLNode.toXMLString(XMLNode.java:609) at edu.rutgers.MOST.data.SBMLModelReader.load(SBMLModelReader.java:409) at

edu.rutgers.MOST.presentation.GraphicalInterface$Task.doInBackground(GraphicalInterface.java:3612)

at

edu.rutgers.MOST.presentation.GraphicalInterface$Task.doInBackground(GraphicalInterface.java:1)

at javax.swing.SwingWorker$1.call(Unknown Source) at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source) at java.util.concurrent.FutureTask.run(Unknown Source) at javax.swing.SwingWorker.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) java.lang.StringIndexOutOfBoundsException: String index out of range: -1 at java.lang.String.substring(Unknown Source) at edu.rutgers.MOST.data.SBMLModelReader.load(SBMLModelReader.java:424) at

edu.rutgers.MOST.presentation.GraphicalInterface$Task.doInBackground(GraphicalInterface.java:3612)

at

edu.rutgers.MOST.presentation.GraphicalInterface$Task.doInBackground(GraphicalInterface.java:1)

at javax.swing.SwingWorker$1.call(Unknown Source) at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source) at java.util.concurrent.FutureTask.run(Unknown Source) at javax.swing.SwingWorker.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source)

— Reply to this email directly or view it on GitHub< https://github.com/dennisegen/MOST/issues/16#issuecomment-10907462>.

— Reply to this email directly or view it on GitHub.

— Reply to this email directly or view it on GitHubhttps://github.com/dennisegen/MOST/issues/16#issuecomment-10942166.

mentatpsi commented 11 years ago

In such a case, can we create our own sort of deviation for the writer? For instance, where a parameter's id is a name instead of called an id? I'd like to get a working copy up and running and from there modify based on the specifications of the most normal standard. As long as it works on Most of course.

My reasoning is if there's so many deviations amongst sbmls, then a small introduced deviation that's evident might not be critical, as the programmer who receives the deviation would likely know how to account for it. It obviously wouldn't be permanent. I'll do my best to find a means around this workaround. Of course, if there's any way by which we can call upon an xml writer for particular lines, then we might be able to overcome some of these limitations.

Additionally, I do have some concerns, the model writer I've created has some difficulty with jsbml 0.8 that I'm not sure why it's behaving oddly. For instance, each species has a particular compartment where it resides within the system. In the previous model, I was able to use the factory to determine through the factory's query the compartment as a string and then create the compartment on the for loop of all species, I am not sure if now it's required that there be just one compartment variable per compartment and the necessity to map to the proper variable and add the compartment in that fashion. This wouldn't be difficult to implement, but it's only a theorized solution. Another aspect I had seen on the jsbml tutorial was a set size method. I wasn't sure if this means the boundaries of the compartment, but I'll try experimenting with that. It takes in a double and I believe the tutorial set the compartment sizes to 0d. I've also tried foregoing the compartment aspect of the species and then it arose errors upon attempting to add the species reference.

mentatpsi commented 11 years ago

Jim, I'd be interested in seeing the sbmls encountered. It might give some ideas, as likely others have encountered similar issues. Thanks for the suggestion.

desmondlun commented 11 years ago

You'll find many of the SBMLs we've looked at in etc/sbml. Jim may have some more he's examined.

On Mon, Dec 3, 2012 at 11:07 AM, Shay Maor notifications@github.com wrote:

Jim, I'd be interested in seeing the sbmls encountered. It might give some ideas, as likely others have encountered similar issues. Thanks for the suggestion.

— Reply to this email directly or view it on GitHubhttps://github.com/dennisegen/MOST/issues/16#issuecomment-10958974.

desmondlun commented 11 years ago

As vague as it sounds, try to write out the most "sensible" implementation of SBML you can. And you should make sure that our writer and reader our compatible with each other, i.e. if I write out a file and read it back in, I should get the same thing.

On Mon, Dec 3, 2012 at 11:05 AM, Shay Maor notifications@github.com wrote:

In such a case, can we create our own sort of deviation for the writer? For instance, where a parameter's id is a name instead of called an id? I'd like to get a working copy up and running and from there modify based on the specifications of the most normal standard. As long as it works on Most of course.

My reasoning is if there's so many deviations amongst sbmls, then a small introduced deviation that's evident might not be critical, as the programmer who receives the deviation would likely know how to account for it. It obviously wouldn't be permanent. I'll do my best to find a means around this workaround. Of course, if there's any way by which we can call upon an xml writer for particular lines, then we might be able to overcome some of these limitations.

Additionally, I do have some concerns, the model writer I've created has some difficulty with jsbml 0.8 that I'm not sure why it's behaving oddly. For instance, each species has a particular compartment where it resides within the system. In the previous model, I was able to use the factory to determine through the factory's query the compartment as a string and then create the compartment on the for loop of all species, I am not sure if now it's required that there be just one compartment variable per compartment and the necessity to map to the proper variable and add the compartment in that fashion. This wouldn't be difficult to implement, but it's only a theorized solution. Another aspect I had seen on the jsbml tutorial was a set size method. I wasn't sure if this means the boundaries of the compartment, but I'll try experimenting with that. It takes in a double and I believe the tutorial set the compartment sizes to 0d. I've also tried foregoing the compartment aspect of the species and then it arose errors upon attempting to add the species reference.

— Reply to this email directly or view it on GitHubhttps://github.com/dennisegen/MOST/issues/16#issuecomment-10958908.

mentatpsi commented 11 years ago

Of course. If at all possible, would I be able to make a slight modification to the reader such that it would recognize some of these deviations? For instance, one such deviation can be found in: https://github.com/mentatpsi/MOST/blob/master/test.xml

with this line: <parameter name="FLUX_VALUE" ...

seen normally as: <parameter id="FLUX_VALUE" ...

mentatpsi commented 11 years ago

Still, once I get jsbml 0.8 fully working, I'll see if I can find a means to avoid this.

desmondlun commented 11 years ago

Yes, definitely! It'll be helpful if you can describe these to me when we wrap up your project.

On Mon, Dec 3, 2012 at 11:23 AM, Shay Maor notifications@github.com wrote:

Of course. If at all possible, would I be able to make a slight modification to the reader such that it would recognize some of these deviations? For instance, one such deviation can be found in: https://github.com/mentatpsi/MOST/blob/master/test.xml

with this line:

seen normally as:

— Reply to this email directly or view it on GitHubhttps://github.com/dennisegen/MOST/issues/16#issuecomment-10959726.

mentatpsi commented 11 years ago

Of course, I'll see to also designing an api for the SettingsFactory and list any deviations to the sbml of the e coli no boundaries.

jimkell commented 11 years ago

I attached an sbml file with charge in the notes. MOST can read this file just fine.   Jim

--- On Mon, 12/3/12, Shay Maor notifications@github.com wrote:

From: Shay Maor notifications@github.com Subject: Re: [MOST] jsbml 0.8-b2 (#16) To: "dennisegen/MOST" MOST@noreply.github.com Cc: "jimkell" kelljim0414@yahoo.com Date: Monday, December 3, 2012, 11:50 AM

Of course, I'll see to also designing an api for the SettingsFactory and list any deviations to the sbml of the e coli no boundaries. — Reply to this email directly or view it on GitHub.

mentatpsi commented 11 years ago

I've created a repository that focuses on jsbml 0.8 so that I can develop alongside both jsbml versions in case figuring out jsbml 0.8 prevents an on time delivery of the sbml writer.

This repository can be found here: https://github.com/mentatpsi/MOST_mentatpsi

However, recently I created a compartment mapping which creates a one-to-one mapping of compartment to compartment instance variable. Doing so removed the compartment error and is now returning another error for creating the species reference. I encountered this error when I removed the compartment attribute of a species in a previous revision, so I believe the compartment issue has been fixed.

Given this, and if I understand jsbml 0.8, a major development is that there must be a one-to-one mapping of each model's attribute to just one instance variable, whether a compartment or a species. So at current I'll work towards developing the mapping for each species (termed metabolite in the GUI), which in theory should also cut down on processing time given a reduction of the amount of times it must access queries for information. I've used a HashMap class for this.

I'll be focusing on jsbml 0.8 production as I'd prefer not to waste the work done to bring Most to this version. The jsbml 0.8-b1 will be a last resort.

mentatpsi commented 11 years ago

Ok, just an update... I implemented the changes in Jim's fork and modified jsbmlwriter to work with jsbml 0.8 as well as the current models of the factories. I've placed this in my fork, since from now on I'll stick with jsbml 0.8. I still have bugs in my code that I'd like to root out, but at the least it creates a working xml document with accurate flux values and other parameters. I will focus my efforts to making it entirely functional and find a way to implement notes containing the associations to genes and subsystems alongside other info.

The current generated xml can be found here: https://github.com/mentatpsi/MOST/blob/master/test.xml