From 5c64e49fc1986f6908bad0ccfdc792a5a2a0939b Mon Sep 17 00:00:00 2001 From: jcschaff Date: Fri, 4 Apr 2025 10:57:22 -0400 Subject: [PATCH 01/12] make DataSet.read() public to read fielddata files from libvcell --- vcell-core/src/main/java/cbit/vcell/simdata/DataSet.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vcell-core/src/main/java/cbit/vcell/simdata/DataSet.java b/vcell-core/src/main/java/cbit/vcell/simdata/DataSet.java index ba34007b97..7516bbd16c 100644 --- a/vcell-core/src/main/java/cbit/vcell/simdata/DataSet.java +++ b/vcell-core/src/main/java/cbit/vcell/simdata/DataSet.java @@ -249,7 +249,7 @@ public static ZipFile openZipFile(File zipFile) throws IOException { * This method was created by a SmartGuide. * */ -void read(File file, File zipFile) throws IOException, OutOfMemoryError { +public void read(File file, File zipFile) throws IOException, OutOfMemoryError { read(file, zipFile, null); } From f2dd363a6ff50ea7fb591e6ea9e273cb24a679b7 Mon Sep 17 00:00:00 2001 From: jcschaff Date: Fri, 4 Apr 2025 11:25:53 -0400 Subject: [PATCH 02/12] need access to DataSet constructor and variableType from libvcell --- vcell-core/src/main/java/cbit/vcell/simdata/DataSet.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vcell-core/src/main/java/cbit/vcell/simdata/DataSet.java b/vcell-core/src/main/java/cbit/vcell/simdata/DataSet.java index 7516bbd16c..3710455934 100644 --- a/vcell-core/src/main/java/cbit/vcell/simdata/DataSet.java +++ b/vcell-core/src/main/java/cbit/vcell/simdata/DataSet.java @@ -28,7 +28,7 @@ public class DataSet implements java.io.Serializable private FileHeader fileHeader; private String fileName; -DataSet() { +public DataSet() { dataBlockList = new Vector(); fileHeader = new FileHeader(); } @@ -196,7 +196,7 @@ int getSizeZ() { * @return double[] * @param varName java.lang.String */ -int getVariableTypeInteger(String varName) throws IOException { +public int getVariableTypeInteger(String varName) throws IOException { for (int i=0;i Date: Wed, 9 Apr 2025 19:25:18 -0400 Subject: [PATCH 03/12] BeanUtils.cloneSerializable() to XmlHelper.clone() with xml for libvcell --- .../vcell/client/ClientRequestManager.java | 4 +- .../java/cbit/vcell/client/task/RunSims.java | 3 +- .../cbit/vcell/graph/gui/BioCartoonTool.java | 78 +++--------- .../java/cbit/vcell/biomodel/BioModel.java | 47 +++----- .../vcell/clientdb/ClientDocumentManager.java | 2 +- .../mapping/LegacySimContextTransformer.java | 6 +- .../vcell/mapping/NetworkTransformer.java | 6 +- .../vcell/mapping/RateRuleTransformer.java | 67 ++--------- .../vcell/mapping/RulebasedTransformer.java | 71 +++-------- .../solver/test/MathTestingUtilities.java | 56 ++------- .../vcell/solvers/FiniteVolumeFileWriter.java | 113 ++++-------------- .../vcell/solvers/MovingBoundarySolver.java | 14 +-- .../main/java/cbit/vcell/xml/XmlHelper.java | 105 ++++++++++++---- .../main/java/cbit/vcell/xml/Xmlproducer.java | 4 +- .../org/vcell/optimization/OptXmlWriter.java | 50 +++----- .../org/vcell/sbml/vcell/SBMLImporter.java | 13 +- .../solver/smoldyn/SmoldynFileWriter.java | 102 ++++------------ .../smoldyn/SmoldynSurfaceTessellator.java | 57 +++------ 18 files changed, 260 insertions(+), 538 deletions(-) diff --git a/vcell-client/src/main/java/cbit/vcell/client/ClientRequestManager.java b/vcell-client/src/main/java/cbit/vcell/client/ClientRequestManager.java index dcd6f56719..f72340e2ac 100644 --- a/vcell-client/src/main/java/cbit/vcell/client/ClientRequestManager.java +++ b/vcell-client/src/main/java/cbit/vcell/client/ClientRequestManager.java @@ -633,7 +633,7 @@ public XmlTreeDiff compareWithSaved(VCDocument document) { public XmlTreeDiff compareApplications(BioModel bioModel, String appName1, String appName2) throws Exception { // clone BioModel as bioModel1 and remove all but appName1 - BioModel bioModel1 = (BioModel) BeanUtils.cloneSerializable(bioModel); + BioModel bioModel1 = XmlHelper.cloneBioModel(bioModel); bioModel1.refreshDependencies(); SimulationContext[] allSimContexts1 = bioModel1.getSimulationContexts(); for (SimulationContext sc : allSimContexts1) { @@ -643,7 +643,7 @@ public XmlTreeDiff compareApplications(BioModel bioModel, String appName1, Strin } // clone BioModel as bioModel2 and remove all but appName2 - BioModel bioModel2 = (BioModel) BeanUtils.cloneSerializable(bioModel); + BioModel bioModel2 = XmlHelper.cloneBioModel(bioModel); bioModel2.refreshDependencies(); SimulationContext[] allSimContexts2 = bioModel2.getSimulationContexts(); for (SimulationContext sc : allSimContexts2) { diff --git a/vcell-client/src/main/java/cbit/vcell/client/task/RunSims.java b/vcell-client/src/main/java/cbit/vcell/client/task/RunSims.java index 6f889311e9..1c73641016 100644 --- a/vcell-client/src/main/java/cbit/vcell/client/task/RunSims.java +++ b/vcell-client/src/main/java/cbit/vcell/client/task/RunSims.java @@ -14,6 +14,7 @@ import java.util.Vector; import cbit.vcell.solver.*; +import cbit.vcell.xml.XmlHelper; import org.vcell.util.*; import org.vcell.util.document.VCDocument; import org.vcell.util.gui.DialogUtils; @@ -197,7 +198,7 @@ public void run(Hashtable hashTable) throws java.lang.Exception int defaultTotalVolumeElements = mathGeometry.getGeometrySurfaceDescription().getVolumeSampleSize().getXYZ(); int newTotalVolumeElements = meshSpecification.getSamplingSize().getXYZ(); if (defaultTotalVolumeElements > newTotalVolumeElements) { // coarser - Geometry resampledGeometry = (Geometry) BeanUtils.cloneSerializable(mathGeometry); + Geometry resampledGeometry = XmlHelper.cloneGeometry(mathGeometry); GeometrySurfaceDescription geoSurfaceDesc = resampledGeometry.getGeometrySurfaceDescription(); geoSurfaceDesc.setVolumeSampleSize(newSize); geoSurfaceDesc.updateAll(); diff --git a/vcell-client/src/main/java/cbit/vcell/graph/gui/BioCartoonTool.java b/vcell-client/src/main/java/cbit/vcell/graph/gui/BioCartoonTool.java index d6076e75ac..02458619a8 100644 --- a/vcell-client/src/main/java/cbit/vcell/graph/gui/BioCartoonTool.java +++ b/vcell-client/src/main/java/cbit/vcell/graph/gui/BioCartoonTool.java @@ -9,78 +9,38 @@ */ package cbit.vcell.graph.gui; -import java.awt.Component; -import java.awt.Dimension; -import java.awt.Window; -import java.beans.PropertyVetoException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Hashtable; -import java.util.IdentityHashMap; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.Vector; - -import javax.swing.JComboBox; -import javax.swing.JOptionPane; -import javax.swing.JTextField; - -import org.vcell.model.rbm.MolecularType; -import org.vcell.model.rbm.RbmNetworkGenerator.CompartmentMode; -import org.vcell.model.rbm.RbmUtils; -import org.vcell.model.rbm.SpeciesPattern; -import org.vcell.util.BeanUtils; -import org.vcell.util.CommentStringTokenizer; -import org.vcell.util.Compare; -import org.vcell.util.Issue; -import org.vcell.util.Issue.IssueCategory; -import org.vcell.util.IssueContext; -import org.vcell.util.IssueContext.ContextType; -import org.vcell.util.document.KeyValue; -import org.vcell.util.TokenMangler; -import org.vcell.util.UserCancelException; -import org.vcell.util.gui.DialogUtils; import cbit.gui.graph.gui.GraphPane; import cbit.vcell.client.task.AsynchClientTask; import cbit.vcell.client.task.ClientTaskDispatcher; import cbit.vcell.clientdb.DocumentManager; -import cbit.vcell.model.BioModelEntityObject; -import cbit.vcell.model.Catalyst; -import cbit.vcell.model.Feature; -import cbit.vcell.model.FluxReaction; -import cbit.vcell.model.Kinetics; +import cbit.vcell.model.*; import cbit.vcell.model.Kinetics.KineticsParameter; import cbit.vcell.model.Kinetics.KineticsProxyParameter; -import cbit.vcell.model.KineticsDescription; -import cbit.vcell.model.Membrane; import cbit.vcell.model.Membrane.MembraneVoltage; -import cbit.vcell.model.Model; import cbit.vcell.model.Model.ModelParameter; import cbit.vcell.model.Model.RbmModelContainer; import cbit.vcell.model.Model.StructureTopology; -import cbit.vcell.model.ModelException; -import cbit.vcell.model.Product; -import cbit.vcell.model.Reactant; -import cbit.vcell.model.ReactionDescription; -import cbit.vcell.model.ReactionParticipant; -import cbit.vcell.model.ReactionRule; -import cbit.vcell.model.ReactionSpeciesCopy; -import cbit.vcell.model.ReactionStep; -import cbit.vcell.model.SimpleReaction; -import cbit.vcell.model.Species; -import cbit.vcell.model.SpeciesContext; -import cbit.vcell.model.Structure; import cbit.vcell.model.Structure.StructureSize; import cbit.vcell.parser.Expression; import cbit.vcell.parser.ExpressionBindingException; import cbit.vcell.parser.SymbolTableEntry; +import cbit.vcell.xml.XmlHelper; +import org.vcell.model.rbm.MolecularType; +import org.vcell.model.rbm.RbmNetworkGenerator.CompartmentMode; +import org.vcell.model.rbm.RbmUtils; +import org.vcell.model.rbm.SpeciesPattern; +import org.vcell.util.*; +import org.vcell.util.Issue.IssueCategory; +import org.vcell.util.IssueContext.ContextType; +import org.vcell.util.gui.DialogUtils; + +import javax.swing.*; +import java.awt.*; +import java.beans.PropertyVetoException; +import java.util.*; +import java.util.List; +import java.util.Map.Entry; public abstract class BioCartoonTool extends cbit.gui.graph.gui.CartoonTool { private DocumentManager documentManager = null; @@ -338,7 +298,7 @@ public static final void pasteReactionsAndRules(Component requester, ReactionSpe AsynchClientTask issueTask = new AsynchClientTask("Checking Issues...",AsynchClientTask.TASKTYPE_SWING_BLOCKING) { @Override public void run(Hashtable hashTable) throws Exception { - Model clonedModel = (Model)org.vcell.util.BeanUtils.cloneSerializable(pasteModel); + Model clonedModel = XmlHelper.cloneModel(pasteModel); clonedModel.refreshDependencies(); // Model clonedModel = pasteModel; IssueContext issueContext = new IssueContext(ContextType.Model, clonedModel, null); @@ -549,7 +509,7 @@ public void run(Hashtable hashTable) throws Exception { public void run(Hashtable hashTable) throws Exception { ReactionStep[] reactionStepsArrOrig = new ReactionStep[] {(ReactionStep)hashTable.get("fromRXStep")}; UserResolvedRxElements userResolvedRxElements = (UserResolvedRxElements)hashTable.get("userResolvedRxElements"); - Model clonedModel = (Model)org.vcell.util.BeanUtils.cloneSerializable(pasteToModel); + Model clonedModel = XmlHelper.cloneModel(pasteToModel); clonedModel.refreshDependencies(); IssueContext issueContext = new IssueContext(ContextType.Model, clonedModel, null); HashMap> userResolved_rxPartMapStruct = null; diff --git a/vcell-core/src/main/java/cbit/vcell/biomodel/BioModel.java b/vcell-core/src/main/java/cbit/vcell/biomodel/BioModel.java index 4e87e59707..1a362e5178 100644 --- a/vcell-core/src/main/java/cbit/vcell/biomodel/BioModel.java +++ b/vcell-core/src/main/java/cbit/vcell/biomodel/BioModel.java @@ -10,19 +10,24 @@ package cbit.vcell.biomodel; -import java.beans.PropertyChangeListener; -import java.beans.PropertyChangeSupport; -import java.beans.PropertyVetoException; -import java.beans.VetoableChangeListener; -import java.beans.VetoableChangeSupport; -import java.util.*; -import java.util.function.Consumer; -import java.util.stream.Collectors; - +import cbit.image.ImageException; import cbit.image.VCImage; +import cbit.vcell.biomodel.meta.IdentifiableProvider; +import cbit.vcell.biomodel.meta.VCID; +import cbit.vcell.biomodel.meta.VCMetaData; +import cbit.vcell.geometry.*; +import cbit.vcell.geometry.surface.GeometrySurfaceDescription; import cbit.vcell.mapping.*; import cbit.vcell.mapping.SimulationContext.Application; +import cbit.vcell.math.MathDescription; import cbit.vcell.model.*; +import cbit.vcell.model.Model.RbmModelContainer; +import cbit.vcell.model.Structure.SpringStructureEnum; +import cbit.vcell.parser.ExpressionException; +import cbit.vcell.parser.NameScope; +import cbit.vcell.parser.SymbolTableEntry; +import cbit.vcell.solver.Simulation; +import cbit.vcell.xml.XmlHelper; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.vcell.model.rbm.MolecularType; @@ -38,24 +43,10 @@ import org.vcell.util.document.*; import org.vcell.util.document.BioModelChildSummary.MathType; -import cbit.image.ImageException; -import cbit.vcell.biomodel.meta.IdentifiableProvider; -import cbit.vcell.biomodel.meta.VCID; -import cbit.vcell.biomodel.meta.VCMetaData; -import cbit.vcell.geometry.AnalyticSubVolume; -import cbit.vcell.geometry.Geometry; -import cbit.vcell.geometry.GeometryException; -import cbit.vcell.geometry.GeometrySpec; -import cbit.vcell.geometry.SubVolume; -import cbit.vcell.geometry.SurfaceClass; -import cbit.vcell.geometry.surface.GeometrySurfaceDescription; -import cbit.vcell.math.MathDescription; -import cbit.vcell.model.Model.RbmModelContainer; -import cbit.vcell.model.Structure.SpringStructureEnum; -import cbit.vcell.parser.ExpressionException; -import cbit.vcell.parser.NameScope; -import cbit.vcell.parser.SymbolTableEntry; -import cbit.vcell.solver.Simulation; +import java.beans.*; +import java.util.*; +import java.util.function.Consumer; +import java.util.stream.Collectors; /** * Insert the type's description here. @@ -114,7 +105,7 @@ public void transformLumpedToDistributed(){ Kinetics origKinetics = reactionStep.getKinetics(); // clone it for backup purposes origKinetics.setReactionStep(null); - Kinetics clonedKinetics = (Kinetics) BeanUtils.cloneSerializable(origKinetics); + Kinetics clonedKinetics = XmlHelper.cloneReactionStep(reactionStep).getKinetics(); origKinetics.setReactionStep(reactionStep); try { DistributedKinetics.toDistributedKinetics((LumpedKinetics) origKinetics, false); diff --git a/vcell-core/src/main/java/cbit/vcell/clientdb/ClientDocumentManager.java b/vcell-core/src/main/java/cbit/vcell/clientdb/ClientDocumentManager.java index 520c713eb3..5e88f7d541 100644 --- a/vcell-core/src/main/java/cbit/vcell/clientdb/ClientDocumentManager.java +++ b/vcell-core/src/main/java/cbit/vcell/clientdb/ClientDocumentManager.java @@ -1131,7 +1131,7 @@ public Model getReactionStepAsModel(KeyValue reactionStepKey) throws DataAccessE Model reactionModel = new XmlReader(true).getModel(element); if(reactionModel != null){ try{ - reactionModel = (Model)BeanUtils.cloneSerializable(reactionModel); + reactionModel = XmlHelper.cloneModel(reactionModel); reactionModel.refreshDependencies(); }catch(Exception e){ throw new DataAccessException(e.getMessage(), e); diff --git a/vcell-core/src/main/java/cbit/vcell/mapping/LegacySimContextTransformer.java b/vcell-core/src/main/java/cbit/vcell/mapping/LegacySimContextTransformer.java index 84ae1cdfdc..846ed373c2 100644 --- a/vcell-core/src/main/java/cbit/vcell/mapping/LegacySimContextTransformer.java +++ b/vcell-core/src/main/java/cbit/vcell/mapping/LegacySimContextTransformer.java @@ -4,6 +4,8 @@ import java.util.ArrayList; import cbit.vcell.geometry.GeometryClass; +import cbit.vcell.xml.XmlHelper; +import cbit.vcell.xml.XmlParseException; import org.vcell.sbml.vcell.StructureSizeSolver; import org.vcell.util.BeanUtils; import org.vcell.util.ProgrammingException; @@ -18,8 +20,8 @@ public class LegacySimContextTransformer implements SimContextTransformer { public SimContextTransformation transform(SimulationContext originalSimContext, MathMappingCallback mathMappingCallback, NetworkGenerationRequirements networkGenerationRequirements) { SimulationContext transformedSimContext; try { - transformedSimContext = (SimulationContext)BeanUtils.cloneSerializable(originalSimContext); - } catch (ClassNotFoundException | IOException e) { + transformedSimContext = XmlHelper.cloneSimulationContext(originalSimContext); + } catch (XmlParseException e) { throw new RuntimeException("unexpected exception: "+e.getMessage(), e); } try { diff --git a/vcell-core/src/main/java/cbit/vcell/mapping/NetworkTransformer.java b/vcell-core/src/main/java/cbit/vcell/mapping/NetworkTransformer.java index 79b0113baa..69310b07ca 100644 --- a/vcell-core/src/main/java/cbit/vcell/mapping/NetworkTransformer.java +++ b/vcell-core/src/main/java/cbit/vcell/mapping/NetworkTransformer.java @@ -11,6 +11,8 @@ import java.util.List; import java.util.Map; +import cbit.vcell.xml.XmlHelper; +import cbit.vcell.xml.XmlParseException; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.vcell.model.bngl.ParseException; @@ -85,8 +87,8 @@ public class NetworkTransformer implements SimContextTransformer { final public SimContextTransformation transform(SimulationContext originalSimContext, MathMappingCallback mathMappingCallback, NetworkGenerationRequirements networkGenerationRequirements) { SimulationContext transformedSimContext; try { - transformedSimContext = (SimulationContext)BeanUtils.cloneSerializable(originalSimContext); - } catch (ClassNotFoundException | IOException e) { + transformedSimContext = XmlHelper.cloneSimulationContext(originalSimContext); + } catch (XmlParseException e) { throw new RuntimeException("unexpected exception: "+e.getMessage(), e); } transformedSimContext.getModel().refreshDependencies(); diff --git a/vcell-core/src/main/java/cbit/vcell/mapping/RateRuleTransformer.java b/vcell-core/src/main/java/cbit/vcell/mapping/RateRuleTransformer.java index c4a6ba9b72..a09e176235 100644 --- a/vcell-core/src/main/java/cbit/vcell/mapping/RateRuleTransformer.java +++ b/vcell-core/src/main/java/cbit/vcell/mapping/RateRuleTransformer.java @@ -1,71 +1,20 @@ package cbit.vcell.mapping; -import java.beans.PropertyVetoException; -import java.io.IOException; -import java.io.PrintWriter; -import java.io.StringWriter; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.vcell.model.bngl.ParseException; -import org.vcell.model.rbm.FakeReactionRuleRateParameter; -import org.vcell.model.rbm.FakeSeedSpeciesInitialConditionsParameter; -import org.vcell.model.rbm.NetworkConstraints; -import org.vcell.model.rbm.RbmNetworkGenerator; -import org.vcell.model.rbm.RbmNetworkGenerator.CompartmentMode; -import org.vcell.model.rbm.RbmUtils; -import org.vcell.model.rbm.SpeciesPattern; -import org.vcell.util.BeanUtils; -import org.vcell.util.Pair; -import org.vcell.util.TokenMangler; -import org.vcell.util.UserCancelException; - -import cbit.vcell.bionetgen.BNGOutputFileParser; -import cbit.vcell.bionetgen.BNGOutputSpec; -import cbit.vcell.bionetgen.BNGParameter; -import cbit.vcell.bionetgen.BNGReaction; -import cbit.vcell.bionetgen.BNGSpecies; -import cbit.vcell.bionetgen.ObservableGroup; -import cbit.vcell.mapping.ParameterContext.LocalParameter; import cbit.vcell.mapping.SimulationContext.MathMappingCallback; import cbit.vcell.mapping.SimulationContext.NetworkGenerationRequirements; -import cbit.vcell.mapping.TaskCallbackMessage.TaskCallbackStatus; -import cbit.vcell.model.DistributedKinetics; -import cbit.vcell.model.HMM_IRRKinetics; -import cbit.vcell.model.Kinetics; -import cbit.vcell.model.KineticsDescription; -import cbit.vcell.model.Kinetics.KineticsParameter; -import cbit.vcell.model.MassActionKinetics; import cbit.vcell.model.Model; -import cbit.vcell.model.Model.RbmModelContainer; -import cbit.vcell.model.ModelException; -import cbit.vcell.model.Parameter; -import cbit.vcell.model.Product; -import cbit.vcell.model.RbmKineticLaw.RbmKineticLawParameterType; -import cbit.vcell.model.RbmObservable; -import cbit.vcell.model.Reactant; -import cbit.vcell.model.ReactionRule; -import cbit.vcell.model.ReactionStep; -import cbit.vcell.model.SimpleReaction; import cbit.vcell.model.Species; import cbit.vcell.model.SpeciesContext; import cbit.vcell.model.Structure; import cbit.vcell.parser.Expression; import cbit.vcell.parser.ExpressionBindingException; -import cbit.vcell.parser.ExpressionException; -import cbit.vcell.parser.NameScope; import cbit.vcell.parser.SymbolTableEntry; -import cbit.vcell.server.bionetgen.BNGException; -import cbit.vcell.server.bionetgen.BNGExecutorService; -import cbit.vcell.server.bionetgen.BNGInput; -import cbit.vcell.server.bionetgen.BNGOutput; -import cbit.vcell.units.VCUnitDefinition; +import cbit.vcell.xml.XmlHelper; +import cbit.vcell.xml.XmlParseException; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.beans.PropertyVetoException; /* * Flattening a Rule-based Model @@ -78,8 +27,8 @@ final public SimContextTransformation transform(SimulationContext originalSimCon SimulationContext transformedSimContext; try { mathMappingCallback.setMessage("transforming the Rate Rules..."); - transformedSimContext = (SimulationContext)BeanUtils.cloneSerializable(originalSimContext); - } catch (ClassNotFoundException | IOException e) { + transformedSimContext = XmlHelper.cloneSimulationContext(originalSimContext); + } catch (XmlParseException e) { throw new RuntimeException("unexpected exception: "+e.getMessage(), e); } transformedSimContext.getModel().refreshDependencies(); diff --git a/vcell-core/src/main/java/cbit/vcell/mapping/RulebasedTransformer.java b/vcell-core/src/main/java/cbit/vcell/mapping/RulebasedTransformer.java index eebcc3ff30..e9f0099ef7 100644 --- a/vcell-core/src/main/java/cbit/vcell/mapping/RulebasedTransformer.java +++ b/vcell-core/src/main/java/cbit/vcell/mapping/RulebasedTransformer.java @@ -1,39 +1,5 @@ package cbit.vcell.mapping; -import java.beans.PropertyVetoException; -import java.io.BufferedWriter; -import java.io.FileWriter; -import java.io.IOException; -import java.io.PrintWriter; -import java.io.StringWriter; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.jdom2.Document; -import org.jdom2.Element; -import org.jdom2.Namespace; -import org.jdom2.output.XMLOutputter; -import org.vcell.model.rbm.FakeReactionRuleRateParameter; -import org.vcell.model.rbm.FakeSeedSpeciesInitialConditionsParameter; -import org.vcell.model.rbm.MolecularComponentPattern; -import org.vcell.model.rbm.MolecularType; -import org.vcell.model.rbm.MolecularTypePattern; -import org.vcell.model.rbm.RbmNetworkGenerator; -import org.vcell.model.rbm.RbmNetworkGenerator.CompartmentMode; -import org.vcell.model.rbm.RbmObject; -import org.vcell.model.rbm.RuleAnalysis; -import org.vcell.model.rbm.RuleAnalysisReport; -import org.vcell.model.rbm.SpeciesPattern; -import org.vcell.util.BeanUtils; -import org.vcell.util.Pair; -import org.vcell.util.TokenMangler; - import cbit.vcell.bionetgen.BNGOutputSpec; import cbit.vcell.mapping.ParameterContext.LocalParameter; import cbit.vcell.mapping.ParameterContext.LocalProxyParameter; @@ -41,31 +7,32 @@ import cbit.vcell.mapping.SimulationContext.NetworkGenerationRequirements; import cbit.vcell.mapping.TaskCallbackMessage.TaskCallbackStatus; import cbit.vcell.math.MathRuleFactory.MathRuleEntry; -import cbit.vcell.model.Kinetics; +import cbit.vcell.model.*; import cbit.vcell.model.Kinetics.KineticsParameter; -import cbit.vcell.model.MassActionKinetics; -import cbit.vcell.model.Model; import cbit.vcell.model.Model.ModelParameter; -import cbit.vcell.model.ModelException; -import cbit.vcell.model.Product; -import cbit.vcell.model.ProductPattern; -import cbit.vcell.model.ProxyParameter; -import cbit.vcell.model.RbmKineticLaw; import cbit.vcell.model.RbmKineticLaw.RateLawType; import cbit.vcell.model.RbmKineticLaw.RbmKineticLawParameterType; -import cbit.vcell.model.RbmObservable; -import cbit.vcell.model.Reactant; -import cbit.vcell.model.ReactantPattern; -import cbit.vcell.model.ReactionParticipant; -import cbit.vcell.model.ReactionRule; -import cbit.vcell.model.ReactionRuleParticipant; -import cbit.vcell.model.ReactionStep; -import cbit.vcell.model.SpeciesContext; import cbit.vcell.parser.Expression; import cbit.vcell.parser.ExpressionException; import cbit.vcell.server.bionetgen.BNGExecutorService; import cbit.vcell.server.bionetgen.BNGInput; import cbit.vcell.server.bionetgen.BNGOutput; +import cbit.vcell.xml.XmlHelper; +import cbit.vcell.xml.XmlParseException; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.jdom2.Document; +import org.jdom2.Element; +import org.jdom2.Namespace; +import org.jdom2.output.XMLOutputter; +import org.vcell.model.rbm.*; +import org.vcell.model.rbm.RbmNetworkGenerator.CompartmentMode; +import org.vcell.util.Pair; +import org.vcell.util.TokenMangler; + +import java.beans.PropertyVetoException; +import java.io.*; +import java.util.*; public class RulebasedTransformer implements SimContextTransformer { private final static Logger lg = LogManager.getLogger(RulebasedTransformer.class); @@ -293,11 +260,11 @@ final public RulebasedTransformation transform(SimulationContext originalSimCont keyMap.clear(); try { - transformedSimContext = (SimulationContext)BeanUtils.cloneSerializable(originalSimContext); + transformedSimContext = XmlHelper.cloneSimulationContext(originalSimContext); transformedSimContext.getModel().refreshDependencies(); transformedSimContext.refreshDependencies(); transformedSimContext.compareEqual(originalSimContext); - } catch (ClassNotFoundException | IOException e) { + } catch (XmlParseException e) { throw new RuntimeException("Unexpected transform exception: "+e.getMessage(), e); } final Model transformedModel = transformedSimContext.getModel(); diff --git a/vcell-core/src/main/java/cbit/vcell/solver/test/MathTestingUtilities.java b/vcell-core/src/main/java/cbit/vcell/solver/test/MathTestingUtilities.java index d848211b82..d1124e69a0 100644 --- a/vcell-core/src/main/java/cbit/vcell/solver/test/MathTestingUtilities.java +++ b/vcell-core/src/main/java/cbit/vcell/solver/test/MathTestingUtilities.java @@ -11,50 +11,14 @@ package cbit.vcell.solver.test; -import java.util.Enumeration; -import java.util.Vector; - -import cbit.vcell.solver.MathOverrides; -import cbit.vcell.solver.SimulationOwner; -import org.vcell.util.*; -import org.vcell.util.document.VCDocument; - import cbit.vcell.biomodel.BioModel; import cbit.vcell.geometry.AnalyticSubVolume; import cbit.vcell.geometry.SubVolume; import cbit.vcell.mapping.AbstractMathMapping; import cbit.vcell.mapping.DiffEquMathMapping; import cbit.vcell.mapping.MappingException; -import cbit.vcell.math.CompartmentSubDomain; -import cbit.vcell.math.Constant; -import cbit.vcell.math.Equation; -import cbit.vcell.math.FastInvariant; -import cbit.vcell.math.FastRate; -import cbit.vcell.math.FastSystem; -import cbit.vcell.math.FilamentRegionVariable; -import cbit.vcell.math.FilamentVariable; -import cbit.vcell.math.Function; -import cbit.vcell.math.FunctionColumnDescription; -import cbit.vcell.math.InsideVariable; -import cbit.vcell.math.JumpCondition; -import cbit.vcell.math.MathDescription; -import cbit.vcell.math.MathException; -import cbit.vcell.math.MathUtilities; -import cbit.vcell.math.MemVariable; -import cbit.vcell.math.MembraneRegionVariable; -import cbit.vcell.math.MembraneSubDomain; -import cbit.vcell.math.ODESolverResultSetColumnDescription; -import cbit.vcell.math.OdeEquation; -import cbit.vcell.math.OutsideVariable; -import cbit.vcell.math.PdeEquation; -import cbit.vcell.math.ReservedVariable; -import cbit.vcell.math.SubDomain; -import cbit.vcell.math.Variable; +import cbit.vcell.math.*; import cbit.vcell.math.Variable.Domain; -import cbit.vcell.math.VariableHash; -import cbit.vcell.math.VariableType; -import cbit.vcell.math.VolVariable; -import cbit.vcell.math.VolumeRegionVariable; import cbit.vcell.model.SpeciesContext; import cbit.vcell.numericstest.ConstructedSolutionTemplate; import cbit.vcell.numericstest.SolutionTemplate; @@ -64,17 +28,23 @@ import cbit.vcell.parser.ExpressionException; import cbit.vcell.parser.ExpressionTerm; import cbit.vcell.parser.SimpleSymbolTable; -import cbit.vcell.simdata.DataIdentifier; -import cbit.vcell.simdata.DataInfoProvider; -import cbit.vcell.simdata.PDEDataManager; -import cbit.vcell.simdata.SimDataBlock; -import cbit.vcell.simdata.SimDataConstants; +import cbit.vcell.simdata.*; +import cbit.vcell.solver.MathOverrides; import cbit.vcell.solver.Simulation; +import cbit.vcell.solver.SimulationOwner; import cbit.vcell.solver.SimulationSymbolTable; import cbit.vcell.solver.ode.ODESolverResultSet; import cbit.vcell.solver.ode.SensVariable; import cbit.vcell.solvers.CartesianMesh; import cbit.vcell.util.ColumnDescription; +import cbit.vcell.xml.XmlHelper; +import org.vcell.util.Coordinate; +import org.vcell.util.CoordinateIndex; +import org.vcell.util.DataAccessException; +import org.vcell.util.document.VCDocument; + +import java.util.Enumeration; +import java.util.Vector; public class MathTestingUtilities { @@ -736,7 +706,7 @@ public static MathDescription constructExactMath(MathDescription mathDesc, java. } MathDescription exactMath = null; try { - exactMath = (MathDescription) BeanUtils.cloneSerializable(mathDesc); + exactMath = XmlHelper.cloneMathDescription(mathDesc); exactMath.setDescription("constructed exact solution from MathDescription (" + mathDesc.getName() + ")"); exactMath.setName("exact from " + mathDesc.getName()); } catch(Exception e){ diff --git a/vcell-core/src/main/java/cbit/vcell/solvers/FiniteVolumeFileWriter.java b/vcell-core/src/main/java/cbit/vcell/solvers/FiniteVolumeFileWriter.java index 1c0ce3814a..9a562f0667 100644 --- a/vcell-core/src/main/java/cbit/vcell/solvers/FiniteVolumeFileWriter.java +++ b/vcell-core/src/main/java/cbit/vcell/solvers/FiniteVolumeFileWriter.java @@ -10,29 +10,6 @@ package cbit.vcell.solvers; -import java.beans.PropertyVetoException; -import java.io.BufferedOutputStream; -import java.io.DataOutputStream; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.PrintWriter; -import java.util.*; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.vcell.chombo.ChomboSolverSpec; -import org.vcell.chombo.RefinementRoi; -import org.vcell.chombo.RefinementRoi.RoiType; -import org.vcell.chombo.TimeInterval; -import org.vcell.solver.smoldyn.SmoldynFileWriter; -import org.vcell.util.BeanUtils; -import org.vcell.util.DataAccessException; -import org.vcell.util.Extent; -import org.vcell.util.ISize; -import org.vcell.util.Origin; - import cbit.image.ImageException; import cbit.image.VCImage; import cbit.image.VCImageUncompressed; @@ -40,88 +17,40 @@ import cbit.vcell.field.FieldDataIdentifierSpec; import cbit.vcell.field.FieldFunctionArguments; import cbit.vcell.field.FieldUtilities; -import cbit.vcell.geometry.AnalyticSubVolume; -import cbit.vcell.geometry.Geometry; -import cbit.vcell.geometry.GeometryException; -import cbit.vcell.geometry.GeometrySpec; -import cbit.vcell.geometry.SubVolume; +import cbit.vcell.geometry.*; import cbit.vcell.geometry.surface.DistanceMapGenerator; import cbit.vcell.geometry.surface.GeometrySurfaceDescription; import cbit.vcell.geometry.surface.RayCaster; import cbit.vcell.geometry.surface.SubvolumeSignedDistanceMap; import cbit.vcell.mapping.FastSystemAnalyzer; -import cbit.vcell.math.BoundaryConditionType; -import cbit.vcell.math.CompartmentSubDomain; -import cbit.vcell.math.Constant; -import cbit.vcell.math.ConvolutionDataGenerator; +import cbit.vcell.math.*; import cbit.vcell.math.ConvolutionDataGenerator.ConvolutionDataGeneratorKernel; import cbit.vcell.math.ConvolutionDataGenerator.GaussianConvolutionDataGeneratorKernel; -import cbit.vcell.math.DataGenerator; -import cbit.vcell.math.Distribution; -import cbit.vcell.math.Equation; -import cbit.vcell.math.FastSystem; -import cbit.vcell.math.FilamentVariable; -import cbit.vcell.math.GaussianDistribution; -import cbit.vcell.math.JumpCondition; -import cbit.vcell.math.MathDescription; -import cbit.vcell.math.MathException; -import cbit.vcell.math.MathUtilities; -import cbit.vcell.math.MeasureEquation; -import cbit.vcell.math.MemVariable; -import cbit.vcell.math.MembraneParticleVariable; -import cbit.vcell.math.MembraneRandomVariable; -import cbit.vcell.math.MembraneRegionEquation; -import cbit.vcell.math.MembraneRegionVariable; -import cbit.vcell.math.MembraneSubDomain; -import cbit.vcell.math.ParameterVariable; -import cbit.vcell.math.PdeEquation; import cbit.vcell.math.PdeEquation.BoundaryConditionValue; -import cbit.vcell.math.PostProcessingBlock; -import cbit.vcell.math.ProjectionDataGenerator; -import cbit.vcell.math.PseudoConstant; -import cbit.vcell.math.RandomVariable; -import cbit.vcell.math.ReservedVariable; -import cbit.vcell.math.SubDomain; import cbit.vcell.math.SubDomain.BoundaryConditionSpec; -import cbit.vcell.math.UniformDistribution; -import cbit.vcell.math.Variable; import cbit.vcell.math.Variable.Domain; -import cbit.vcell.math.VariableType; import cbit.vcell.math.VariableType.VariableDomain; -import cbit.vcell.math.VolVariable; -import cbit.vcell.math.VolumeParticleVariable; -import cbit.vcell.math.VolumeRandomVariable; -import cbit.vcell.math.VolumeRegionEquation; -import cbit.vcell.math.VolumeRegionVariable; import cbit.vcell.messaging.server.SimulationTask; -import cbit.vcell.parser.Discontinuity; -import cbit.vcell.parser.DivideByZeroException; -import cbit.vcell.parser.Expression; -import cbit.vcell.parser.ExpressionException; -import cbit.vcell.parser.FunctionInvocation; -import cbit.vcell.parser.RvachevFunctionUtils; -import cbit.vcell.parser.SymbolTable; +import cbit.vcell.parser.*; import cbit.vcell.render.Vect3d; import cbit.vcell.resource.PropertyLoader; -import cbit.vcell.simdata.DataSet; -import cbit.vcell.simdata.DataSetControllerImpl; -import cbit.vcell.simdata.SimDataBlock; -import cbit.vcell.simdata.SimDataConstants; -import cbit.vcell.simdata.SimulationData; -import cbit.vcell.solver.DefaultOutputTimeSpec; -import cbit.vcell.solver.ErrorTolerance; -import cbit.vcell.solver.MathOverrides; -import cbit.vcell.solver.OutputTimeSpec; -import cbit.vcell.solver.Simulation; -import cbit.vcell.solver.SimulationSymbolTable; -import cbit.vcell.solver.SmoldynSimulationOptions; -import cbit.vcell.solver.SolverDescription; -import cbit.vcell.solver.SolverException; -import cbit.vcell.solver.SolverTaskDescription; -import cbit.vcell.solver.SolverUtilities; -import cbit.vcell.solver.UniformOutputTimeSpec; -import cbit.vcell.solver.VCSimulationDataIdentifier; +import cbit.vcell.simdata.*; +import cbit.vcell.solver.*; import cbit.vcell.solver.server.SolverFileWriter; +import cbit.vcell.xml.XmlHelper; +import cbit.vcell.xml.XmlParseException; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.vcell.chombo.ChomboSolverSpec; +import org.vcell.chombo.RefinementRoi; +import org.vcell.chombo.RefinementRoi.RoiType; +import org.vcell.chombo.TimeInterval; +import org.vcell.solver.smoldyn.SmoldynFileWriter; +import org.vcell.util.*; + +import java.beans.PropertyVetoException; +import java.io.*; +import java.util.*; /** * Insert the type's description here. @@ -1940,7 +1869,7 @@ private void writeDistanceMapFile(Vect3d deltaX, SubvolumeSignedDistanceMap dist } } - private void writeChomboSpec() throws ExpressionException, SolverException, PropertyVetoException, ClassNotFoundException, IOException, GeometryException, ImageException{ + private void writeChomboSpec() throws ExpressionException, SolverException, PropertyVetoException, XmlParseException, IOException, GeometryException, ImageException{ if(!bChomboSolver){ return; } @@ -1996,7 +1925,7 @@ private void writeChomboSpec() throws ExpressionException, SolverException, Prop SubVolume[] subVolumes = geometrySpec.getSubVolumes(); if(geometrySpec.hasImage()){ - Geometry geometry = (Geometry) BeanUtils.cloneSerializable(simulation.getMathDescription().getGeometry()); + Geometry geometry = XmlHelper.cloneGeometry(simulation.getMathDescription().getGeometry()); Geometry simGeometry = geometry; VCImage img = geometry.getGeometrySpec().getImage(); diff --git a/vcell-core/src/main/java/cbit/vcell/solvers/MovingBoundarySolver.java b/vcell-core/src/main/java/cbit/vcell/solvers/MovingBoundarySolver.java index 58c399ab6d..04048fcdb5 100644 --- a/vcell-core/src/main/java/cbit/vcell/solvers/MovingBoundarySolver.java +++ b/vcell-core/src/main/java/cbit/vcell/solvers/MovingBoundarySolver.java @@ -9,12 +9,6 @@ */ package cbit.vcell.solvers; -import java.io.File; -import java.io.IOException; -import java.io.PrintWriter; - -import org.vcell.util.BeanUtils; -import org.vcell.util.ISize; import cbit.vcell.geometry.Geometry; import cbit.vcell.geometry.surface.GeometrySurfaceDescription; @@ -24,6 +18,12 @@ import cbit.vcell.solver.SolverUtilities; import cbit.vcell.solver.server.SimulationMessage; import cbit.vcell.solver.server.SolverStatus; +import cbit.vcell.xml.XmlHelper; +import org.vcell.util.ISize; + +import java.io.File; +import java.io.IOException; +import java.io.PrintWriter; /** * This interface was generated by a SmartGuide. @@ -188,7 +188,7 @@ public Geometry getResampledGeometry() throws SolverException { if (resampledGeometry == null) { // clone and resample geometry try { - resampledGeometry = (Geometry) BeanUtils.cloneSerializable(simTask.getSimulation().getMathDescription().getGeometry()); + resampledGeometry = XmlHelper.cloneGeometry(simTask.getSimulation().getMathDescription().getGeometry()); GeometrySurfaceDescription geoSurfaceDesc = resampledGeometry.getGeometrySurfaceDescription(); ISize newSize = simTask.getSimulation().getMeshSpecification().getSamplingSize(); geoSurfaceDesc.setVolumeSampleSize(newSize); diff --git a/vcell-core/src/main/java/cbit/vcell/xml/XmlHelper.java b/vcell-core/src/main/java/cbit/vcell/xml/XmlHelper.java index 5c395d0957..9fcc6a4662 100644 --- a/vcell-core/src/main/java/cbit/vcell/xml/XmlHelper.java +++ b/vcell-core/src/main/java/cbit/vcell/xml/XmlHelper.java @@ -16,7 +16,6 @@ import cbit.util.xml.VCLoggerException; import cbit.util.xml.XmlUtil; import cbit.vcell.biomodel.BioModel; -import cbit.vcell.biomodel.BioModelTransforms; import cbit.vcell.biomodel.ModelUnitConverter; import cbit.vcell.biomodel.meta.IdentifiableProvider; import cbit.vcell.biomodel.meta.VCMetaData; @@ -25,60 +24,49 @@ import cbit.vcell.field.FieldDataIdentifierSpec; import cbit.vcell.geometry.Geometry; import cbit.vcell.geometry.GeometryException; -import cbit.vcell.mapping.MappingException; -import cbit.vcell.mapping.MathMapping; -import cbit.vcell.mapping.MathSymbolMapping; import cbit.vcell.mapping.SimulationContext; import cbit.vcell.math.MathDescription; import cbit.vcell.mathmodel.MathModel; import cbit.vcell.messaging.server.SimulationTask; -import cbit.vcell.model.Kinetics; import cbit.vcell.model.ModelUnitSystem; -import cbit.vcell.model.Parameter; import cbit.vcell.model.ReactionStep; -import cbit.vcell.parser.Expression; import cbit.vcell.parser.ExpressionException; import cbit.vcell.resource.PropertyLoader; import cbit.vcell.solver.Simulation; -import cbit.vcell.solver.*; +import cbit.vcell.solver.SimulationJob; import cbit.xml.merge.NodeInfo; import cbit.xml.merge.XmlTreeDiff; import cbit.xml.merge.XmlTreeDiff.DiffConfiguration; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.jdom2.*; -import org.jlibsedml.*; +import org.jlibsedml.ArchiveComponents; +import org.jlibsedml.Libsedml; +import org.jlibsedml.SEDMLDocument; +import org.jlibsedml.SedML; import org.sbml.jsbml.SBMLException; import org.vcell.cellml.CellQuanVCTranslator; import org.vcell.sbml.SbmlException; import org.vcell.sbml.vcell.MathModel_SBMLExporter; import org.vcell.sbml.vcell.SBMLAnnotationUtil; import org.vcell.sbml.vcell.SBMLExporter; -import org.vcell.sbml.vcell.SBMLImportException; import org.vcell.sbml.vcell.SBMLImporter; import org.vcell.sedml.SEDMLImporter; +import org.vcell.util.BeanUtils; import org.vcell.util.Extent; import org.vcell.util.Pair; import org.vcell.util.TokenMangler; import org.vcell.util.document.VCDocument; import org.vcell.util.document.VCellSoftwareVersion; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.InputSource; -import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.stream.XMLStreamException; -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerFactory; -import javax.xml.transform.dom.DOMSource; -import javax.xml.transform.stream.StreamResult; -import javax.xml.xpath.XPath; -import javax.xml.xpath.XPathConstants; -import javax.xml.xpath.XPathFactory; - -import java.beans.PropertyVetoException; -import java.io.*; -import java.util.*; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; /** This class represents the 'API' of the XML framework for all VC classes, outside that framework. Most of the methods of @@ -95,6 +83,7 @@ this class throw an XmlParseException: */ public class XmlHelper { + public static boolean cloneUsingXML = true; private final static Logger logger = LogManager.getLogger(XmlHelper.class); //represent the containers XML element for the simulation/image data to be imported/exported. @@ -517,6 +506,72 @@ public static BioModel cloneBioModel(BioModel origBiomodel) throws XmlParseExcep return XMLToBioModel(newXMLSource); } + public static cbit.vcell.model.Model cloneModel(cbit.vcell.model.Model origModel) throws XmlParseException { + if (cloneUsingXML) { + Element modelElement = new Xmlproducer(true).getXML(origModel); + return new XmlReader(true).getModel(modelElement); + }else{ + try { + return (cbit.vcell.model.Model) BeanUtils.cloneSerializable(origModel); + }catch (ClassNotFoundException | IOException e){ + throw new XmlParseException("Unable to clone Model: " + origModel.getName(), e); + } + } + } + + public static SimulationContext cloneSimulationContext(SimulationContext origSimContext) throws XmlParseException { + if (cloneUsingXML) { + BioModel clonedBiomodel = cloneBioModel(origSimContext.getBioModel()); + return clonedBiomodel.getSimulationContext(origSimContext.getName()); + }else{ + try { + return (SimulationContext) BeanUtils.cloneSerializable(origSimContext); + }catch (ClassNotFoundException | IOException e){ + throw new XmlParseException("Unable to clone SimulationContext: " + origSimContext.getName(), e); + } + } + } + + public static Geometry cloneGeometry(Geometry origGeometry) throws XmlParseException { + if (cloneUsingXML) { + Element geoElement = new Xmlproducer(true).getXML(origGeometry); + return new XmlReader(true).getGeometry(geoElement); + }else{ + try { + return (Geometry) BeanUtils.cloneSerializable(origGeometry); + }catch (ClassNotFoundException | IOException e){ + throw new XmlParseException("Unable to clone Geometry: " + origGeometry.getName(), e); + } + } + } + + public static MathDescription cloneMathDescription(MathDescription origMathDescription) throws XmlParseException { + if (cloneUsingXML) { + Geometry clonedGeometry = cloneGeometry(origMathDescription.getGeometry()); + Element mathElement = new Xmlproducer(true).getXML(origMathDescription); + return new XmlReader(true).getMathDescription(mathElement, clonedGeometry); + }else{ + try { + return (MathDescription) BeanUtils.cloneSerializable(origMathDescription); + }catch (ClassNotFoundException | IOException e){ + throw new XmlParseException("Unable to clone MathDescription: " + origMathDescription.getName(), e); + } + } + } + + public static cbit.vcell.model.ReactionStep cloneReactionStep(ReactionStep origReactionStep) throws XmlParseException { + if (cloneUsingXML) { + cbit.vcell.model.Model clonedModel = cloneModel(origReactionStep.getModel()); + return clonedModel.getReactionStep(origReactionStep.getName()); + }else{ + try { + return (cbit.vcell.model.ReactionStep) BeanUtils.cloneSerializable(origReactionStep); + }catch (ClassNotFoundException | IOException e){ + throw new XmlParseException("Unable to clone ReactionStep: " + origReactionStep.getName(), e); + } + } + } + public static BioModel XMLToBioModel(XMLSource xmlSource, boolean printkeys, ModelUnitSystem forcedModelUnitSystem) throws XmlParseException { diff --git a/vcell-core/src/main/java/cbit/vcell/xml/Xmlproducer.java b/vcell-core/src/main/java/cbit/vcell/xml/Xmlproducer.java index f6fd0fc171..6e7f75ce09 100644 --- a/vcell-core/src/main/java/cbit/vcell/xml/Xmlproducer.java +++ b/vcell-core/src/main/java/cbit/vcell/xml/Xmlproducer.java @@ -3588,7 +3588,7 @@ else if (rpArray[i] instanceof Catalyst) * @return Element * @param param cbit.vcell.model.Kinetics */ -private Element getXML(Kinetics param) throws XmlParseException { +public Element getXML(Kinetics param) throws XmlParseException { String kineticsType = null; @@ -4279,7 +4279,7 @@ private Element getXML(ReactionParticipant param) { * @return Element * @param param cbit.vcell.model.ReactionStep */ -private Element getXML(ReactionStep param) throws XmlParseException { +public Element getXML(ReactionStep param) throws XmlParseException { Element rsElement = null; if (param instanceof FluxReaction) { rsElement = getXML((FluxReaction)param); diff --git a/vcell-core/src/main/java/org/vcell/optimization/OptXmlWriter.java b/vcell-core/src/main/java/org/vcell/optimization/OptXmlWriter.java index 7a65189b42..516ca29b9a 100644 --- a/vcell-core/src/main/java/org/vcell/optimization/OptXmlWriter.java +++ b/vcell-core/src/main/java/org/vcell/optimization/OptXmlWriter.java @@ -10,22 +10,6 @@ package org.vcell.optimization; -import java.io.File; -import java.io.IOException; -import java.io.PrintWriter; -import java.io.StringWriter; - -import javax.xml.stream.XMLStreamException; - -import cbit.vcell.solver.*; -import org.jdom2.CDATA; -import org.jdom2.Element; -import org.sbml.jsbml.SBMLException; -import org.vcell.sbml.vcell.MathModel_SBMLExporter; -import org.vcell.util.BeanUtils; -import org.vcell.util.ISize; -import org.vcell.util.document.KeyValue; - import cbit.util.xml.XmlUtil; import cbit.vcell.geometry.Geometry; import cbit.vcell.geometry.surface.GeometrySurfaceDescription; @@ -40,30 +24,28 @@ import cbit.vcell.messaging.server.SimulationTask; import cbit.vcell.modelopt.ParameterEstimationTask; import cbit.vcell.modelopt.ReferenceDataMappingSpec; -import cbit.vcell.opt.Constraint; -import cbit.vcell.opt.ConstraintType; -import cbit.vcell.opt.CopasiOptimizationMethod; -import cbit.vcell.opt.CopasiOptimizationParameter; -import cbit.vcell.opt.ElementWeights; -import cbit.vcell.opt.ExplicitFitObjectiveFunction; +import cbit.vcell.opt.*; import cbit.vcell.opt.ExplicitObjectiveFunction; import cbit.vcell.opt.ObjectiveFunction; -import cbit.vcell.opt.OptXmlTags; -import cbit.vcell.opt.OptimizationException; -import cbit.vcell.opt.OptimizationSolverSpec; -import cbit.vcell.opt.OptimizationSpec; -import cbit.vcell.opt.Parameter; -import cbit.vcell.opt.PdeObjectiveFunction; -import cbit.vcell.opt.ReferenceData; -import cbit.vcell.opt.SimpleReferenceData; -import cbit.vcell.opt.SpatialReferenceData; -import cbit.vcell.opt.TimeWeights; -import cbit.vcell.opt.VariableWeights; import cbit.vcell.parser.Expression; import cbit.vcell.parser.ExpressionException; import cbit.vcell.resource.ResourceUtil; +import cbit.vcell.solver.*; import cbit.vcell.solvers.FiniteVolumeFileWriter; +import cbit.vcell.xml.XmlHelper; import cbit.vcell.xml.XmlParseException; +import org.jdom2.CDATA; +import org.jdom2.Element; +import org.sbml.jsbml.SBMLException; +import org.vcell.sbml.vcell.MathModel_SBMLExporter; +import org.vcell.util.ISize; +import org.vcell.util.document.KeyValue; + +import javax.xml.stream.XMLStreamException; +import java.io.File; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; public class OptXmlWriter { @@ -384,7 +366,7 @@ public static Element getModelXML(PdeObjectiveFunction pdeObjectiveFunction, Str // clone and resample geometry Geometry resampledGeometry = null; try { - resampledGeometry = (Geometry) BeanUtils.cloneSerializable(simulation.getMathDescription().getGeometry()); + resampledGeometry = XmlHelper.cloneGeometry(simulation.getMathDescription().getGeometry()); GeometrySurfaceDescription geoSurfaceDesc = resampledGeometry.getGeometrySurfaceDescription(); ISize newSize = simulation.getMeshSpecification().getSamplingSize(); geoSurfaceDesc.setVolumeSampleSize(newSize); diff --git a/vcell-core/src/main/java/org/vcell/sbml/vcell/SBMLImporter.java b/vcell-core/src/main/java/org/vcell/sbml/vcell/SBMLImporter.java index 9cd73f4294..4dd853f051 100644 --- a/vcell-core/src/main/java/org/vcell/sbml/vcell/SBMLImporter.java +++ b/vcell-core/src/main/java/org/vcell/sbml/vcell/SBMLImporter.java @@ -17,11 +17,11 @@ import cbit.util.xml.VCLoggerException; import cbit.vcell.biomodel.BioModel; import cbit.vcell.biomodel.meta.VCMetaData; -import cbit.vcell.geometry.CSGObject; import cbit.vcell.geometry.*; +import cbit.vcell.geometry.CSGObject; import cbit.vcell.geometry.CSGPrimitive.PrimitiveType; -import cbit.vcell.geometry.Geometry; import cbit.vcell.geometry.CSGSetOperator.OperatorType; +import cbit.vcell.geometry.Geometry; import cbit.vcell.geometry.RegionImage.RegionInfo; import cbit.vcell.geometry.surface.GeometricRegion; import cbit.vcell.geometry.surface.GeometrySurfaceDescription; @@ -40,8 +40,8 @@ import cbit.vcell.model.*; import cbit.vcell.model.Kinetics.KineticsParameter; import cbit.vcell.model.Kinetics.KineticsProxyParameter; -import cbit.vcell.model.Model; import cbit.vcell.model.Kinetics.UnresolvedParameter; +import cbit.vcell.model.Model; import cbit.vcell.model.Model.ModelParameter; import cbit.vcell.model.Model.ReservedSymbol; import cbit.vcell.parser.*; @@ -51,24 +51,25 @@ import cbit.vcell.units.VCUnitDefinition; import cbit.vcell.units.VCUnitSystem; import cbit.vcell.xml.XMLTags; +import cbit.vcell.xml.XmlHelper; import org.apache.commons.io.FileUtils; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.jdom2.Element; import org.jdom2.Namespace; +import org.sbml.jsbml.*; import org.sbml.jsbml.AssignmentRule; import org.sbml.jsbml.Parameter; import org.sbml.jsbml.RateRule; import org.sbml.jsbml.Species; -import org.sbml.jsbml.*; +import org.sbml.jsbml.ext.spatial.*; import org.sbml.jsbml.ext.spatial.CSGHomogeneousTransformation; import org.sbml.jsbml.ext.spatial.CSGPseudoPrimitive; import org.sbml.jsbml.ext.spatial.CSGRotation; import org.sbml.jsbml.ext.spatial.CSGScale; import org.sbml.jsbml.ext.spatial.CSGSetOperator; import org.sbml.jsbml.ext.spatial.CSGTransformation; -import org.sbml.jsbml.ext.spatial.*; import org.sbml.jsbml.util.filters.IdFilter; import org.sbml.jsbml.xml.XMLNode; import org.vcell.sbml.SBMLHelper; @@ -2868,7 +2869,7 @@ private static void translateSBMLModel(org.sbml.jsbml.Model sbmlModel, BioModel Kinetics origKinetics = reactionStep.getKinetics(); // clone it for backup purposes origKinetics.setReactionStep(null); - Kinetics clonedKinetics = (Kinetics) BeanUtils.cloneSerializable(origKinetics); + Kinetics clonedKinetics = XmlHelper.cloneReactionStep(reactionStep).getKinetics(); origKinetics.setReactionStep(reactionStep); try { DistributedKinetics.toDistributedKinetics((LumpedKinetics) origKinetics, false); diff --git a/vcell-core/src/main/java/org/vcell/solver/smoldyn/SmoldynFileWriter.java b/vcell-core/src/main/java/org/vcell/solver/smoldyn/SmoldynFileWriter.java index 8104acd824..f942073f27 100644 --- a/vcell-core/src/main/java/org/vcell/solver/smoldyn/SmoldynFileWriter.java +++ b/vcell-core/src/main/java/org/vcell/solver/smoldyn/SmoldynFileWriter.java @@ -10,108 +10,46 @@ package org.vcell.solver.smoldyn; -import java.awt.Color; -import java.beans.PropertyVetoException; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.PrintStream; -import java.io.PrintWriter; -import java.util.ArrayList; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.SortedSet; -import java.util.StringTokenizer; -import java.util.TreeSet; -import java.util.zip.DeflaterOutputStream; - -import org.apache.commons.math3.random.RandomDataGenerator; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.vcell.solver.smoldyn.SmoldynVCellMapper.SmoldynKeyword; -import org.vcell.util.*; - import cbit.image.ImageException; import cbit.image.VCImage; import cbit.image.VCPixelClass; import cbit.vcell.field.FieldDataIdentifierSpec; -import cbit.vcell.geometry.Geometry; -import cbit.vcell.geometry.GeometryException; -import cbit.vcell.geometry.GeometrySpec; -import cbit.vcell.geometry.GeometryThumbnailImageFactoryAWT; +import cbit.vcell.geometry.*; import cbit.vcell.geometry.RegionImage.RegionInfo; -import cbit.vcell.geometry.SubVolume; -import cbit.vcell.geometry.SurfaceClass; -import cbit.vcell.geometry.surface.GeometricRegion; -import cbit.vcell.geometry.surface.GeometrySurfaceDescription; +import cbit.vcell.geometry.surface.*; import cbit.vcell.geometry.surface.Node; import cbit.vcell.geometry.surface.Polygon; -import cbit.vcell.geometry.surface.RayCaster; -import cbit.vcell.geometry.surface.Surface; -import cbit.vcell.geometry.surface.SurfaceCollection; -import cbit.vcell.geometry.surface.SurfaceGeometricRegion; -import cbit.vcell.geometry.surface.Triangle; -import cbit.vcell.geometry.surface.VolumeGeometricRegion; -import cbit.vcell.math.Action; -import cbit.vcell.math.BoundaryConditionType; -import cbit.vcell.math.CompartmentSubDomain; -import cbit.vcell.math.InteractionRadius; -import cbit.vcell.math.JumpProcessRateDefinition; -import cbit.vcell.math.MacroscopicRateConstant; -import cbit.vcell.math.MathDescription; -import cbit.vcell.math.MathException; -import cbit.vcell.math.MembraneParticleVariable; -import cbit.vcell.math.MembraneSubDomain; -import cbit.vcell.math.ParticleJumpProcess; -import cbit.vcell.math.ParticleProperties; +import cbit.vcell.math.*; import cbit.vcell.math.ParticleProperties.ParticleInitialCondition; import cbit.vcell.math.ParticleProperties.ParticleInitialConditionConcentration; import cbit.vcell.math.ParticleProperties.ParticleInitialConditionCount; -import cbit.vcell.math.ParticleVariable; -import cbit.vcell.math.ReservedVariable; -import cbit.vcell.math.SubDomain; -import cbit.vcell.math.Variable; import cbit.vcell.math.Variable.Domain; -import cbit.vcell.math.VariableType; -import cbit.vcell.math.VolumeParticleVariable; import cbit.vcell.message.VCellQueue; import cbit.vcell.message.VCellTopic; import cbit.vcell.messaging.server.SimulationTask; import cbit.vcell.model.common.VCellErrorMessages; -import cbit.vcell.parser.DivideByZeroException; -import cbit.vcell.parser.Expression; -import cbit.vcell.parser.ExpressionBindingException; -import cbit.vcell.parser.ExpressionException; -import cbit.vcell.parser.SimpleSymbolTable; +import cbit.vcell.parser.*; import cbit.vcell.render.Vect3d; import cbit.vcell.resource.PropertyLoader; -import cbit.vcell.simdata.DataSet; -import cbit.vcell.simdata.DataSetControllerImpl; -import cbit.vcell.simdata.SimDataBlock; -import cbit.vcell.simdata.SimDataConstants; -import cbit.vcell.simdata.SimulationData; -import cbit.vcell.solver.DataProcessingInstructions; -import cbit.vcell.solver.MeshSpecification; -import cbit.vcell.solver.OutputTimeSpec; -import cbit.vcell.solver.Simulation; -import cbit.vcell.solver.SimulationJob; -import cbit.vcell.solver.SimulationSymbolTable; -import cbit.vcell.solver.SmoldynSimulationOptions; -import cbit.vcell.solver.SolverDescription; -import cbit.vcell.solver.SolverException; -import cbit.vcell.solver.TimeBounds; -import cbit.vcell.solver.TimeStep; -import cbit.vcell.solver.UniformOutputTimeSpec; +import cbit.vcell.simdata.*; +import cbit.vcell.solver.*; import cbit.vcell.solver.server.SolverFileWriter; import cbit.vcell.solvers.CartesianMesh; import cbit.vcell.solvers.FiniteVolumeFileWriter; import cbit.vcell.solvers.MembraneElement; +import cbit.vcell.xml.XmlHelper; +import org.apache.commons.math3.random.RandomDataGenerator; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.vcell.solver.smoldyn.SmoldynVCellMapper.SmoldynKeyword; +import org.vcell.util.*; + +import java.awt.*; +import java.beans.PropertyVetoException; +import java.io.*; +import java.util.*; +import java.util.List; +import java.util.zip.DeflaterOutputStream; /** @@ -265,7 +203,7 @@ private void init() throws SolverException{ dimension = geometry.getDimension(); try { // clone and resample geometry - resampledGeometry = (Geometry) BeanUtils.cloneSerializable(geometry); + resampledGeometry = XmlHelper.cloneGeometry(geometry); GeometrySurfaceDescription geoSurfaceDesc = resampledGeometry.getGeometrySurfaceDescription(); ISize newSize = simulation.getMeshSpecification().getSamplingSize(); geoSurfaceDesc.setVolumeSampleSize(newSize); diff --git a/vcell-core/src/main/java/org/vcell/solver/smoldyn/SmoldynSurfaceTessellator.java b/vcell-core/src/main/java/org/vcell/solver/smoldyn/SmoldynSurfaceTessellator.java index eb5f84fc4d..d7b71a5c76 100644 --- a/vcell-core/src/main/java/org/vcell/solver/smoldyn/SmoldynSurfaceTessellator.java +++ b/vcell-core/src/main/java/org/vcell/solver/smoldyn/SmoldynSurfaceTessellator.java @@ -1,48 +1,11 @@ package org.vcell.solver.smoldyn; -import java.awt.Color; -import java.beans.PropertyVetoException; -import java.io.PrintWriter; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.Set; -import java.util.SortedSet; -import java.util.TreeSet; - -import org.apache.commons.io.output.NullWriter; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.vcell.solver.smoldyn.SmoldynFileWriter.NotAConstantException; -import org.vcell.util.BeanUtils; -import org.vcell.util.ISize; - import cbit.image.ImageException; -import cbit.vcell.geometry.Geometry; -import cbit.vcell.geometry.GeometryException; -import cbit.vcell.geometry.GeometrySpec; -import cbit.vcell.geometry.SubVolume; -import cbit.vcell.geometry.SurfaceClass; -import cbit.vcell.geometry.surface.GeometricRegion; -import cbit.vcell.geometry.surface.GeometrySurfaceDescription; -import cbit.vcell.geometry.surface.Node; +import cbit.vcell.geometry.*; +import cbit.vcell.geometry.surface.*; import cbit.vcell.geometry.surface.Polygon; -import cbit.vcell.geometry.surface.Surface; -import cbit.vcell.geometry.surface.SurfaceCollection; -import cbit.vcell.geometry.surface.SurfaceGeometricRegion; -import cbit.vcell.geometry.surface.Triangle; -import cbit.vcell.geometry.surface.VolumeGeometricRegion; -import cbit.vcell.math.CompartmentSubDomain; -import cbit.vcell.math.MathDescription; -import cbit.vcell.math.MathException; -import cbit.vcell.math.MembraneSubDomain; +import cbit.vcell.math.*; import cbit.vcell.math.ParticleProperties.ParticleInitialConditionCount; -import cbit.vcell.math.ParticleVariable; import cbit.vcell.messaging.server.SimulationTask; import cbit.vcell.model.common.VCellErrorMessages; import cbit.vcell.parser.ExpressionException; @@ -51,6 +14,18 @@ import cbit.vcell.solver.SolverException; import cbit.vcell.solver.server.SolverFileWriter; import cbit.vcell.solvers.MembraneElement; +import cbit.vcell.xml.XmlHelper; +import org.apache.commons.io.output.NullWriter; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.vcell.solver.smoldyn.SmoldynFileWriter.NotAConstantException; +import org.vcell.util.ISize; + +import java.awt.*; +import java.beans.PropertyVetoException; +import java.io.PrintWriter; +import java.util.*; +import java.util.List; public class SmoldynSurfaceTessellator extends SolverFileWriter { @@ -214,7 +189,7 @@ public void write(String[] parameterNames) throws Exception { protected void cloneAndResample(Geometry geometry) throws Exception { // clone and resample geometry - resampledGeometry = (Geometry) BeanUtils.cloneSerializable(geometry); + resampledGeometry = XmlHelper.cloneGeometry(geometry); GeometrySurfaceDescription geoSurfaceDesc = resampledGeometry.getGeometrySurfaceDescription(); ISize newSize = simulation.getMeshSpecification().getSamplingSize(); geoSurfaceDesc.setVolumeSampleSize(newSize); From b7a83b5e0488ed0119f96d8be90081112a066498 Mon Sep 17 00:00:00 2001 From: jcschaff Date: Wed, 9 Apr 2025 19:54:35 -0400 Subject: [PATCH 04/12] deepClone() for BNG Spec objects --- .../cbit/vcell/bionetgen/BNGMolecule.java | 11 ++++++++ .../cbit/vcell/bionetgen/BNGOutputSpec.java | 27 +++++++++++++++++++ .../cbit/vcell/bionetgen/BNGParameter.java | 4 +++ .../cbit/vcell/bionetgen/BNGReaction.java | 18 +++++++++++++ .../cbit/vcell/bionetgen/BNGReactionRule.java | 16 +++++++++++ .../java/cbit/vcell/bionetgen/BNGSpecies.java | 10 ++++++- .../vcell/bionetgen/BNGSpeciesComponent.java | 11 ++++++++ .../cbit/vcell/bionetgen/ObservableGroup.java | 9 +++++++ .../vcell/mapping/NetworkTransformer.java | 4 +-- 9 files changed, 107 insertions(+), 3 deletions(-) diff --git a/vcell-core/src/main/java/cbit/vcell/bionetgen/BNGMolecule.java b/vcell-core/src/main/java/cbit/vcell/bionetgen/BNGMolecule.java index 44c4861891..ad0d665eb7 100644 --- a/vcell-core/src/main/java/cbit/vcell/bionetgen/BNGMolecule.java +++ b/vcell-core/src/main/java/cbit/vcell/bionetgen/BNGMolecule.java @@ -117,4 +117,15 @@ public void setComponentsStates(){ public String toString(){ return getName(); } + + public BNGMolecule deepClone() { + BNGMolecule bngMoleculeClone = new BNGMolecule(getName()); + if (molComponents != null) { + bngMoleculeClone.molComponents = new BNGSpeciesComponent[molComponents.length]; + for (int i = 0; i < molComponents.length; i++) { + bngMoleculeClone.molComponents[i] = molComponents[i].deepClone(); + } + } + return bngMoleculeClone; + } } diff --git a/vcell-core/src/main/java/cbit/vcell/bionetgen/BNGOutputSpec.java b/vcell-core/src/main/java/cbit/vcell/bionetgen/BNGOutputSpec.java index 5c87315458..5a679fa408 100644 --- a/vcell-core/src/main/java/cbit/vcell/bionetgen/BNGOutputSpec.java +++ b/vcell-core/src/main/java/cbit/vcell/bionetgen/BNGOutputSpec.java @@ -49,6 +49,33 @@ public BNGOutputSpec(BNGParameter[] argParams, BNGMolecule[] argMols, BNGSpecies } } +public BNGOutputSpec deepClone() { + BNGParameter[] bngParamsClone = new BNGParameter[bngParams.length]; + for (int i = 0; i < bngParams.length; i++) { + bngParamsClone[i] = bngParams[i].deepClone(); + } + BNGMolecule[] bngMoleculeTypesClone = new BNGMolecule[bngMoleculeTypes.length]; + for (int i = 0; i < bngMoleculeTypes.length; i++) { + bngMoleculeTypesClone[i] = bngMoleculeTypes[i].deepClone(); + } + BNGSpecies[] bngSpeciesClone = new BNGSpecies[bngSpecies.length]; + for (int i = 0; i < bngSpecies.length; i++) { + bngSpeciesClone[i] = bngSpecies[i].deepClone(); + } + BNGReactionRule[] bngReactionRulesClone = new BNGReactionRule[bngReactionRules.length]; + for (int i = 0; i < bngReactionRules.length; i++) { + bngReactionRulesClone[i] = bngReactionRules[i].deepClone(); + } + BNGReaction[] bngReactionsClone = new BNGReaction[bngReactions.length]; + for (int i = 0; i < bngReactions.length; i++) { + bngReactionsClone[i] = bngReactions[i].deepClone(); + } + ObservableGroup[] bngObservableGroupsClone = new ObservableGroup[bngObservableGroups.length]; + for (int i = 0; i < bngObservableGroups.length; i++) { + bngObservableGroupsClone[i] = bngObservableGroups[i].deepClone(); + } + return new BNGOutputSpec(bngParamsClone, bngMoleculeTypesClone, bngSpeciesClone, bngReactionRulesClone, bngReactionsClone, bngObservableGroupsClone); +} public BNGMolecule[] getBNGMolecules() { return bngMoleculeTypes; } diff --git a/vcell-core/src/main/java/cbit/vcell/bionetgen/BNGParameter.java b/vcell-core/src/main/java/cbit/vcell/bionetgen/BNGParameter.java index 38ce379949..9895b8df21 100644 --- a/vcell-core/src/main/java/cbit/vcell/bionetgen/BNGParameter.java +++ b/vcell-core/src/main/java/cbit/vcell/bionetgen/BNGParameter.java @@ -69,4 +69,8 @@ public void setValue(double argValue) { public String toString() { return new String(getName() + ";\t" + getValue()); } + + public BNGParameter deepClone() { + return new BNGParameter(name, value); + } } diff --git a/vcell-core/src/main/java/cbit/vcell/bionetgen/BNGReaction.java b/vcell-core/src/main/java/cbit/vcell/bionetgen/BNGReaction.java index 1d845f998c..af7ccd262e 100644 --- a/vcell-core/src/main/java/cbit/vcell/bionetgen/BNGReaction.java +++ b/vcell-core/src/main/java/cbit/vcell/bionetgen/BNGReaction.java @@ -354,4 +354,22 @@ public String toStringShort() { } return reactionStr; } + + + public BNGReaction deepClone() { + BNGSpecies[] bngReactantsClone = new BNGSpecies[reactants.length]; + for (int i = 0; i < reactants.length; i++) { + bngReactantsClone[i] = reactants[i].deepClone(); + } + BNGSpecies[] bngProductsClone = new BNGSpecies[products.length]; + for (int i = 0; i < products.length; i++) { + bngProductsClone[i] = products[i].deepClone(); + } + Expression newParamExpression = paramExpression; + if (newParamExpression != null) { + newParamExpression = new Expression(paramExpression); + } + BNGReaction bngReactionClone = new BNGReaction(matchingKey, matchingKey, bngReactantsClone, bngProductsClone, newParamExpression, ruleName, bRuleReversed); + return bngReactionClone; + } } diff --git a/vcell-core/src/main/java/cbit/vcell/bionetgen/BNGReactionRule.java b/vcell-core/src/main/java/cbit/vcell/bionetgen/BNGReactionRule.java index f947951c63..8c28f74564 100644 --- a/vcell-core/src/main/java/cbit/vcell/bionetgen/BNGReactionRule.java +++ b/vcell-core/src/main/java/cbit/vcell/bionetgen/BNGReactionRule.java @@ -186,4 +186,20 @@ public String writeReaction() { return reactionStr; } + + public BNGReactionRule deepClone() { + BNGParameter[] bngParamsClone = new BNGParameter[parameters.length]; + for (int i = 0; i < parameters.length; i++) { + bngParamsClone[i] = parameters[i].deepClone(); + } + BNGSpecies[] bngReactantsClone = new BNGSpecies[reactants.length]; + for (int i = 0; i < reactants.length; i++) { + bngReactantsClone[i] = reactants[i].deepClone(); + } + BNGSpecies[] bngProductsClone = new BNGSpecies[products.length]; + for (int i = 0; i < products.length; i++) { + bngProductsClone[i] = products[i].deepClone(); + } + return new BNGReactionRule(bngParamsClone, bngReactantsClone, bngProductsClone, isReversible()); + } } diff --git a/vcell-core/src/main/java/cbit/vcell/bionetgen/BNGSpecies.java b/vcell-core/src/main/java/cbit/vcell/bionetgen/BNGSpecies.java index bceeca17c5..71da697f60 100644 --- a/vcell-core/src/main/java/cbit/vcell/bionetgen/BNGSpecies.java +++ b/vcell-core/src/main/java/cbit/vcell/bionetgen/BNGSpecies.java @@ -122,7 +122,15 @@ public String toStringShort() { return new String(getName()); } -public enum SignatureDetailLevel { + public BNGSpecies deepClone() { + Expression newConc = getConcentration(); + if (newConc != null) { + newConc = new Expression(newConc); + } + return new BNGComplexSpecies(getName(), newConc, getNetworkFileIndex()); + } + + public enum SignatureDetailLevel { MoleculesOnly, ComponentsAndStates // molecules and components with states, no bond } diff --git a/vcell-core/src/main/java/cbit/vcell/bionetgen/BNGSpeciesComponent.java b/vcell-core/src/main/java/cbit/vcell/bionetgen/BNGSpeciesComponent.java index 2624ea82ca..ea40ada45d 100644 --- a/vcell-core/src/main/java/cbit/vcell/bionetgen/BNGSpeciesComponent.java +++ b/vcell-core/src/main/java/cbit/vcell/bionetgen/BNGSpeciesComponent.java @@ -88,4 +88,15 @@ public String extractComponentPatternSignature() { } return prefix; } + + public BNGSpeciesComponent deepClone() { + String[] newStateNames = null; + if (stateNames != null) { + newStateNames = new String[stateNames.length]; + for (int i = 0; i < stateNames.length; i++) { + newStateNames[i] = stateNames[i]; + } + } + return new BNGSpeciesComponent(componentName, currentState, newStateNames); + } } diff --git a/vcell-core/src/main/java/cbit/vcell/bionetgen/ObservableGroup.java b/vcell-core/src/main/java/cbit/vcell/bionetgen/ObservableGroup.java index 774cc9d245..4da3c3e57f 100644 --- a/vcell-core/src/main/java/cbit/vcell/bionetgen/ObservableGroup.java +++ b/vcell-core/src/main/java/cbit/vcell/bionetgen/ObservableGroup.java @@ -117,4 +117,13 @@ public List getIndexesAsIntegersList() { return list; } + public ObservableGroup deepClone() { + BNGSpecies[] listofSpeciesClone = new BNGSpecies[listofSpecies.length]; + for (int i = 0; i < listofSpecies.length; i++) { + listofSpeciesClone[i] = listofSpecies[i].deepClone(); + } + int[] speciesMultiplicityClone = new int[speciesMultiplicity.length]; + System.arraycopy(speciesMultiplicity, 0, speciesMultiplicityClone, 0, speciesMultiplicity.length); + return new ObservableGroup(observableGroupName, listofSpeciesClone, speciesMultiplicityClone); + } } diff --git a/vcell-core/src/main/java/cbit/vcell/mapping/NetworkTransformer.java b/vcell-core/src/main/java/cbit/vcell/mapping/NetworkTransformer.java index 69310b07ca..2a4c226c92 100644 --- a/vcell-core/src/main/java/cbit/vcell/mapping/NetworkTransformer.java +++ b/vcell-core/src/main/java/cbit/vcell/mapping/NetworkTransformer.java @@ -207,7 +207,7 @@ private BNGOutputSpec generateNetwork(SimulationContext simContext, MathMappingC simContext.appendToConsole(tcm); } outputSpec = simContext.getMostRecentlyCreatedOutputSpec(); - return (BNGOutputSpec)BeanUtils.cloneSerializable(outputSpec); + return outputSpec.deepClone(); } BNGInput bngInput = new BNGInput(input); @@ -282,7 +282,7 @@ private BNGOutputSpec generateNetwork(SimulationContext simContext, MathMappingC } else { lg.debug("something is wrong with the hash and/or output spec"); } - return (BNGOutputSpec)BeanUtils.cloneSerializable(outputSpec); + return outputSpec.deepClone(); } static final float progressFractionQuota = 2.0f/5.0f; From 5aa0934f65398547eabe1463b8333ac1c469bfd1 Mon Sep 17 00:00:00 2001 From: jcschaff Date: Wed, 9 Apr 2025 20:18:23 -0400 Subject: [PATCH 05/12] deepClone surfaces --- .../java/cbit/vcell/geometry/gui/SurfaceViewer.java | 2 +- .../cbit/vcell/geometry/surface/AbstractPolygon.java | 2 +- .../java/cbit/vcell/geometry/surface/FastSurface.java | 6 ++++++ .../java/cbit/vcell/geometry/surface/OrigSurface.java | 10 ++++++++++ .../main/java/cbit/vcell/geometry/surface/Polygon.java | 2 ++ .../cbit/vcell/geometry/surface/Quadrilateral.java | 4 ++++ .../java/cbit/vcell/geometry/surface/Triangle.java | 4 +++- 7 files changed, 27 insertions(+), 3 deletions(-) diff --git a/vcell-client/src/main/java/cbit/vcell/geometry/gui/SurfaceViewer.java b/vcell-client/src/main/java/cbit/vcell/geometry/gui/SurfaceViewer.java index f114dcc1e5..fd19c8c560 100644 --- a/vcell-client/src/main/java/cbit/vcell/geometry/gui/SurfaceViewer.java +++ b/vcell-client/src/main/java/cbit/vcell/geometry/gui/SurfaceViewer.java @@ -550,7 +550,7 @@ private cbit.vcell.geometry.surface.SurfaceCollection getCentroidSurface(cbit.vc cbit.vcell.geometry.surface.OrigSurface quadSurface = (cbit.vcell.geometry.surface.OrigSurface)quadSurfaceCollection.getSurfaces(0); cbit.vcell.geometry.surface.OrigSurface quadSurfaceCopy = null; try { - quadSurfaceCopy = (cbit.vcell.geometry.surface.OrigSurface)org.vcell.util.BeanUtils.cloneSerializable(quadSurface); + quadSurfaceCopy = quadSurface.deepClone(); }catch (Throwable e){ e.printStackTrace(System.out); throw new RuntimeException(e.getMessage()); diff --git a/vcell-core/src/main/java/cbit/vcell/geometry/surface/AbstractPolygon.java b/vcell-core/src/main/java/cbit/vcell/geometry/surface/AbstractPolygon.java index 7c379c4d4c..23fc4ef914 100644 --- a/vcell-core/src/main/java/cbit/vcell/geometry/surface/AbstractPolygon.java +++ b/vcell-core/src/main/java/cbit/vcell/geometry/surface/AbstractPolygon.java @@ -28,7 +28,7 @@ * @author: John Wagner */ @SuppressWarnings("serial") -public class AbstractPolygon implements Polygon, PolygonConcept, java.io.Serializable { +public abstract class AbstractPolygon implements Polygon, PolygonConcept, java.io.Serializable { private final Node[] fieldNodes; /** diff --git a/vcell-core/src/main/java/cbit/vcell/geometry/surface/FastSurface.java b/vcell-core/src/main/java/cbit/vcell/geometry/surface/FastSurface.java index 5b391557e9..61e10b812b 100644 --- a/vcell-core/src/main/java/cbit/vcell/geometry/surface/FastSurface.java +++ b/vcell-core/src/main/java/cbit/vcell/geometry/surface/FastSurface.java @@ -99,6 +99,9 @@ public double getArea() { double crossz = vect1x*vect2y - vect1y*vect2x; return Math.sqrt(crossx*crossx + crossy*crossy + crossz*crossz)/2.0; } + public FastTriangle deepClone() { + return new FastTriangle(nodes.clone()); + } public void getUnitNormal(cbit.vcell.render.Vect3d unitNormal) { Node node_0 = nodes[0]; Node node_1 = nodes[1]; @@ -212,6 +215,9 @@ public class FastQuad extends FastPolygon { FastQuad(Node[] argNodes) { super(argNodes); } + public FastQuad deepClone() { + return new FastQuad(nodes.clone()); + } public double getArea() { // assume convex Node node_0 = nodes[0]; diff --git a/vcell-core/src/main/java/cbit/vcell/geometry/surface/OrigSurface.java b/vcell-core/src/main/java/cbit/vcell/geometry/surface/OrigSurface.java index 823d64bad6..8356fa13bc 100644 --- a/vcell-core/src/main/java/cbit/vcell/geometry/surface/OrigSurface.java +++ b/vcell-core/src/main/java/cbit/vcell/geometry/surface/OrigSurface.java @@ -121,4 +121,14 @@ public void reverseDirection() { getPolygons(i).reverseDirection(); } } + + public OrigSurface deepClone() { + OrigSurface origSurface = new OrigSurface(fieldInteriorRegionIndex, fieldExteriorRegionIndex); + for (int i = 0; i < fieldPolygons.size(); i++) { + origSurface.addPolygon(fieldPolygons.get(i).deepClone()); + } + origSurface.setInteriorMask(interiorMask); + origSurface.setExteriorMask(exteriorMask); + return origSurface; + } } diff --git a/vcell-core/src/main/java/cbit/vcell/geometry/surface/Polygon.java b/vcell-core/src/main/java/cbit/vcell/geometry/surface/Polygon.java index dffab4e026..7355eff6ee 100644 --- a/vcell-core/src/main/java/cbit/vcell/geometry/surface/Polygon.java +++ b/vcell-core/src/main/java/cbit/vcell/geometry/surface/Polygon.java @@ -53,5 +53,7 @@ public interface Polygon { * Quadrilateral constructor comment. */ public void reverseDirection(); + + Polygon deepClone(); } diff --git a/vcell-core/src/main/java/cbit/vcell/geometry/surface/Quadrilateral.java b/vcell-core/src/main/java/cbit/vcell/geometry/surface/Quadrilateral.java index bd3d3e4f09..a2ebee7cbe 100644 --- a/vcell-core/src/main/java/cbit/vcell/geometry/surface/Quadrilateral.java +++ b/vcell-core/src/main/java/cbit/vcell/geometry/surface/Quadrilateral.java @@ -26,6 +26,10 @@ public Quadrilateral(Node[] nodes, int argVolIndexNeighbor1, int argVolIndexNeig volIndexNeighbor1 = argVolIndexNeighbor1; volIndexNeighbor2 = argVolIndexNeighbor2; } + +public Quadrilateral deepClone() { + return new Quadrilateral(getNodes().clone(), volIndexNeighbor1, volIndexNeighbor2); +} /** * Quadrilateral constructor comment. */ diff --git a/vcell-core/src/main/java/cbit/vcell/geometry/surface/Triangle.java b/vcell-core/src/main/java/cbit/vcell/geometry/surface/Triangle.java index 5f41633b46..f80e18d75d 100644 --- a/vcell-core/src/main/java/cbit/vcell/geometry/surface/Triangle.java +++ b/vcell-core/src/main/java/cbit/vcell/geometry/surface/Triangle.java @@ -45,7 +45,9 @@ public Triangle(Node n0, Node n1, Node n2) { super(new Node[] {n0, n1, n2}); } - +public Triangle deepClone() { + return new Triangle(getNodes().clone()); +} /** * Insert the method's description here. * Creation date: (5/6/2004 2:14:34 PM) From 1da62f9599d5c0c08adfd644315774499af4b5d3 Mon Sep 17 00:00:00 2001 From: jcschaff Date: Wed, 9 Apr 2025 20:19:21 -0400 Subject: [PATCH 06/12] deep clone some math objects --- .../java/cbit/vcell/math/JumpCondition.java | 18 ++++++++++++++++++ .../java/cbit/vcell/math/MathDescription.java | 13 ++++++------- .../cbit/vcell/simdata/SimulationData.java | 2 +- .../cbit/vcell/solver/AnnotatedFunction.java | 4 ++++ .../java/cbit/vcell/parser/Expression.java | 11 ++++++++++- .../vcell/modeldb/ServerDocumentManager.java | 2 +- 6 files changed, 40 insertions(+), 10 deletions(-) diff --git a/vcell-core/src/main/java/cbit/vcell/math/JumpCondition.java b/vcell-core/src/main/java/cbit/vcell/math/JumpCondition.java index 49a4853b5c..e8202d52ff 100644 --- a/vcell-core/src/main/java/cbit/vcell/math/JumpCondition.java +++ b/vcell-core/src/main/java/cbit/vcell/math/JumpCondition.java @@ -13,6 +13,7 @@ import java.util.Enumeration; import java.util.Vector; +import jscl.math.function.Exp; import org.vcell.util.CommentStringTokenizer; import org.vcell.util.Compare; import org.vcell.util.Matchable; @@ -213,4 +214,21 @@ public void checkValid(MathDescription mathDesc, SubDomain subDomain) throws Mat expList.add(outFluxExp); checkValid_Membrane(mathDesc, expList, (MembraneSubDomain)subDomain); } + + public JumpCondition deepClone() { + final JumpCondition jumpCondition; + if (getVariable() instanceof VolVariable volVar){ + jumpCondition = new JumpCondition(volVar); + }else if (getVariable() instanceof VolumeRegionVariable volRegVar){ + jumpCondition = new JumpCondition(volRegVar); + }else{ + throw new RuntimeException("JumpCondition deepClone() - unexpected variable type: " + getVariable().getClass().getName()); + } + jumpCondition.setInFlux(Expression.clone(getInFluxExpression())); + jumpCondition.setOutFlux(Expression.clone(getOutFluxExpression())); + jumpCondition.setInitialExpression(Expression.clone(getInitialExpression())); + jumpCondition.setRateExpression(Expression.clone(getRateExpression())); + jumpCondition.setExactSolution(Expression.clone(getExactSolution())); + return jumpCondition; + } } diff --git a/vcell-core/src/main/java/cbit/vcell/math/MathDescription.java b/vcell-core/src/main/java/cbit/vcell/math/MathDescription.java index c71e910dd9..61d7c681a9 100644 --- a/vcell-core/src/main/java/cbit/vcell/math/MathDescription.java +++ b/vcell-core/src/main/java/cbit/vcell/math/MathDescription.java @@ -30,8 +30,8 @@ import org.vcell.util.*; import org.vcell.util.Issue.IssueCategory; import org.vcell.util.Issue.IssueSource; -import org.vcell.util.Token; import org.vcell.util.IssueContext.ContextType; +import org.vcell.util.Token; import org.vcell.util.document.BioModelChildSummary.MathType; import org.vcell.util.document.KeyValue; import org.vcell.util.document.Version; @@ -39,7 +39,6 @@ import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; -import java.io.IOException; import java.io.Serializable; import java.util.*; import java.util.function.Consumer; @@ -3954,12 +3953,12 @@ private static boolean tryLegacyVarNameDomainExtensive(MathDescription mathDescr continue; } try { - Variable clonedVar = (Variable) BeanUtils.cloneSerializable(oldVar); + Variable clonedVar = oldVar.deepClone(); clonedVar.rename(newName); SubDomain sd = mathDescription1.getSubDomain(mathDescription2.getVariable(newName).getDomain().getName()); clonedVar.setDomain(new Domain(sd)); mathDescription1.addVariable0(clonedVar); - } catch(ClassNotFoundException | ExpressionBindingException | IOException | MathException e){ + } catch(ExpressionBindingException | MathException e){ lg.error("could not add new variable " + newName); return false; } @@ -4018,19 +4017,19 @@ private static boolean tryLegacyVarNameDomainExtensive(MathDescription mathDescr CompartmentSubDomain isd = msd.getInsideCompartment(); CompartmentSubDomain osd = msd.getOutsideCompartment(); if(isd != null && subDomainMap.get(isd) != null){ - JumpCondition ijc = (JumpCondition) BeanUtils.cloneSerializable(jc); + JumpCondition ijc = jc.deepClone(); ijc.setVar(mathDescription1.getVariable(subDomainMap.get(isd))); ijc.setOutFlux(new Expression(0.0)); msd.addJumpCondition(ijc); } if(osd != null && subDomainMap.get(osd) != null){ - JumpCondition ojc = (JumpCondition) BeanUtils.cloneSerializable(jc); + JumpCondition ojc = jc.deepClone(); ojc.setVar(mathDescription1.getVariable(subDomainMap.get(osd))); ojc.setInFlux(new Expression(0.0)); msd.addJumpCondition(ojc); } msd.removeJumpCondition(oldVar); - } catch(ClassNotFoundException | IOException | MathException e){ + } catch(MathException e){ lg.error("could not split jump condition for " + oldName); return false; } diff --git a/vcell-core/src/main/java/cbit/vcell/simdata/SimulationData.java b/vcell-core/src/main/java/cbit/vcell/simdata/SimulationData.java index f1f9b19208..807614bd37 100644 --- a/vcell-core/src/main/java/cbit/vcell/simdata/SimulationData.java +++ b/vcell-core/src/main/java/cbit/vcell/simdata/SimulationData.java @@ -400,7 +400,7 @@ public AnnotatedFunction simplifyFunction(AnnotatedFunction function) throws Exp // attempt to bind function and substitute AnnotatedFunction simpleFunction = null; try { - simpleFunction = (AnnotatedFunction)BeanUtils.cloneSerializable(function); + simpleFunction = function.deepClone(); Expression exp = simpleFunction.getExpression(); exp = SolverUtilities.substituteSizeAndNormalFunctions(exp, function.getFunctionType().getVariableDomain()); exp.bindExpression(this); diff --git a/vcell-core/src/main/java/cbit/vcell/solver/AnnotatedFunction.java b/vcell-core/src/main/java/cbit/vcell/solver/AnnotatedFunction.java index 3f439cda74..eef9e48fd0 100644 --- a/vcell-core/src/main/java/cbit/vcell/solver/AnnotatedFunction.java +++ b/vcell-core/src/main/java/cbit/vcell/solver/AnnotatedFunction.java @@ -44,6 +44,10 @@ public enum FunctionCategory { public AnnotatedFunction(String argFunctionName, Expression argFunctionExpression, Domain domain, String argErrString, VariableType argFunctionType, FunctionCategory fc) { this(argFunctionName, argFunctionExpression, domain, argFunctionName, argErrString, argFunctionType, fc); } + + public AnnotatedFunction deepClone() { + return new AnnotatedFunction(getName(), Expression.clone(getExpression()), getDomain(), getErrorString(), getFunctionType(), getFunctionCatogery()); + } /** * AnnotatedFunction constructor comment. diff --git a/vcell-math/src/main/java/cbit/vcell/parser/Expression.java b/vcell-math/src/main/java/cbit/vcell/parser/Expression.java index d4b3fdc06d..df62b65059 100644 --- a/vcell-math/src/main/java/cbit/vcell/parser/Expression.java +++ b/vcell-math/src/main/java/cbit/vcell/parser/Expression.java @@ -140,7 +140,16 @@ public static Expression assign(Expression lvalueExp, Expression rvalueExp) thro exp.rootNode = assignNode; return exp; } - public void bindExpression(SymbolTable symbolTable) throws ExpressionBindingException + + public static Expression clone(Expression exp) { + if (exp == null){ + return null; + }else{ + return new Expression(exp); + } + } + + public void bindExpression(SymbolTable symbolTable) throws ExpressionBindingException { bindCount++;///////////////// rootNode.bind(symbolTable); diff --git a/vcell-server/src/main/java/cbit/vcell/modeldb/ServerDocumentManager.java b/vcell-server/src/main/java/cbit/vcell/modeldb/ServerDocumentManager.java index ea3a00f67a..021db7b210 100644 --- a/vcell-server/src/main/java/cbit/vcell/modeldb/ServerDocumentManager.java +++ b/vcell-server/src/main/java/cbit/vcell/modeldb/ServerDocumentManager.java @@ -271,7 +271,7 @@ public String getBioModelUnresolved(QueryHashtable dbc, User user, KeyValue bioM // clone SimulationContexts so as to isolate different MathModels // try { - scArray[i] = (SimulationContext) BeanUtils.cloneSerializable(sc); + scArray[i] = XmlHelper.cloneSimulationContext(sc); scArray[i].getModel().refreshDependencies(); scArray[i].refreshDependencies(); scArray[i].setModel(model); From 0e8513a2c32734045bfcf0e63679d3724c5c61f5 Mon Sep 17 00:00:00 2001 From: jcschaff Date: Wed, 9 Apr 2025 21:04:10 -0400 Subject: [PATCH 07/12] restored Bean.cloneSerializable for unimplemented deepClone() --- .../src/main/java/cbit/vcell/math/MathDescription.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/vcell-core/src/main/java/cbit/vcell/math/MathDescription.java b/vcell-core/src/main/java/cbit/vcell/math/MathDescription.java index 61d7c681a9..7342c725f5 100644 --- a/vcell-core/src/main/java/cbit/vcell/math/MathDescription.java +++ b/vcell-core/src/main/java/cbit/vcell/math/MathDescription.java @@ -39,6 +39,7 @@ import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; +import java.io.IOException; import java.io.Serializable; import java.util.*; import java.util.function.Consumer; @@ -3953,12 +3954,12 @@ private static boolean tryLegacyVarNameDomainExtensive(MathDescription mathDescr continue; } try { - Variable clonedVar = oldVar.deepClone(); + Variable clonedVar = (Variable) BeanUtils.cloneSerializable(oldVar); clonedVar.rename(newName); SubDomain sd = mathDescription1.getSubDomain(mathDescription2.getVariable(newName).getDomain().getName()); clonedVar.setDomain(new Domain(sd)); mathDescription1.addVariable0(clonedVar); - } catch(ExpressionBindingException | MathException e){ + } catch(ExpressionBindingException | MathException | ClassNotFoundException | IOException e){ lg.error("could not add new variable " + newName); return false; } From d1c6f410b825c6742dfe8f64200a276a46a692ff Mon Sep 17 00:00:00 2001 From: jcschaff Date: Wed, 9 Apr 2025 21:04:42 -0400 Subject: [PATCH 08/12] added fault for INCONSISTENT_UNIT_SYSTEM (ng is not moles or molecules) --- .../src/test/java/org/vcell/sbml/BMDB_SBMLImportTest.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/vcell-core/src/test/java/org/vcell/sbml/BMDB_SBMLImportTest.java b/vcell-core/src/test/java/org/vcell/sbml/BMDB_SBMLImportTest.java index 47fc8d7144..fe8aff9125 100644 --- a/vcell-core/src/test/java/org/vcell/sbml/BMDB_SBMLImportTest.java +++ b/vcell-core/src/test/java/org/vcell/sbml/BMDB_SBMLImportTest.java @@ -121,6 +121,7 @@ public static Map knownFaults() { faults.put(246, SBMLTestSuiteTest.FAULT.NONINTEGER_STOICH); // cause: UnsupportedConstruct: Non-integer stoichiometry ('0.001' for product 'Ca_in' in reaction 'vo') or stoichiometryMath not handled in VCell at this time. faults.put(248, SBMLTestSuiteTest.FAULT.EXPRESSION_BINDING_EXCEPTION); // cause: Unable to create and add rate rule to VC model : 'Capillary.Capillary' is either not found in your model or is not allowed to be used in the current context. Check that you have p faults.put(256, SBMLTestSuiteTest.FAULT.EXPRESSION_BINDING_EXCEPTION); // cause: Error binding global parameter 'XIAP_ini' to model: 'UNRESOLVED.initConc' is either not found in your model or is not allowed to be used in the current context. Check that you hav + faults.put(264, SBMLTestSuiteTest.FAULT.INCONSISTENT_UNIT_SYSTEM); // cause: failed to convert lumped reaction kinetics to distributed: volume substance unit [ng] must be compatible with mole or molecules faults.put(305, SBMLTestSuiteTest.FAULT.EXPRESSION_BINDING_EXCEPTION); // cause: Error binding global parameter 'V' to model: 'Fw_1st_step' is either not found in your model or is not allowed to be used in the current context. Check that you have provided the faults.put(319, SBMLTestSuiteTest.FAULT.NONINTEGER_STOICH); // cause: UnsupportedConstruct: Non-integer stoichiometry ('0.02' for product 'gamma' in reaction 'r3') or stoichiometryMath not handled in VCell at this time. faults.put(340, SBMLTestSuiteTest.FAULT.MATHML_PARSING); // cause: UnsupportedConstruct: error parsing expression ' @@ -212,7 +213,7 @@ public static Map knownFaults() { public static Collection testCases() { return Arrays.stream(BMDB_SBML_Files.getBiomodelDB_curatedModelNumbers()).boxed() - .filter(n -> !slowModelSet().contains(n)).collect(Collectors.toList()); + .filter(n -> !slowModelSet().contains(n) && n==264).collect(Collectors.toList()); } @ParameterizedTest @@ -260,8 +261,10 @@ public void testSbmlTestSuiteImport(Integer biomodelsDbModelNumber) throws Excep fault = SBMLTestSuiteTest.FAULT.REACTANT_AND_MODIFIER; }else if (cause.contains("unsupported SBML element 'delay'")){ fault = SBMLTestSuiteTest.FAULT.DELAY; - }else if (cause.contains("Non-integer stoichiometry")){ + }else if (cause.contains("Non-integer stoichiometry")) { fault = SBMLTestSuiteTest.FAULT.NONINTEGER_STOICH; + }else if (cause.contains("must be compatible with mole or molecules")){ + fault = SBMLTestSuiteTest.FAULT.INCONSISTENT_UNIT_SYSTEM; }else if (cause.contains("is either not found in your model")){ fault = SBMLTestSuiteTest.FAULT.EXPRESSION_BINDING_EXCEPTION; }else if (cause.contains("SBML extension 'qual'")){ From 595594fb02615ae5bd9ea66e694151497487994a Mon Sep 17 00:00:00 2001 From: jcschaff Date: Wed, 9 Apr 2025 22:47:43 -0400 Subject: [PATCH 09/12] project BNGOutputSpec.deepClone() against null arrays --- .../cbit/vcell/bionetgen/BNGOutputSpec.java | 54 ++++++++++++------- 1 file changed, 36 insertions(+), 18 deletions(-) diff --git a/vcell-core/src/main/java/cbit/vcell/bionetgen/BNGOutputSpec.java b/vcell-core/src/main/java/cbit/vcell/bionetgen/BNGOutputSpec.java index 5a679fa408..7069ccb65e 100644 --- a/vcell-core/src/main/java/cbit/vcell/bionetgen/BNGOutputSpec.java +++ b/vcell-core/src/main/java/cbit/vcell/bionetgen/BNGOutputSpec.java @@ -50,29 +50,47 @@ public BNGOutputSpec(BNGParameter[] argParams, BNGMolecule[] argMols, BNGSpecies } public BNGOutputSpec deepClone() { - BNGParameter[] bngParamsClone = new BNGParameter[bngParams.length]; - for (int i = 0; i < bngParams.length; i++) { - bngParamsClone[i] = bngParams[i].deepClone(); + BNGParameter[] bngParamsClone = null; + if (bngParams != null) { + bngParamsClone = new BNGParameter[bngParams.length]; + for (int i = 0; i < bngParams.length; i++) { + bngParamsClone[i] = bngParams[i].deepClone(); + } } - BNGMolecule[] bngMoleculeTypesClone = new BNGMolecule[bngMoleculeTypes.length]; - for (int i = 0; i < bngMoleculeTypes.length; i++) { - bngMoleculeTypesClone[i] = bngMoleculeTypes[i].deepClone(); + BNGMolecule[] bngMoleculeTypesClone = null; + if (bngMoleculeTypes != null){ + bngMoleculeTypesClone = new BNGMolecule[bngMoleculeTypes.length]; + for (int i = 0; i < bngMoleculeTypes.length; i++) { + bngMoleculeTypesClone[i] = bngMoleculeTypes[i].deepClone(); + } } - BNGSpecies[] bngSpeciesClone = new BNGSpecies[bngSpecies.length]; - for (int i = 0; i < bngSpecies.length; i++) { - bngSpeciesClone[i] = bngSpecies[i].deepClone(); + BNGSpecies[] bngSpeciesClone = null; + if (bngSpecies != null){ + bngSpeciesClone = new BNGSpecies[bngSpecies.length]; + for (int i = 0; i < bngSpecies.length; i++) { + bngSpeciesClone[i] = bngSpecies[i].deepClone(); + } } - BNGReactionRule[] bngReactionRulesClone = new BNGReactionRule[bngReactionRules.length]; - for (int i = 0; i < bngReactionRules.length; i++) { - bngReactionRulesClone[i] = bngReactionRules[i].deepClone(); + BNGReactionRule[] bngReactionRulesClone = null; + if (bngReactionRules != null){ + bngReactionRulesClone = new BNGReactionRule[bngReactionRules.length]; + for (int i = 0; i < bngReactionRules.length; i++) { + bngReactionRulesClone[i] = bngReactionRules[i].deepClone(); + } } - BNGReaction[] bngReactionsClone = new BNGReaction[bngReactions.length]; - for (int i = 0; i < bngReactions.length; i++) { - bngReactionsClone[i] = bngReactions[i].deepClone(); + BNGReaction[] bngReactionsClone = null; + if (bngReactions != null) { + bngReactionsClone = new BNGReaction[bngReactions.length]; + for (int i = 0; i < bngReactions.length; i++) { + bngReactionsClone[i] = bngReactions[i].deepClone(); + } } - ObservableGroup[] bngObservableGroupsClone = new ObservableGroup[bngObservableGroups.length]; - for (int i = 0; i < bngObservableGroups.length; i++) { - bngObservableGroupsClone[i] = bngObservableGroups[i].deepClone(); + ObservableGroup[] bngObservableGroupsClone = null; + if (bngObservableGroups != null){ + bngObservableGroupsClone = new ObservableGroup[bngObservableGroups.length]; + for (int i = 0; i < bngObservableGroups.length; i++) { + bngObservableGroupsClone[i] = bngObservableGroups[i].deepClone(); + } } return new BNGOutputSpec(bngParamsClone, bngMoleculeTypesClone, bngSpeciesClone, bngReactionRulesClone, bngReactionsClone, bngObservableGroupsClone); } From 78b04551bc2d17e0ee2e8cebd68791e5f4baeca5 Mon Sep 17 00:00:00 2001 From: jcschaff Date: Thu, 10 Apr 2025 00:08:13 -0400 Subject: [PATCH 10/12] clear symbol table bindings upon cloning expressions --- .../java/cbit/vcell/bionetgen/BNGReaction.java | 2 +- .../java/cbit/vcell/bionetgen/BNGSpecies.java | 2 +- .../cbit/vcell/bionetgen/ObservableGroup.java | 16 +++++++++++----- .../main/java/cbit/vcell/parser/Expression.java | 8 +++++++- 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/vcell-core/src/main/java/cbit/vcell/bionetgen/BNGReaction.java b/vcell-core/src/main/java/cbit/vcell/bionetgen/BNGReaction.java index af7ccd262e..f588ba8ceb 100644 --- a/vcell-core/src/main/java/cbit/vcell/bionetgen/BNGReaction.java +++ b/vcell-core/src/main/java/cbit/vcell/bionetgen/BNGReaction.java @@ -367,7 +367,7 @@ public BNGReaction deepClone() { } Expression newParamExpression = paramExpression; if (newParamExpression != null) { - newParamExpression = new Expression(paramExpression); + newParamExpression = Expression.clone(paramExpression); } BNGReaction bngReactionClone = new BNGReaction(matchingKey, matchingKey, bngReactantsClone, bngProductsClone, newParamExpression, ruleName, bRuleReversed); return bngReactionClone; diff --git a/vcell-core/src/main/java/cbit/vcell/bionetgen/BNGSpecies.java b/vcell-core/src/main/java/cbit/vcell/bionetgen/BNGSpecies.java index 71da697f60..1ad01f6acb 100644 --- a/vcell-core/src/main/java/cbit/vcell/bionetgen/BNGSpecies.java +++ b/vcell-core/src/main/java/cbit/vcell/bionetgen/BNGSpecies.java @@ -125,7 +125,7 @@ public String toStringShort() { public BNGSpecies deepClone() { Expression newConc = getConcentration(); if (newConc != null) { - newConc = new Expression(newConc); + newConc = Expression.clone(newConc); } return new BNGComplexSpecies(getName(), newConc, getNetworkFileIndex()); } diff --git a/vcell-core/src/main/java/cbit/vcell/bionetgen/ObservableGroup.java b/vcell-core/src/main/java/cbit/vcell/bionetgen/ObservableGroup.java index 4da3c3e57f..c5b3b14b53 100644 --- a/vcell-core/src/main/java/cbit/vcell/bionetgen/ObservableGroup.java +++ b/vcell-core/src/main/java/cbit/vcell/bionetgen/ObservableGroup.java @@ -118,12 +118,18 @@ public List getIndexesAsIntegersList() { } public ObservableGroup deepClone() { - BNGSpecies[] listofSpeciesClone = new BNGSpecies[listofSpecies.length]; - for (int i = 0; i < listofSpecies.length; i++) { - listofSpeciesClone[i] = listofSpecies[i].deepClone(); + BNGSpecies[] listofSpeciesClone = null; + if (listofSpecies != null){ + listofSpeciesClone = new BNGSpecies[listofSpecies.length]; + for (int i = 0; i < listofSpecies.length; i++) { + listofSpeciesClone[i] = listofSpecies[i].deepClone(); + } + } + int[] speciesMultiplicityClone = null; + if (speciesMultiplicity != null){ + speciesMultiplicityClone = new int[speciesMultiplicity.length]; + System.arraycopy(speciesMultiplicity, 0, speciesMultiplicityClone, 0, speciesMultiplicity.length); } - int[] speciesMultiplicityClone = new int[speciesMultiplicity.length]; - System.arraycopy(speciesMultiplicity, 0, speciesMultiplicityClone, 0, speciesMultiplicity.length); return new ObservableGroup(observableGroupName, listofSpeciesClone, speciesMultiplicityClone); } } diff --git a/vcell-math/src/main/java/cbit/vcell/parser/Expression.java b/vcell-math/src/main/java/cbit/vcell/parser/Expression.java index df62b65059..1d9bf61e12 100644 --- a/vcell-math/src/main/java/cbit/vcell/parser/Expression.java +++ b/vcell-math/src/main/java/cbit/vcell/parser/Expression.java @@ -145,7 +145,13 @@ public static Expression clone(Expression exp) { if (exp == null){ return null; }else{ - return new Expression(exp); + Expression new_exp = new Expression(exp); + try { + new_exp.bindExpression(null); + return new_exp; + }catch (Exception e){ + throw new RuntimeException("unexpected error in Expression.clone() "+e.getMessage(), e); + } } } From d7b5fddc09fc7a88004fcc68f513952f6a927127 Mon Sep 17 00:00:00 2001 From: jcschaff Date: Thu, 10 Apr 2025 00:08:48 -0400 Subject: [PATCH 11/12] set XmlHelper.cloneUsingXml to False (except libvcell) --- vcell-core/src/main/java/cbit/vcell/xml/XmlHelper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vcell-core/src/main/java/cbit/vcell/xml/XmlHelper.java b/vcell-core/src/main/java/cbit/vcell/xml/XmlHelper.java index 9fcc6a4662..e91d5e64fe 100644 --- a/vcell-core/src/main/java/cbit/vcell/xml/XmlHelper.java +++ b/vcell-core/src/main/java/cbit/vcell/xml/XmlHelper.java @@ -83,7 +83,7 @@ this class throw an XmlParseException: */ public class XmlHelper { - public static boolean cloneUsingXML = true; + public static boolean cloneUsingXML = false; private final static Logger logger = LogManager.getLogger(XmlHelper.class); //represent the containers XML element for the simulation/image data to be imported/exported. From 7e03df3641cd201f20365137330dcbc0114e04ec Mon Sep 17 00:00:00 2001 From: jcschaff Date: Thu, 10 Apr 2025 00:32:16 -0400 Subject: [PATCH 12/12] roll back KMOLE math gen failure when XML clone --- .../src/test/java/org/vcell/sbml/BMDB_SBMLImportTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vcell-core/src/test/java/org/vcell/sbml/BMDB_SBMLImportTest.java b/vcell-core/src/test/java/org/vcell/sbml/BMDB_SBMLImportTest.java index fe8aff9125..f49c6c4598 100644 --- a/vcell-core/src/test/java/org/vcell/sbml/BMDB_SBMLImportTest.java +++ b/vcell-core/src/test/java/org/vcell/sbml/BMDB_SBMLImportTest.java @@ -121,7 +121,7 @@ public static Map knownFaults() { faults.put(246, SBMLTestSuiteTest.FAULT.NONINTEGER_STOICH); // cause: UnsupportedConstruct: Non-integer stoichiometry ('0.001' for product 'Ca_in' in reaction 'vo') or stoichiometryMath not handled in VCell at this time. faults.put(248, SBMLTestSuiteTest.FAULT.EXPRESSION_BINDING_EXCEPTION); // cause: Unable to create and add rate rule to VC model : 'Capillary.Capillary' is either not found in your model or is not allowed to be used in the current context. Check that you have p faults.put(256, SBMLTestSuiteTest.FAULT.EXPRESSION_BINDING_EXCEPTION); // cause: Error binding global parameter 'XIAP_ini' to model: 'UNRESOLVED.initConc' is either not found in your model or is not allowed to be used in the current context. Check that you hav - faults.put(264, SBMLTestSuiteTest.FAULT.INCONSISTENT_UNIT_SYSTEM); // cause: failed to convert lumped reaction kinetics to distributed: volume substance unit [ng] must be compatible with mole or molecules +// faults.put(264, SBMLTestSuiteTest.FAULT.INCONSISTENT_UNIT_SYSTEM); // cause: failed to convert lumped reaction kinetics to distributed: volume substance unit [ng] must be compatible with mole or molecules faults.put(305, SBMLTestSuiteTest.FAULT.EXPRESSION_BINDING_EXCEPTION); // cause: Error binding global parameter 'V' to model: 'Fw_1st_step' is either not found in your model or is not allowed to be used in the current context. Check that you have provided the faults.put(319, SBMLTestSuiteTest.FAULT.NONINTEGER_STOICH); // cause: UnsupportedConstruct: Non-integer stoichiometry ('0.02' for product 'gamma' in reaction 'r3') or stoichiometryMath not handled in VCell at this time. faults.put(340, SBMLTestSuiteTest.FAULT.MATHML_PARSING); // cause: UnsupportedConstruct: error parsing expression '