use of cbit.vcell.geometry.surface.SurfaceGeometricRegion in project vcell by virtualcell.
the class Xmlproducer method getXML.
private Element getXML(GeometrySurfaceDescription param) throws XmlParseException {
Element gsd = new Element(XMLTags.SurfaceDescriptionTag);
// add attributes
ISize isize = param.getVolumeSampleSize();
if (isize == null) {
throw new XmlParseException("Unable to retrieve dimensions for surface descriptions for Geometry: " + param.getGeometry().getName());
}
gsd.setAttribute(XMLTags.NumSamplesXAttrTag, String.valueOf(isize.getX()));
gsd.setAttribute(XMLTags.NumSamplesYAttrTag, String.valueOf(isize.getY()));
gsd.setAttribute(XMLTags.NumSamplesZAttrTag, String.valueOf(isize.getZ()));
Double coFrequency = param.getFilterCutoffFrequency();
if (coFrequency == null) {
throw new XmlParseException("Unable to retrieve cutoff frequency for surface descriptions for Geometry: " + param.getGeometry().getName());
}
double cutoffFrequency = coFrequency.doubleValue();
gsd.setAttribute(XMLTags.CutoffFrequencyAttrTag, String.valueOf(cutoffFrequency));
// add subelements
GeometricRegion[] geomRegions = param.getGeometricRegions();
if (geomRegions != null) {
for (int i = 0; i < geomRegions.length; i++) {
if (geomRegions[i] instanceof SurfaceGeometricRegion) {
SurfaceGeometricRegion sgr = (SurfaceGeometricRegion) geomRegions[i];
Element membraneRegion = new Element(XMLTags.MembraneRegionTag);
membraneRegion.setAttribute(XMLTags.NameAttrTag, sgr.getName());
GeometricRegion[] adjacents = sgr.getAdjacentGeometricRegions();
if (adjacents == null || adjacents.length != 2) {
throw new XmlParseException("Wrong number of adjacent regions for surface descriptions for location: " + sgr.getName() + " in Geometry: " + param.getGeometry().getName());
}
membraneRegion.setAttribute(XMLTags.VolumeRegion_1AttrTag, adjacents[0].getName());
membraneRegion.setAttribute(XMLTags.VolumeRegion_2AttrTag, adjacents[1].getName());
double size = sgr.getSize();
if (size != -1) {
membraneRegion.setAttribute(XMLTags.SizeAttrTag, String.valueOf(size));
VCUnitDefinition unit = sgr.getSizeUnit();
if (unit != null) {
membraneRegion.setAttribute(XMLTags.VCUnitDefinitionAttrTag, unit.getSymbol());
}
}
gsd.addContent(membraneRegion);
} else if (geomRegions[i] instanceof VolumeGeometricRegion) {
VolumeGeometricRegion vgr = (VolumeGeometricRegion) geomRegions[i];
Element volumeRegion = new Element(XMLTags.VolumeRegionTag);
volumeRegion.setAttribute(XMLTags.NameAttrTag, vgr.getName());
volumeRegion.setAttribute(XMLTags.RegionIDAttrTag, String.valueOf(vgr.getRegionID()));
volumeRegion.setAttribute(XMLTags.SubVolumeAttrTag, vgr.getSubVolume().getName());
double size = vgr.getSize();
if (size != -1) {
volumeRegion.setAttribute(XMLTags.SizeAttrTag, String.valueOf(size));
VCUnitDefinition unit = vgr.getSizeUnit();
if (unit != null) {
volumeRegion.setAttribute(XMLTags.VCUnitDefinitionAttrTag, unit.getSymbol());
}
}
gsd.addContent(volumeRegion);
}
}
}
return gsd;
}
use of cbit.vcell.geometry.surface.SurfaceGeometricRegion in project vcell by virtualcell.
the class MathDescription method gatherIssues.
/**
* This method was created in VisualAge.
* @return boolean
*/
public void gatherIssues(IssueContext issueContext, List<Issue> issueList) {
issueContext = issueContext.newChildContext(ContextType.MathDescription, this);
setWarning(null);
if (geometry == null) {
Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_NoGeometry, VCellErrorMessages.MATH_DESCRIPTION_GEOMETRY_1, Issue.SEVERITY_ERROR);
issueList.add(issue);
}
if (isSpatialStoch() && geometry.getDimension() != 3) {
Issue issue = new Issue(geometry, issueContext, IssueCategory.Smoldyn_Geometry_3DWarning, "VCell spatial stochastic models only support 3D geometry.", Issue.SEVERITY_ERROR);
issueList.add(issue);
}
// check Constant are really constants
for (int i = 0; i < variableList.size(); i++) {
Variable var = variableList.get(i);
if (var instanceof Constant) {
try {
((Constant) var).getExpression().evaluateConstant();
} catch (Exception ex) {
ex.printStackTrace(System.out);
Issue issue = new Issue(var, issueContext, IssueCategory.MathDescription_Constant_NotANumber, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_CONSTANT, var.getExpression().infix()), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
}
}
//
// count number of variables of each type
//
int volVarCount = 0;
int memVarCount = 0;
int filVarCount = 0;
int volRegionVarCount = 0;
int memRegionVarCount = 0;
int filRegionVarCount = 0;
int stochVarCount = 0;
int pointVarCount = 0;
for (int i = 0; i < variableList.size(); i++) {
Variable var = variableList.get(i);
if (var instanceof VolVariable) {
volVarCount++;
} else if (var instanceof MemVariable) {
memVarCount++;
} else if (var instanceof FilamentVariable) {
filVarCount++;
} else if (var instanceof VolumeRegionVariable) {
volRegionVarCount++;
} else if (var instanceof MembraneRegionVariable) {
memRegionVarCount++;
} else if (var instanceof FilamentRegionVariable) {
filRegionVarCount++;
} else if (var instanceof StochVolVariable) {
stochVarCount++;
} else if (var instanceof PointVariable) {
pointVarCount++;
}
}
//
for (int i = 0; i < subDomainList.size(); i++) {
try {
SubDomain subDomain = subDomainList.get(i);
Enumeration<Equation> equEnum = subDomain.getEquations();
while (equEnum.hasMoreElements()) {
Equation equ = equEnum.nextElement();
equ.checkValid(this, subDomain);
equ.bind(this);
}
FastSystem fastSystem = subDomain.getFastSystem();
if (fastSystem != null) {
Enumeration<FastRate> frEnum = fastSystem.getFastRates();
while (frEnum.hasMoreElements()) {
FastRate fr = frEnum.nextElement();
fr.bind(this);
}
Enumeration<FastInvariant> fiEnum = fastSystem.getFastInvariants();
while (fiEnum.hasMoreElements()) {
FastInvariant fi = fiEnum.nextElement();
fi.bind(this);
}
}
for (ParticleProperties pp : subDomain.getParticleProperties()) {
pp.bind(this);
}
for (ParticleJumpProcess pjp : subDomain.getParticleJumpProcesses()) {
pjp.bind(this);
Expression rateDefinition = null;
JumpProcessRateDefinition jprd = pjp.getParticleRateDefinition();
if (jprd instanceof MacroscopicRateConstant) {
rateDefinition = MathUtilities.substituteFunctions(((MacroscopicRateConstant) jprd).getExpression(), this);
} else if (jprd instanceof InteractionRadius) {
rateDefinition = MathUtilities.substituteFunctions(((InteractionRadius) jprd).getExpression(), this);
} else {
new RuntimeException("The jump process rate definition is not supported");
}
String[] symbols = rateDefinition.getSymbols();
if (symbols != null) {
for (String symbol : symbols) {
// throw exception for particle variables, particle variable cannot be referenced
Variable var = getVariable(symbol);
if (var instanceof ParticleVariable) {
throw new MathException("Stochastic variables can not be referenced in functions and equations.");
}
if (subDomain instanceof CompartmentSubDomain) {
if ((var instanceof MembraneRegionVariable || var instanceof MemVariable)) {
throw new MathException("Volume reaction: " + pjp.getName() + " cannot reference membrane variable: " + var.getName() + ".");
}
}
}
}
}
} catch (ExpressionBindingException e) {
Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_ExpressionBindingException, e.getMessage(), Issue.SEVERITY_ERROR);
issueList.add(issue);
} catch (ExpressionException e) {
Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_ExpressionException, e.getMessage(), Issue.SEVERITY_ERROR);
issueList.add(issue);
} catch (MathException e) {
Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_MathException, e.getMessage(), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
}
//
if (geometry.getDimension() == 0) {
//
if (subDomainList.size() != 1) {
Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_CompartmentalModel, VCellErrorMessages.MATH_DESCRIPTION_COMPARTMENT_MODEL_1, Issue.SEVERITY_ERROR);
issueList.add(issue);
} else if (subDomainList.size() == 1) {
if (!(subDomainList.get(0) instanceof CompartmentSubDomain)) {
Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_CompartmentalModel, VCellErrorMessages.MATH_DESCRIPTION_COMPARTMENT_MODEL_2, Issue.SEVERITY_ERROR);
issueList.add(issue);
}
CompartmentSubDomain subDomain = (CompartmentSubDomain) subDomainList.get(0);
// distinguish ODE model and stochastic model
if (isNonSpatialStoch()) {
if (stochVarCount == 0) {
Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_StochasticModel, VCellErrorMessages.MATH_DESCRIPTION_COMPARTMENT_STOCHASTIC_MODEL_1, Issue.SEVERITY_ERROR);
issueList.add(issue);
}
if (subDomain.getJumpProcesses().size() == 0) {
Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_StochasticModel, VCellErrorMessages.MATH_DESCRIPTION_COMPARTMENT_STOCHASTIC_MODEL_2, Issue.SEVERITY_ERROR);
issueList.add(issue);
}
// check variable initial condition
for (VarIniCondition varIniCondition : subDomain.getVarIniConditions()) {
Expression iniExp = varIniCondition.getIniVal();
try {
iniExp.bindExpression(this);
} catch (Exception ex) {
ex.printStackTrace(System.out);
setWarning(ex.getMessage());
}
}
// check probability rate
for (JumpProcess jumpProcess : subDomain.getJumpProcesses()) {
Expression probExp = jumpProcess.getProbabilityRate();
try {
probExp.bindExpression(this);
} catch (Exception ex) {
ex.printStackTrace(System.out);
setWarning(ex.getMessage());
}
}
} else if (isRuleBased()) {
} else {
// ODE model
//
// Check that all equations are ODEs
//
int odeCount = 0;
Enumeration<Equation> enum_equ = subDomain.getEquations();
while (enum_equ.hasMoreElements()) {
Equation equ = enum_equ.nextElement();
if (equ instanceof OdeEquation) {
odeCount++;
} else {
Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_CompartmentalModel, VCellErrorMessages.MATH_DESCRIPTION_COMPARTMENT_MODEL_3, Issue.SEVERITY_ERROR);
issueList.add(issue);
}
}
if (odeCount == 0) {
Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_CompartmentalModel, VCellErrorMessages.MATH_DESCRIPTION_COMPARTMENT_MODEL_4, Issue.SEVERITY_ERROR);
issueList.add(issue);
}
if (volVarCount != odeCount) {
Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_CompartmentalModel, VCellErrorMessages.MATH_DESCRIPTION_COMPARTMENT_MODEL_5, Issue.SEVERITY_ERROR);
issueList.add(issue);
}
if (memVarCount > 0) {
Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_CompartmentalModel, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_COMPARTMENT_MODEL_6, VCML.MembraneVariable), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
if (filVarCount > 0) {
Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_CompartmentalModel, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_COMPARTMENT_MODEL_6, VCML.FilamentVariable), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
if (volRegionVarCount > 0) {
Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_CompartmentalModel, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_COMPARTMENT_MODEL_6, VCML.VolumeRegionVariable), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
if (memRegionVarCount > 0) {
Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_CompartmentalModel, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_COMPARTMENT_MODEL_6, VCML.MembraneRegionVariable), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
if (filRegionVarCount > 0) {
Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_CompartmentalModel, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_COMPARTMENT_MODEL_6, VCML.FilamentRegionVariable), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
}
}
//
// spatial (PDE and ODE)
//
} else {
//
// Check that the number of CompartmentSubdomains equals the number of VolumeSubVolumes in the Geometry
// Check that the number of FilamentSubdomains equals the number of Filaments in the Geometry
//
int compartmentCount = 0;
int membraneCount = 0;
int filamentCount = 0;
int pointCount = 0;
for (int i = 0; i < subDomainList.size(); i++) {
SubDomain subDomain = (SubDomain) subDomainList.get(i);
if (subDomain instanceof CompartmentSubDomain) {
if (geometry.getGeometrySpec().getSubVolume(subDomain.getName()) == null) {
Issue issue = new Issue(subDomain, issueContext, IssueCategory.MathDescription_SpatialModel_Subdomain, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_1, subDomain.getName()), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
compartmentCount++;
} else if (subDomain instanceof MembraneSubDomain) {
membraneCount++;
} else if (subDomain instanceof FilamentSubDomain) {
filamentCount++;
} else if (subDomain instanceof PointSubDomain) {
pointCount++;
} else {
Issue issue = new Issue(subDomain, issueContext, IssueCategory.MathDescription_SpatialModel_Subdomain, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_2, subDomain.getName()), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
}
if (geometry.getGeometrySpec().getNumSubVolumes() != compartmentCount) {
Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_SpatialModel, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_3, geometry.getGeometrySpec().getNumSubVolumes(), compartmentCount), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
if (geometry.getGeometrySpec().getFilamentGroup().getFilamentCount() != filamentCount) {
// setWarning("Spatial model, there are "+geometry.getGeometrySpec().getFilamentGroup().getFilamentCount()+" filaments in geometry, but "+filamentCount+" "+VCML.FilamentSubDomain+"'s, must be equal");
// return false;
}
if (filamentCount == 0 && (filVarCount > 0 || filRegionVarCount > 0)) {
Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_SpatialModel, VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_4, Issue.SEVERITY_ERROR);
issueList.add(issue);
}
if (membraneCount == 0 && (memVarCount > 0 || memRegionVarCount > 0)) {
Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_SpatialModel, VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_5, Issue.SEVERITY_ERROR);
issueList.add(issue);
}
//
for (int i = 0; i < subDomainList.size(); i++) {
SubDomain subDomain1 = (SubDomain) subDomainList.get(i);
for (int j = 0; j < subDomainList.size(); j++) {
if (i != j) {
SubDomain subDomain2 = (SubDomain) subDomainList.get(j);
if (subDomain1.getName().equals(subDomain2.getName())) {
Issue issue = new Issue(subDomain1, issueContext, IssueCategory.MathDescription_SpatialModel_Subdomain, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_6, subDomain1.getName(), subDomain2.getName()), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
if (subDomain1 instanceof MembraneSubDomain && subDomain2 instanceof MembraneSubDomain) {
MembraneSubDomain memSubDomain1 = (MembraneSubDomain) subDomain1;
MembraneSubDomain memSubDomain2 = (MembraneSubDomain) subDomain2;
if ((memSubDomain1.getInsideCompartment() == memSubDomain2.getInsideCompartment() && memSubDomain1.getOutsideCompartment() == memSubDomain2.getOutsideCompartment()) || (memSubDomain1.getInsideCompartment() == memSubDomain2.getOutsideCompartment() && memSubDomain1.getOutsideCompartment() == memSubDomain2.getInsideCompartment())) {
Issue issue = new Issue(subDomain1, issueContext, IssueCategory.MathDescription_SpatialModel_Subdomain, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_7, memSubDomain1.getInsideCompartment().getName(), memSubDomain1.getOutsideCompartment().getName()), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
}
}
}
}
// check periodic boundary conditons
for (int i = 0; i < subDomainList.size(); i++) {
SubDomain subDomain = (SubDomain) subDomainList.get(i);
if (subDomain instanceof CompartmentSubDomain) {
CompartmentSubDomain compartmentSubDomain = (CompartmentSubDomain) subDomain;
BoundaryConditionType bctM = compartmentSubDomain.getBoundaryConditionXm();
BoundaryConditionType bctP = compartmentSubDomain.getBoundaryConditionXp();
if (bctM.isPERIODIC() && !bctP.isPERIODIC() || !bctM.isPERIODIC() && bctP.isPERIODIC()) {
Issue issue = new Issue(subDomain, issueContext, IssueCategory.MathDescription_SpatialModel_Subdomain, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_9, "Xm", "Xp", subDomain.getName()), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
bctM = compartmentSubDomain.getBoundaryConditionYm();
bctP = compartmentSubDomain.getBoundaryConditionYp();
if (bctM.isPERIODIC() && !bctP.isPERIODIC() || !bctM.isPERIODIC() && bctP.isPERIODIC()) {
Issue issue = new Issue(subDomain, issueContext, IssueCategory.MathDescription_SpatialModel_Subdomain, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_9, "Ym", "Yp", subDomain.getName()), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
bctM = compartmentSubDomain.getBoundaryConditionZm();
bctP = compartmentSubDomain.getBoundaryConditionZp();
if (bctM.isPERIODIC() && !bctP.isPERIODIC() || !bctM.isPERIODIC() && bctP.isPERIODIC()) {
Issue issue = new Issue(subDomain, issueContext, IssueCategory.MathDescription_SpatialModel_Subdomain, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_9, "Zm", "Zp", subDomain.getName()), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
} else if (subDomain instanceof MembraneSubDomain) {
MembraneSubDomain membraneSubDomain = (MembraneSubDomain) subDomain;
BoundaryConditionType bctM = membraneSubDomain.getBoundaryConditionXm();
BoundaryConditionType bctP = membraneSubDomain.getBoundaryConditionXp();
if (bctM.isPERIODIC() && !bctP.isPERIODIC() || !bctM.isPERIODIC() && bctP.isPERIODIC()) {
Issue issue = new Issue(subDomain, issueContext, IssueCategory.MathDescription_SpatialModel_Subdomain, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_9, "Xm", "Xp", subDomain.getName()), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
bctM = membraneSubDomain.getBoundaryConditionYm();
bctP = membraneSubDomain.getBoundaryConditionYp();
if (bctM.isPERIODIC() && !bctP.isPERIODIC() || !bctM.isPERIODIC() && bctP.isPERIODIC()) {
Issue issue = new Issue(subDomain, issueContext, IssueCategory.MathDescription_SpatialModel_Subdomain, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_9, "Ym", "Yp", subDomain.getName()), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
bctM = membraneSubDomain.getBoundaryConditionZm();
bctP = membraneSubDomain.getBoundaryConditionZp();
if (bctM.isPERIODIC() && !bctP.isPERIODIC() || !bctM.isPERIODIC() && bctP.isPERIODIC()) {
Issue issue = new Issue(subDomain, issueContext, IssueCategory.MathDescription_SpatialModel_Subdomain, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_9, "Zm", "Zp", subDomain.getName()), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
}
}
try {
if (geometry.getGeometrySpec().getDimension() > 0) {
//
// Check that there is a MembraneSubdomain for each unique subVolume-subVolume interface in Geometry
// each ResolvedSurfaceLocation is an instance of a subVolume-subVolume interface (one-to-one with region boundaries).
//
GeometricRegion[] regions = geometry.getGeometrySurfaceDescription().getGeometricRegions();
// }
if (regions == null) {
Issue issue = new Issue(geometry, issueContext, IssueCategory.MathDescription_SpatialModel_Geometry, VCellErrorMessages.MATH_DESCRIPTION_GEOMETRY_2, Issue.SEVERITY_ERROR);
issueList.add(issue);
} else {
for (int i = 0; i < regions.length; i++) {
if (regions[i] instanceof SurfaceGeometricRegion) {
SurfaceGeometricRegion surfaceRegion = (SurfaceGeometricRegion) regions[i];
SubVolume subVolume1 = ((VolumeGeometricRegion) surfaceRegion.getAdjacentGeometricRegions()[0]).getSubVolume();
CompartmentSubDomain compartment1 = getCompartmentSubDomain(subVolume1.getName());
if (compartment1 == null) {
Issue issue = new Issue(geometry, issueContext, IssueCategory.MathDescription_SpatialModel_Geometry, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_GEOMETRY_3, getGeometry().getName(), subVolume1.getName()), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
SubVolume subVolume2 = ((VolumeGeometricRegion) surfaceRegion.getAdjacentGeometricRegions()[1]).getSubVolume();
CompartmentSubDomain compartment2 = getCompartmentSubDomain(subVolume2.getName());
if (compartment2 == null) {
Issue issue = new Issue(geometry, issueContext, IssueCategory.MathDescription_SpatialModel_Geometry, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_GEOMETRY_3, getGeometry().getName(), subVolume2.getName()), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
MembraneSubDomain membraneSubDomain = getMembraneSubDomain(compartment1, compartment2);
if (compartment2 != null && compartment1 != null && membraneSubDomain == null) {
Issue issue = new Issue(geometry, issueContext, IssueCategory.MathDescription_SpatialModel_Geometry, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_GEOMETRY_4, compartment1.getName(), compartment2.getName()), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
}
}
//
for (int i = 0; i < subDomainList.size(); i++) {
if (subDomainList.get(i) instanceof MembraneSubDomain) {
MembraneSubDomain membraneSubDomain = (MembraneSubDomain) subDomainList.get(i);
boolean bFoundSurfaceInGeometry = false;
for (int j = 0; j < regions.length; j++) {
if (regions[j] instanceof SurfaceGeometricRegion) {
SurfaceGeometricRegion surfaceRegion = (SurfaceGeometricRegion) regions[j];
VolumeGeometricRegion volumeRegion1 = (VolumeGeometricRegion) surfaceRegion.getAdjacentGeometricRegions()[0];
VolumeGeometricRegion volumeRegion2 = (VolumeGeometricRegion) surfaceRegion.getAdjacentGeometricRegions()[1];
String memInsideName = membraneSubDomain.getInsideCompartment().getName();
String memOutsideName = membraneSubDomain.getOutsideCompartment().getName();
if ((memInsideName.equals(volumeRegion1.getSubVolume().getName()) && memOutsideName.equals(volumeRegion2.getSubVolume().getName())) || (memInsideName.equals(volumeRegion2.getSubVolume().getName()) && memOutsideName.equals(volumeRegion1.getSubVolume().getName()))) {
bFoundSurfaceInGeometry = true;
break;
}
}
}
if (!bFoundSurfaceInGeometry) {
Issue issue = new Issue(geometry, issueContext, IssueCategory.MathDescription_SpatialModel_Geometry, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_GEOMETRY_5, membraneSubDomain.getInsideCompartment().getName(), membraneSubDomain.getOutsideCompartment().getName()), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
}
}
}
}
// }catch (GeometryException e){
// e.printStackTrace(System.out);
// setWarning("error validating MathDescription: "+e.getMessage());
// return false;
// }catch (ImageException e){
// e.printStackTrace(System.out);
// setWarning("error validating MathDescription: "+e.getMessage());
// return false;
// }catch (ExpressionException e){
// e.printStackTrace(System.out);
// setWarning("error validating MathDescription: "+e.getMessage());
// return false;
} catch (Exception e) {
e.printStackTrace(System.out);
Issue issue = new Issue(geometry, issueContext, IssueCategory.MathDescription_SpatialModel_Geometry, e.getMessage(), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
//
for (int i = 0; i < variableList.size(); i++) {
Variable var = variableList.get(i);
String varName = var.getName();
if (var instanceof VolVariable) {
VolVariable volVar = (VolVariable) var;
int pdeRefCount = 0;
int odeRefCount = 0;
int steadyPdeCount = 0;
int measureCount = 0;
for (int j = 0; j < subDomainList.size(); j++) {
SubDomain subDomain = subDomainList.get(j);
Equation equ = subDomain.getEquation(volVar);
if (equ instanceof PdeEquation) {
if (((PdeEquation) equ).isSteady()) {
steadyPdeCount++;
} else {
pdeRefCount++;
}
//
for (int k = 0; k < subDomainList.size(); k++) {
SubDomain subDomain2 = subDomainList.get(k);
if (subDomain2 instanceof MembraneSubDomain) {
MembraneSubDomain membraneSubDomain = (MembraneSubDomain) subDomain2;
if (membraneSubDomain.getInsideCompartment() == subDomain || membraneSubDomain.getOutsideCompartment() == subDomain) {
JumpCondition jumpCondition = membraneSubDomain.getJumpCondition(volVar);
BoundaryConditionValue boundaryValue = ((PdeEquation) equ).getBoundaryConditionValue(membraneSubDomain.getName());
// if PDE variable does not have jump condition OR boundaryValue (neither or both are not allowed), its an error.
if ((jumpCondition == null && boundaryValue == null) || (jumpCondition != null && boundaryValue != null)) {
Issue issue = new Issue(equ, issueContext, IssueCategory.MathDescription_SpatialModel_Equation, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_10, varName, subDomain.getName(), membraneSubDomain.getName()), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
if (boundaryValue != null && (subDomain.getBoundaryConditionSpec(membraneSubDomain.getName()) == null)) {
Issue issue = new Issue(equ, issueContext, IssueCategory.MathDescription_SpatialModel_Equation, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_10A, varName, subDomain.getName(), membraneSubDomain.getName(), membraneSubDomain.getName(), subDomain.getName()), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
}
}
}
} else if (equ instanceof OdeEquation) {
odeRefCount++;
} else if (equ instanceof MeasureEquation) {
measureCount++;
}
//
if (subDomain instanceof MembraneSubDomain) {
MembraneSubDomain memSubDomain = (MembraneSubDomain) subDomain;
JumpCondition jumpCondition = memSubDomain.getJumpCondition(volVar);
if (jumpCondition != null) {
boolean bInsidePresent = (memSubDomain.getInsideCompartment().getEquation(volVar) instanceof PdeEquation);
boolean bOutsidePresent = (memSubDomain.getOutsideCompartment().getEquation(volVar) instanceof PdeEquation);
if (!bInsidePresent && !bOutsidePresent) {
Issue issue = new Issue(equ, issueContext, IssueCategory.MathDescription_SpatialModel_Equation, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_11, varName, memSubDomain.getName(), memSubDomain.getInsideCompartment().getName(), memSubDomain.getOutsideCompartment().getName()), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
//
if (!bInsidePresent && !jumpCondition.getInFluxExpression().isZero()) {
Issue issue = new Issue(equ, issueContext, IssueCategory.MathDescription_SpatialModel_Equation, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_12, varName, memSubDomain.getName(), memSubDomain.getInsideCompartment().getName()), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
if (!bOutsidePresent && !jumpCondition.getOutFluxExpression().isZero()) {
Issue issue = new Issue(equ, issueContext, IssueCategory.MathDescription_SpatialModel_Equation, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_13, varName, memSubDomain.getName(), memSubDomain.getOutsideCompartment().getName()), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
}
}
}
if (odeRefCount > 0 && pdeRefCount > 0) {
Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_SpatialModel, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_14, varName), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
if (steadyPdeCount > 0 && pdeRefCount > 0) {
Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_SpatialModel, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_15, varName), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
if (odeRefCount == 0 && pdeRefCount == 0 && steadyPdeCount == 0 && measureCount == 0) {
Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_SpatialModel, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_16, varName), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
} else //
if (var instanceof MemVariable) {
int pdeRefCount = 0;
int odeRefCount = 0;
int steadyPdeCount = 0;
for (int j = 0; j < subDomainList.size(); j++) {
SubDomain subDomain = subDomainList.get(j);
Equation equ = subDomain.getEquation(var);
if (equ instanceof PdeEquation) {
if (((PdeEquation) equ).isSteady()) {
steadyPdeCount++;
} else {
pdeRefCount++;
}
} else if (equ instanceof OdeEquation) {
odeRefCount++;
}
}
if (odeRefCount > 0 && pdeRefCount > 0) {
Issue issue = new Issue(var, issueContext, IssueCategory.MathDescription_SpatialModel_Variable, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_14, varName), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
if (steadyPdeCount > 0 && pdeRefCount > 0) {
Issue issue = new Issue(var, issueContext, IssueCategory.MathDescription_SpatialModel_Variable, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_15, varName), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
if (odeRefCount == 0 && pdeRefCount == 0 && steadyPdeCount == 0) {
Issue issue = new Issue(var, issueContext, IssueCategory.MathDescription_SpatialModel_Variable, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_16, varName), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
} else //
if (var instanceof FilamentVariable) {
for (int j = 0; j < subDomainList.size(); j++) {
SubDomain subDomain = subDomainList.get(j);
if (subDomain instanceof FilamentSubDomain) {
Equation equ = subDomain.getEquation(var);
if (!(equ instanceof OdeEquation)) {
Issue issue = new Issue(var, issueContext, IssueCategory.MathDescription_SpatialModel_Variable, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_21, varName, subDomain.getName()), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
}
}
} else //
if (var instanceof VolumeRegionVariable) {
VolumeRegionVariable volRegionVar = (VolumeRegionVariable) var;
int count = 0;
for (int j = 0; j < subDomainList.size(); j++) {
SubDomain subDomain = subDomainList.get(j);
if (subDomain instanceof CompartmentSubDomain) {
Equation equ = subDomain.getEquation(volRegionVar);
if (equ instanceof VolumeRegionEquation) {
count++;
//
for (int k = 0; k < subDomainList.size(); k++) {
SubDomain subDomain2 = subDomainList.get(k);
if (subDomain2 instanceof MembraneSubDomain) {
MembraneSubDomain membraneSubDomain = (MembraneSubDomain) subDomain2;
if (membraneSubDomain.getInsideCompartment() == subDomain || membraneSubDomain.getOutsideCompartment() == subDomain) {
if (membraneSubDomain.getJumpCondition(volRegionVar) == null) {
Issue issue = new Issue(var, issueContext, IssueCategory.MathDescription_SpatialModel_Variable, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_17, varName, subDomain.getName(), membraneSubDomain.getName()), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
}
}
}
}
}
}
if (count == 0) {
Issue issue = new Issue(var, issueContext, IssueCategory.MathDescription_SpatialModel_Variable, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_18, varName), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
} else //
if (var instanceof MembraneRegionVariable) {
int count = 0;
for (int j = 0; j < subDomainList.size(); j++) {
SubDomain subDomain = subDomainList.get(j);
if (subDomain instanceof MembraneSubDomain) {
Equation equ = subDomain.getEquation(var);
if (equ instanceof MembraneRegionEquation) {
count++;
}
}
}
if (count == 0) {
Issue issue = new Issue(var, issueContext, IssueCategory.MathDescription_SpatialModel_Variable, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_19, varName), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
} else //
if (var instanceof FilamentRegionVariable) {
for (int j = 0; j < subDomainList.size(); j++) {
SubDomain subDomain = subDomainList.get(j);
if (subDomain instanceof FilamentSubDomain) {
Equation equ = subDomain.getEquation(var);
if (!(equ instanceof FilamentRegionEquation)) {
Issue issue = new Issue(var, issueContext, IssueCategory.MathDescription_SpatialModel_Variable, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_20, varName, subDomain.getName()), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
}
}
}
}
}
if (eventList.size() > 0 && isSpatial()) {
Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_SpatialModel, VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_22, Issue.SEVERITY_ERROR);
issueList.add(issue);
}
for (Event event : eventList) {
try {
event.bind(this);
} catch (ExpressionBindingException e) {
Issue issue = new Issue(event, issueContext, IssueCategory.MathDescription_SpatialModel_Event, e.getMessage(), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
}
for (DataGenerator dataGenerator : postProcessingBlock.getDataGeneratorList()) {
try {
dataGenerator.bind(this);
} catch (ExpressionBindingException e) {
Issue issue = new Issue(dataGenerator, issueContext, IssueCategory.MathDescription_SpatialModel_PostProcessingBlock, e.getMessage(), Issue.SEVERITY_ERROR);
issueList.add(issue);
}
}
}
use of cbit.vcell.geometry.surface.SurfaceGeometricRegion in project vcell by virtualcell.
the class CartesianMesh method createSimpleCartesianMesh.
public static CartesianMesh createSimpleCartesianMesh(Geometry geometry, Map<Polygon, MembraneElement> polygonMembaneElementMap) throws IOException, MathFormatException {
GeometrySurfaceDescription geometrySurfaceDescription = geometry.getGeometrySurfaceDescription();
RegionImage regionImage = geometrySurfaceDescription.getRegionImage();
ISize iSize = new ISize(regionImage.getNumX(), regionImage.getNumY(), regionImage.getNumZ());
CartesianMesh mesh = createSimpleCartesianMesh(geometry.getOrigin(), geometry.getExtent(), iSize, regionImage);
GeometricRegion[] geometricRegions = geometrySurfaceDescription.getGeometricRegions();
if (geometricRegions != null) {
int memRegionCount = 0;
for (int i = 0; i < geometricRegions.length; i++) {
if (geometricRegions[i] instanceof VolumeGeometricRegion) {
VolumeGeometricRegion vgr = (VolumeGeometricRegion) geometricRegions[i];
mesh.meshRegionInfo.mapVolumeRegionToSubvolume(vgr.getRegionID(), vgr.getSubVolume().getHandle(), vgr.getSize(), vgr.getName());
} else if (geometricRegions[i] instanceof SurfaceGeometricRegion) {
SurfaceGeometricRegion sgr = (SurfaceGeometricRegion) geometricRegions[i];
GeometricRegion[] neighbors = sgr.getAdjacentGeometricRegions();
VolumeGeometricRegion insideRegion = (VolumeGeometricRegion) neighbors[0];
VolumeGeometricRegion outsideRegion = (VolumeGeometricRegion) neighbors[1];
mesh.meshRegionInfo.mapMembraneRegionToVolumeRegion(memRegionCount, insideRegion.getRegionID(), outsideRegion.getRegionID(), sgr.getSize());
memRegionCount++;
}
}
}
SurfaceCollection surfaceCollection = geometrySurfaceDescription.getSurfaceCollection();
if (surfaceCollection != null) {
int numMembraneElement = surfaceCollection.getTotalPolygonCount();
mesh.membraneElements = new MembraneElement[numMembraneElement];
boolean bMembraneEdgeNeighborsAvailable = surfaceCollection.getMembraneEdgeNeighbors() != null && surfaceCollection.getMembraneEdgeNeighbors().length == surfaceCollection.getSurfaceCount();
int[] membraneElementMapMembraneRegion = new int[numMembraneElement];
mesh.meshRegionInfo.mapMembraneElementsToMembraneRegions(membraneElementMapMembraneRegion);
int memCount = 0;
// original values when no membraneedgeneighbors
int[] membraneNeighbors = new int[] { 0, 0, 0, 0 };
for (int i = 0; i < surfaceCollection.getSurfaceCount(); i++) {
Surface surface = surfaceCollection.getSurfaces(i);
bMembraneEdgeNeighborsAvailable = bMembraneEdgeNeighborsAvailable && surfaceCollection.getMembraneEdgeNeighbors()[i].length == surface.getPolygonCount();
for (int j = 0; j < surface.getPolygonCount(); j++) {
if (bMembraneEdgeNeighborsAvailable) {
membraneNeighbors = new int[MembraneElement.MAX_POSSIBLE_NEIGHBORS];
Arrays.fill(membraneNeighbors, MembraneElement.NEIGHBOR_UNDEFINED);
for (int k = 0; k < surfaceCollection.getMembraneEdgeNeighbors()[i][j].size(); k++) {
membraneNeighbors[k] = surfaceCollection.getMembraneEdgeNeighbors()[i][j].get(k).getMasterPolygonIndex();
}
}
Quadrilateral polygon = (Quadrilateral) surface.getPolygons(j);
int volNeighbor1Region = regionImage.getRegionInfoFromOffset(polygon.getVolIndexNeighbor1()).getRegionIndex();
int volNeighbor2Region = regionImage.getRegionInfoFromOffset(polygon.getVolIndexNeighbor2()).getRegionIndex();
HashMap<Integer, int[]> map = mesh.getMembraneRegionMapSubvolumesInOut();
Set<Entry<Integer, int[]>> entries = map.entrySet();
for (Entry<Integer, int[]> entry : entries) {
int[] volNeighbors = entry.getValue();
if (volNeighbors[0] == volNeighbor1Region && volNeighbors[1] == volNeighbor2Region || volNeighbors[1] == volNeighbor1Region && volNeighbors[0] == volNeighbor2Region) {
membraneElementMapMembraneRegion[memCount] = entry.getKey();
break;
}
}
mesh.membraneElements[memCount] = new MembraneElement(memCount, polygon.getVolIndexNeighbor1(), polygon.getVolIndexNeighbor2(), membraneNeighbors[0], membraneNeighbors[1], membraneNeighbors[2], membraneNeighbors[3], MembraneElement.AREA_UNDEFINED, 0, 0, 0, 0, 0, 0);
if (polygonMembaneElementMap != null) {
polygonMembaneElementMap.put(polygon, mesh.membraneElements[memCount]);
}
memCount++;
}
}
}
return mesh;
}
use of cbit.vcell.geometry.surface.SurfaceGeometricRegion in project vcell by virtualcell.
the class GeomDbDriver method getSurfaceDescription.
/**
* Insert the method's description here.
* Creation date: (7/29/00 2:10:42 PM)
* @param con java.sql.Connection
* @param geom cbit.vcell.geometry.Geometry
*/
private void getSurfaceDescription(Connection con, Geometry geom) throws SQLException, DataAccessException {
// System.out.println(sql);
Statement stmt = con.createStatement();
try {
String sql = null;
//
// read sampleSize and filterFrequency from GeometrySurfaceTable.
//
sql = " SELECT " + geoSurfaceTable.getTableName() + ".* " + " FROM " + geoSurfaceTable.getTableName() + " WHERE " + geoSurfaceTable.geometryRef.getQualifiedColName() + " = " + geom.getVersion().getVersionKey();
System.out.println(sql);
ResultSet rset = stmt.executeQuery(sql);
if (rset.next()) {
geoSurfaceTable.populateGeometrySurfaceDescription(rset, geom.getGeometrySurfaceDescription());
rset.close();
} else {
if (lg.isWarnEnabled()) {
lg.warn("surface description not found for geometry " + geom.getVersion().toString());
}
rset.close();
return;
}
//
// read volume regions from GeometricRegionTable
//
sql = " SELECT " + geoRegionTable.name.getQualifiedColName() + ", " + geoRegionTable.size.getQualifiedColName() + ", " + geoRegionTable.sizeUnit.getQualifiedColName() + ", " + geoRegionTable.subVolumeRef.getQualifiedColName() + ", " + geoRegionTable.regionID.getQualifiedColName() + " FROM " + geoRegionTable.getTableName() + " WHERE " + geoRegionTable.geometryRef.getQualifiedColName() + " = " + geom.getVersion().getVersionKey() + " AND " + geoRegionTable.type + " = " + GeometricRegionTable.TYPE_VOLUME;
System.out.println(sql);
rset = stmt.executeQuery(sql);
Vector<GeometricRegion> regionList = new Vector<GeometricRegion>();
while (rset.next()) {
VolumeGeometricRegion volumeRegion = geoRegionTable.getVolumeRegion(rset, geom);
regionList.add(volumeRegion);
}
VolumeGeometricRegion[] volumeRegions = (VolumeGeometricRegion[]) BeanUtils.getArray(regionList, VolumeGeometricRegion.class);
//
// read surface regions from GeometricRegionTable
//
sql = " SELECT " + "surfTable." + geoRegionTable.name.getUnqualifiedColName() + ", " + "surfTable." + geoRegionTable.size.getUnqualifiedColName() + ", " + "surfTable." + geoRegionTable.sizeUnit.getUnqualifiedColName() + ", " + "vol1Table.name as " + GeometricRegionTable.VOLUME1_NAME_COLUMN + ", " + "vol2Table.name as " + GeometricRegionTable.VOLUME2_NAME_COLUMN + " " + " FROM " + geoRegionTable.getTableName() + " surfTable, " + geoRegionTable.getTableName() + " vol1Table, " + geoRegionTable.getTableName() + " vol2Table " + " WHERE surfTable." + geoRegionTable.geometryRef.getUnqualifiedColName() + " = " + geom.getVersion().getVersionKey() + " AND vol1Table.id = surfTable." + geoRegionTable.volRegion1.getUnqualifiedColName() + " AND vol2Table.id = surfTable." + geoRegionTable.volRegion2.getUnqualifiedColName() + " AND surfTable." + geoRegionTable.type.getUnqualifiedColName() + " = " + GeometricRegionTable.TYPE_SURFACE;
System.out.println(sql);
rset = stmt.executeQuery(sql);
while (rset.next()) {
SurfaceGeometricRegion surfaceRegion = geoRegionTable.getSurfaceRegion(rset, volumeRegions, geom.getUnitSystem());
regionList.add(surfaceRegion);
}
//
// set regions onto the geometrySurfaceDescription
//
GeometricRegion[] regions = (GeometricRegion[]) BeanUtils.getArray(regionList, GeometricRegion.class);
geom.getGeometrySurfaceDescription().setGeometricRegions(regions);
} catch (Exception e) {
e.printStackTrace(System.out);
throw new DataAccessException(e.toString());
} finally {
// Release resources include resultset
stmt.close();
}
}
use of cbit.vcell.geometry.surface.SurfaceGeometricRegion in project vcell by virtualcell.
the class GeomDbDriver method insertGeometrySurfaceDescriptionSQL.
/**
* This method was created in VisualAge.
* @param vcimage cbit.image.VCImage
* @param userid java.lang.String
* @exception java.rmi.RemoteException The exception description.
*/
// default access for this method, to allow retrofitting surfaces to geometries.
void insertGeometrySurfaceDescriptionSQL(InsertHashtable hash, Connection con, Geometry geom, KeyValue geomKey) throws SQLException, cbit.image.ImageException, DataAccessException, ObjectNotFoundException {
String sql;
GeometrySurfaceDescription geoSurfaceDescription = geom.getGeometrySurfaceDescription();
//
// store GeometrySurfaceDescription (sampleSize and filterFrequency for now)
//
KeyValue newGeomSurfDescKey = keyFactory.getNewKey(con);
sql = "INSERT INTO " + geoSurfaceTable.getTableName() + " " + geoSurfaceTable.getSQLColumnList() + " VALUES " + geoSurfaceTable.getSQLValueList(newGeomSurfDescKey, geoSurfaceDescription, geomKey);
// System.out.println(sql);
updateCleanSQL(con, sql);
//
// store GeometricRegions
//
GeometricRegion[] regions = geoSurfaceDescription.getGeometricRegions();
// }
if (regions == null) {
System.out.println("Geometry " + geom.getName() + "(" + geom.getVersion() + ") doesn't have region information");
throw new DataAccessException("geometry '" + geom.getName() + " didn't have region information");
}
//
for (int i = 0; i < regions.length; i++) {
if (regions[i] instanceof VolumeGeometricRegion) {
VolumeGeometricRegion volumeRegion = (VolumeGeometricRegion) regions[i];
if (hash.getDatabaseKey(volumeRegion) == null) {
KeyValue newVolumeRegionKey = keyFactory.getNewKey(con);
KeyValue subvolumeKey = hash.getDatabaseKey(volumeRegion.getSubVolume());
sql = "INSERT INTO " + geoRegionTable.getTableName() + " " + geoRegionTable.getSQLColumnList() + " VALUES " + geoRegionTable.getSQLValueList(newVolumeRegionKey, volumeRegion, subvolumeKey, geomKey);
// System.out.println(sql);
updateCleanSQL(con, sql);
hash.put(volumeRegion, newVolumeRegionKey);
}
}
}
//
for (int i = 0; i < regions.length; i++) {
if (regions[i] instanceof SurfaceGeometricRegion) {
SurfaceGeometricRegion surfaceRegion = (SurfaceGeometricRegion) regions[i];
if (hash.getDatabaseKey(surfaceRegion) == null) {
KeyValue newSurfaceRegionKey = keyFactory.getNewKey(con);
KeyValue volumeRegion1Key = hash.getDatabaseKey((VolumeGeometricRegion) surfaceRegion.getAdjacentGeometricRegions()[0]);
KeyValue volumeRegion2Key = hash.getDatabaseKey((VolumeGeometricRegion) surfaceRegion.getAdjacentGeometricRegions()[1]);
sql = "INSERT INTO " + geoRegionTable.getTableName() + " " + geoRegionTable.getSQLColumnList() + " VALUES " + geoRegionTable.getSQLValueList(newSurfaceRegionKey, surfaceRegion, volumeRegion1Key, volumeRegion2Key, geomKey);
// System.out.println(sql);
updateCleanSQL(con, sql);
hash.put(surfaceRegion, newSurfaceRegionKey);
}
}
}
}
Aggregations