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/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-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/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..7069ccb65e 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,51 @@ public BNGOutputSpec(BNGParameter[] argParams, BNGMolecule[] argMols, BNGSpecies } } +public BNGOutputSpec 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 = null; + if (bngMoleculeTypes != null){ + bngMoleculeTypesClone = new BNGMolecule[bngMoleculeTypes.length]; + for (int i = 0; i < bngMoleculeTypes.length; i++) { + bngMoleculeTypesClone[i] = bngMoleculeTypes[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 = null; + if (bngReactionRules != null){ + bngReactionRulesClone = new BNGReactionRule[bngReactionRules.length]; + for (int i = 0; i < bngReactionRules.length; i++) { + bngReactionRulesClone[i] = bngReactionRules[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 = 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); +} 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..f588ba8ceb 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 = 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/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..1ad01f6acb 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 = Expression.clone(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..c5b3b14b53 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,19 @@ public List getIndexesAsIntegersList() { return list; } + public ObservableGroup 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); + } + return new ObservableGroup(observableGroupName, listofSpeciesClone, speciesMultiplicityClone); + } } 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/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) 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..2a4c226c92 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(); @@ -205,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); @@ -280,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; 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/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..7342c725f5 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; @@ -3959,7 +3959,7 @@ private static boolean tryLegacyVarNameDomainExtensive(MathDescription mathDescr 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 | ClassNotFoundException | IOException e){ lg.error("could not add new variable " + newName); return false; } @@ -4018,19 +4018,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/DataSet.java b/vcell-core/src/main/java/cbit/vcell/simdata/DataSet.java index ba34007b97..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 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'")){ 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..1d9bf61e12 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,22 @@ 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{ + 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); + } + } + } + + 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);