From b13742a51d23b5bba62a216d30538812126db6d2 Mon Sep 17 00:00:00 2001 From: jcschaff Date: Fri, 4 Apr 2025 11:01:19 -0400 Subject: [PATCH 1/5] bring in vcell submodule changes to access DataSet.read() --- vcell_submodule | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vcell_submodule b/vcell_submodule index ac098f0..0c860b5 160000 --- a/vcell_submodule +++ b/vcell_submodule @@ -1 +1 @@ -Subproject commit ac098f087c19997fca9074a65e6cbcbefbc15d46 +Subproject commit 0c860b574b260cf14d31f19b448c6dc5b240d0e7 From 2850d7ac542fb2503f8d0e573096b9e1ee5913ac Mon Sep 17 00:00:00 2001 From: jcschaff Date: Fri, 4 Apr 2025 12:03:03 -0400 Subject: [PATCH 2/5] accommodate existing field data files written by pyvcell --- .../solvers/LocalFVSolverStandalone.java | 4 +- .../solvers/LocalFiniteVolumeFileWriter.java | 42 +++++++++++++++---- 2 files changed, 36 insertions(+), 10 deletions(-) diff --git a/vcell-native/src/main/java/org/vcell/libvcell/solvers/LocalFVSolverStandalone.java b/vcell-native/src/main/java/org/vcell/libvcell/solvers/LocalFVSolverStandalone.java index 8b2dde0..c1072ef 100644 --- a/vcell-native/src/main/java/org/vcell/libvcell/solvers/LocalFVSolverStandalone.java +++ b/vcell-native/src/main/java/org/vcell/libvcell/solvers/LocalFVSolverStandalone.java @@ -167,7 +167,6 @@ public void writeFieldFunctionData(OutputContext outputContext, FieldDataIdentif HashMap bFieldDataResample = new HashMap<>(); int i=0; for (FieldDataIdentifierSpec fdiSpec: argFieldDataIDSpecs) { - File ext_dataDir = new File(this.parentDir, fdiSpec.getFieldFuncArgs().getFieldName()); if (!uniqueFieldDataIDSpecAndFileH.containsKey(fdiSpec)){ File newResampledFieldDataFile = new File(dataDir, SimulationData.createCanonicalResampleFileName(getSimulationJob().getVCDataIdentifier(), fdiSpec.getFieldFuncArgs())); uniqueFieldDataIDSpecAndFileH.put(fdiSpec,newResampledFieldDataFile); @@ -179,6 +178,9 @@ public void writeFieldFunctionData(OutputContext outputContext, FieldDataIdentif Set> resampleSet = uniqueFieldDataIDSpecAndFileH.entrySet(); for (Map.Entry resampleEntry : resampleSet) { if (resampleEntry.getValue().exists()) { + // field data file has already been written + // 1. in a previous loop iteration + // 2. from pyvcell writing the field data file directly into this directory for an image-based field data continue; } FieldDataIdentifierSpec fieldDataIdSpec = resampleEntry.getKey(); diff --git a/vcell-native/src/main/java/org/vcell/libvcell/solvers/LocalFiniteVolumeFileWriter.java b/vcell-native/src/main/java/org/vcell/libvcell/solvers/LocalFiniteVolumeFileWriter.java index aebd22c..1457088 100644 --- a/vcell-native/src/main/java/org/vcell/libvcell/solvers/LocalFiniteVolumeFileWriter.java +++ b/vcell-native/src/main/java/org/vcell/libvcell/solvers/LocalFiniteVolumeFileWriter.java @@ -7,8 +7,10 @@ import cbit.vcell.math.Variable; import cbit.vcell.math.VariableType; import cbit.vcell.messaging.server.SimulationTask; +import cbit.vcell.parser.DivideByZeroException; import cbit.vcell.parser.Expression; import cbit.vcell.parser.ExpressionException; +import cbit.vcell.simdata.DataSet; import cbit.vcell.simdata.SimDataBlock; import cbit.vcell.simdata.SimulationData; import cbit.vcell.simdata.VCData; @@ -66,15 +68,7 @@ protected void writeFieldData() throws ExpressionException, DataAccessException ); uniqueFieldDataIDSpecs.add(fieldDataIDSpec); VariableType varType = fieldDataIDSpec.getFieldFuncArgs().getVariableType(); - final VariableType dataVarType; - try { - File ext_data_dir = new File(workingDirectory.getParentFile(), ffa.getFieldName()); - VCData vcData = new SimulationData(fieldDataIDSpec.getExternalDataIdentifier(), ext_data_dir, ext_data_dir, null); - SimDataBlock simDataBlock = vcData.getSimDataBlock(null, ffa.getVariableName(), ffa.getTime().evaluateConstant()); - dataVarType = simDataBlock.getVariableType(); - } catch (IOException e) { - throw new DataAccessException("Error reading field data file: " + e.getMessage()); - } + final VariableType dataVarType = getVariableTypeFromFieldDataFiles(fieldDataIDSpec, ffa); if (varType.equals(VariableType.UNKNOWN)) { varType = dataVarType; } else if (!varType.equals(dataVarType)) { @@ -104,4 +98,34 @@ protected void writeFieldData() throws ExpressionException, DataAccessException printWriter.println(); } + private VariableType getVariableTypeFromFieldDataFiles(FieldDataIdentifierSpec fieldDataIDSpec, FieldFunctionArguments ffa) throws DataAccessException { + + try { + final VariableType dataVarType; + // + // First, look to see if the processed field data file already exists, if so, use it to determine the variable type + // + DataSet dataSet = new DataSet(); + File existingFieldDataFile = new File(workingDirectory, SimulationData.createCanonicalResampleFileName(fieldDataIDSpec.getExternalDataIdentifier(), ffa)); + if (existingFieldDataFile.exists()) { + // field data file may already exist + // 1. from pyvcell writing the field data file directly into this directory for an image-based field data + dataSet.read(existingFieldDataFile, null); + int varTypeInteger = dataSet.getVariableTypeInteger(fieldDataIDSpec.getFieldFuncArgs().getVariableName()); + dataVarType = VariableType.getVariableTypeFromInteger(varTypeInteger); + }else { + // + // Else, read the unprocessed simulation results referenced in the FieldDataIdentifierSpec and extract the VariableType + // + File ext_data_dir = new File(workingDirectory.getParentFile(), ffa.getFieldName()); + VCData vcData = new SimulationData(fieldDataIDSpec.getExternalDataIdentifier(), ext_data_dir, ext_data_dir, null); + SimDataBlock simDataBlock = vcData.getSimDataBlock(null, ffa.getVariableName(), ffa.getTime().evaluateConstant()); + dataVarType = simDataBlock.getVariableType(); + } + return dataVarType; + } catch (IOException | ExpressionException | DataAccessException e) { + throw new DataAccessException("Error reading field data file: " + e.getMessage()); + } + } + } From 98568086312f60c19df3eb37601230fd7adf737f Mon Sep 17 00:00:00 2001 From: jcschaff Date: Fri, 4 Apr 2025 12:30:56 -0400 Subject: [PATCH 3/5] refactor Java unit tests into multiple files. --- .../vcell/libvcell/ModelEntrypointsTest.java | 47 +++++++ ...tsTest.java => SolverEntrypointsTest.java} | 120 +----------------- .../java/org/vcell/libvcell/TestUtils.java | 86 +++++++++++++ 3 files changed, 139 insertions(+), 114 deletions(-) create mode 100644 vcell-native/src/test/java/org/vcell/libvcell/ModelEntrypointsTest.java rename vcell-native/src/test/java/org/vcell/libvcell/{EntrypointsTest.java => SolverEntrypointsTest.java} (60%) create mode 100644 vcell-native/src/test/java/org/vcell/libvcell/TestUtils.java diff --git a/vcell-native/src/test/java/org/vcell/libvcell/ModelEntrypointsTest.java b/vcell-native/src/test/java/org/vcell/libvcell/ModelEntrypointsTest.java new file mode 100644 index 0000000..b6ae444 --- /dev/null +++ b/vcell-native/src/test/java/org/vcell/libvcell/ModelEntrypointsTest.java @@ -0,0 +1,47 @@ +package org.vcell.libvcell; + +import cbit.util.xml.VCLoggerException; +import cbit.vcell.mapping.MappingException; +import cbit.vcell.xml.XmlParseException; +import org.junit.jupiter.api.Test; +import org.vcell.sbml.SbmlException; + +import javax.xml.stream.XMLStreamException; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; + +import static org.vcell.libvcell.ModelUtils.*; +import static org.vcell.libvcell.TestUtils.getFileContentsAsString; + +public class ModelEntrypointsTest { + + @Test + public void test_sbml_to_vcml() throws MappingException, IOException, XmlParseException, VCLoggerException { + String sbmlContent = getFileContentsAsString("/TinySpatialProject_Application0.xml"); + File parent_dir = Files.createTempDirectory("sbmlToVcml").toFile(); + File vcml_temp_file = new File(parent_dir, "temp.vcml"); + sbml_to_vcml(sbmlContent, vcml_temp_file.toPath()); + assert(vcml_temp_file.exists()); + } + + @Test + public void test_vcml_to_sbml() throws MappingException, IOException, XmlParseException, XMLStreamException, SbmlException { + String vcmlContent = getFileContentsAsString("/TinySpatialProject_Application0.vcml"); + File parent_dir = Files.createTempDirectory("vcmlToSbml").toFile(); + File sbml_temp_file = new File(parent_dir, "temp.sbml"); + String applicationName = "unnamed_spatialGeom"; + vcml_to_sbml(vcmlContent, applicationName, sbml_temp_file.toPath()); + assert(sbml_temp_file.exists()); + } + + @Test + public void test_vcml_to_vcml() throws MappingException, IOException, XmlParseException, XMLStreamException, SbmlException { + String vcmlContent = getFileContentsAsString("/TinySpatialProject_Application0.vcml"); + File parent_dir = Files.createTempDirectory("vcmlToVcml").toFile(); + File vcml_temp_file = new File(parent_dir, "temp.vcml"); + vcml_to_vcml(vcmlContent, vcml_temp_file.toPath()); + assert(vcml_temp_file.exists()); + } + +} diff --git a/vcell-native/src/test/java/org/vcell/libvcell/EntrypointsTest.java b/vcell-native/src/test/java/org/vcell/libvcell/SolverEntrypointsTest.java similarity index 60% rename from vcell-native/src/test/java/org/vcell/libvcell/EntrypointsTest.java rename to vcell-native/src/test/java/org/vcell/libvcell/SolverEntrypointsTest.java index f93c3c3..157d6be 100644 --- a/vcell-native/src/test/java/org/vcell/libvcell/EntrypointsTest.java +++ b/vcell-native/src/test/java/org/vcell/libvcell/SolverEntrypointsTest.java @@ -6,30 +6,21 @@ import cbit.vcell.parser.ExpressionException; import cbit.vcell.solver.SolverException; import cbit.vcell.xml.XmlParseException; -import org.apache.commons.compress.archivers.tar.TarArchiveEntry; -import org.apache.commons.compress.archivers.tar.TarArchiveInputStream; import org.junit.jupiter.api.Test; -import org.vcell.sbml.SbmlException; -import javax.xml.stream.XMLStreamException; import java.beans.PropertyVetoException; -import java.io.*; -import java.nio.charset.StandardCharsets; +import java.io.File; +import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; -import java.util.Objects; import java.util.UUID; -import java.util.stream.Collectors; -import java.util.zip.GZIPInputStream; import static org.junit.jupiter.api.Assertions.*; import static org.vcell.libvcell.SolverUtils.sbmlToFiniteVolumeInput; import static org.vcell.libvcell.SolverUtils.vcmlToFiniteVolumeInput; -import static org.vcell.libvcell.ModelUtils.sbml_to_vcml; -import static org.vcell.libvcell.ModelUtils.vcml_to_sbml; -import static org.vcell.libvcell.ModelUtils.vcml_to_vcml; +import static org.vcell.libvcell.TestUtils.*; -public class EntrypointsTest { +public class SolverEntrypointsTest { @Test public void testSbmlToFiniteVolumeInput() throws PropertyVetoException, SolverException, ExpressionException, MappingException, VCLoggerException, IOException { @@ -66,7 +57,7 @@ public void testVcmlToFiniteVolumeInput_field_data() throws SolverException, Exp File output_dir = new File(parent_dir, "output_dir"); File ext_data_dir = new File(parent_dir, "test2_lsm_DEMO"); assertEquals(0, countFiles(ext_data_dir)); - extractTgz(EntrypointsTest.class.getResourceAsStream("/test2_lsm_DEMO.tgz"), parent_dir); + extractTgz(SolverEntrypointsTest.class.getResourceAsStream("/test2_lsm_DEMO.tgz"), parent_dir); listFilesInDirectory(ext_data_dir); assertEquals(10, countFiles(ext_data_dir)); @@ -87,7 +78,7 @@ public void testVcmlToFiniteVolumeInput_field_data_not_found() throws SolverExce File ext_data_dir_MISSPELLED = new File(parent_dir, "test2_lsm_DEMO_MISSPELLED"); assertEquals(0, countFiles(ext_data_dir)); assertEquals(0, countFiles(ext_data_dir_MISSPELLED)); - extractTgz(EntrypointsTest.class.getResourceAsStream("/test2_lsm_DEMO.tgz"), parent_dir); + extractTgz(SolverEntrypointsTest.class.getResourceAsStream("/test2_lsm_DEMO.tgz"), parent_dir); Files.move(ext_data_dir.toPath(), ext_data_dir_MISSPELLED.toPath()).toFile(); assertEquals(0, countFiles(ext_data_dir)); listFilesInDirectory(ext_data_dir_MISSPELLED); @@ -112,34 +103,6 @@ public void testVcmlToFiniteVolumeInput() throws SolverException, ExpressionExce assertEquals(4, countFiles(output_dir)); } - @Test - public void test_sbml_to_vcml() throws MappingException, IOException, XmlParseException, VCLoggerException { - String sbmlContent = getFileContentsAsString("/TinySpatialProject_Application0.xml"); - File parent_dir = Files.createTempDirectory("sbmlToVcml").toFile(); - File vcml_temp_file = new File(parent_dir, "temp.vcml"); - sbml_to_vcml(sbmlContent, vcml_temp_file.toPath()); - assert(vcml_temp_file.exists()); - } - - @Test - public void test_vcml_to_sbml() throws MappingException, IOException, XmlParseException, XMLStreamException, SbmlException { - String vcmlContent = getFileContentsAsString("/TinySpatialProject_Application0.vcml"); - File parent_dir = Files.createTempDirectory("vcmlToSbml").toFile(); - File sbml_temp_file = new File(parent_dir, "temp.sbml"); - String applicationName = "unnamed_spatialGeom"; - vcml_to_sbml(vcmlContent, applicationName, sbml_temp_file.toPath()); - assert(sbml_temp_file.exists()); - } - - @Test - public void test_vcml_to_vcml() throws MappingException, IOException, XmlParseException, XMLStreamException, SbmlException { - String vcmlContent = getFileContentsAsString("/TinySpatialProject_Application0.vcml"); - File parent_dir = Files.createTempDirectory("vcmlToVcml").toFile(); - File vcml_temp_file = new File(parent_dir, "temp.vcml"); - vcml_to_vcml(vcmlContent, vcml_temp_file.toPath()); - assert(vcml_temp_file.exists()); - } - @Test public void testVcmlToFiniteVolumeInput_bad_simname() throws IOException { String vcmlContent = getFileContentsAsString("/TinySpatialProject_Application0.vcml"); @@ -177,75 +140,4 @@ public void testVcmlToFiniteVolumeInput_sbml_instead() throws IOException { assertEquals("expecting VCML content, not SBML", exc.getMessage()); } - private static String getFileContentsAsString(String filename) throws IOException { - try (InputStream inputStream = EntrypointsTest.class.getResourceAsStream(filename)) { - if (inputStream == null) { - throw new FileNotFoundException("file not found! " + filename); - } - return new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)) - .lines().collect(Collectors.joining("\n")); - } - } - - private static byte[] getFileContentsAsBytes(String filename) throws IOException { - try (InputStream inputStream = EntrypointsTest.class.getResourceAsStream(filename)) { - if (inputStream == null) { - throw new FileNotFoundException("file not found! " + filename); - } - try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) { - byte[] buffer = new byte[1024]; - int length; - while ((length = inputStream.read(buffer)) != -1) { - byteArrayOutputStream.write(buffer, 0, length); - } - return byteArrayOutputStream.toByteArray(); - } - } - } - - private int countFiles(File dir) { - File[] files = dir.listFiles(); - if (files == null) { - return 0; - } - return Objects.requireNonNull(dir.listFiles()).length; - } - - private void listFilesInDirectory(File dir) { - File[] files = dir.listFiles(); - if (files != null) { - for (File file : files) { - System.out.println(file.getAbsolutePath()); - } - } - } - - public static void extractTgz(InputStream tgzFileStream, File outputDir) throws IOException { - try (GZIPInputStream gis = new GZIPInputStream(tgzFileStream); - TarArchiveInputStream tis = new TarArchiveInputStream(gis)) { - - TarArchiveEntry entry; - while ((entry = tis.getNextTarEntry()) != null) { - File outputFile = new File(outputDir, entry.getName()); - if (entry.isDirectory()) { - if (!outputFile.exists()) { - outputFile.mkdirs(); - } - } else { - File parent = outputFile.getParentFile(); - if (!parent.exists()) { - parent.mkdirs(); - } - try (OutputStream os = Files.newOutputStream(outputFile.toPath())) { - byte[] buffer = new byte[1024]; - int len; - while ((len = tis.read(buffer)) != -1) { - os.write(buffer, 0, len); - } - } - } - } - } - } - } diff --git a/vcell-native/src/test/java/org/vcell/libvcell/TestUtils.java b/vcell-native/src/test/java/org/vcell/libvcell/TestUtils.java new file mode 100644 index 0000000..f032a20 --- /dev/null +++ b/vcell-native/src/test/java/org/vcell/libvcell/TestUtils.java @@ -0,0 +1,86 @@ +package org.vcell.libvcell; + +import org.apache.commons.compress.archivers.tar.TarArchiveEntry; +import org.apache.commons.compress.archivers.tar.TarArchiveInputStream; + +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.util.Objects; +import java.util.stream.Collectors; +import java.util.zip.GZIPInputStream; + +public class TestUtils { + public static String getFileContentsAsString(String filename) throws IOException { + try (InputStream inputStream = ModelEntrypointsTest.class.getResourceAsStream(filename)) { + if (inputStream == null) { + throw new FileNotFoundException("file not found! " + filename); + } + return new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)) + .lines().collect(Collectors.joining("\n")); + } + } + + public static byte[] getFileContentsAsBytes(String filename) throws IOException { + try (InputStream inputStream = SolverEntrypointsTest.class.getResourceAsStream(filename)) { + if (inputStream == null) { + throw new FileNotFoundException("file not found! " + filename); + } + try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) { + byte[] buffer = new byte[1024]; + int length; + while ((length = inputStream.read(buffer)) != -1) { + byteArrayOutputStream.write(buffer, 0, length); + } + return byteArrayOutputStream.toByteArray(); + } + } + } + + public static int countFiles(File dir) { + File[] files = dir.listFiles(); + if (files == null) { + return 0; + } + return Objects.requireNonNull(dir.listFiles()).length; + } + + public static void listFilesInDirectory(File dir) { + File[] files = dir.listFiles(); + if (files != null) { + for (File file : files) { + System.out.println(file.getAbsolutePath()); + } + } + } + + public static void extractTgz(InputStream tgzFileStream, File outputDir) throws IOException { + try (GZIPInputStream gis = new GZIPInputStream(tgzFileStream); + TarArchiveInputStream tis = new TarArchiveInputStream(gis)) { + + TarArchiveEntry entry; + while ((entry = tis.getNextTarEntry()) != null) { + File outputFile = new File(outputDir, entry.getName()); + if (entry.isDirectory()) { + if (!outputFile.exists()) { + outputFile.mkdirs(); + } + } else { + File parent = outputFile.getParentFile(); + if (!parent.exists()) { + parent.mkdirs(); + } + try (OutputStream os = Files.newOutputStream(outputFile.toPath())) { + byte[] buffer = new byte[1024]; + int len; + while ((len = tis.read(buffer)) != -1) { + os.write(buffer, 0, len); + } + } + } + } + } + } + + +} From 5090ce8a7f75827cdd9f46cd594e576d8d9f2f8b Mon Sep 17 00:00:00 2001 From: jcschaff Date: Fri, 4 Apr 2025 14:05:57 -0400 Subject: [PATCH 4/5] use prebuilt SImID_SIMULATIONKEY_JOBINDEX_ fdata files if exists. --- .../java/org/vcell/libvcell/SolverUtils.java | 39 +++++++++++++++++- .../solvers/LocalFiniteVolumeFileWriter.java | 5 ++- .../vcell/libvcell/SolverEntrypointsTest.java | 19 ++++++++- .../resources/test2_lsm_DEMO_resampled.tgz | Bin 0 -> 78192 bytes 4 files changed, 59 insertions(+), 4 deletions(-) create mode 100644 vcell-native/src/test/resources/test2_lsm_DEMO_resampled.tgz diff --git a/vcell-native/src/main/java/org/vcell/libvcell/SolverUtils.java b/vcell-native/src/main/java/org/vcell/libvcell/SolverUtils.java index 31352c7..29579c4 100644 --- a/vcell-native/src/main/java/org/vcell/libvcell/SolverUtils.java +++ b/vcell-native/src/main/java/org/vcell/libvcell/SolverUtils.java @@ -12,6 +12,7 @@ import cbit.vcell.messaging.server.SimulationTask; import cbit.vcell.mongodb.VCMongoMessage; import cbit.vcell.parser.ExpressionException; +import cbit.vcell.simdata.SimulationData; import cbit.vcell.solver.*; import cbit.vcell.xml.XMLSource; import cbit.vcell.xml.XmlHelper; @@ -30,6 +31,7 @@ import java.io.ByteArrayInputStream; import java.io.File; import java.io.InputStream; +import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; @@ -49,17 +51,35 @@ public static void vcmlToFiniteVolumeInput(String vcml_content, String simulatio if (sim == null) { throw new IllegalArgumentException("Simulation not found: " + simulation_name); } - FieldDataIdentifierSpec[] fdiSpecs = getFieldDataIdentifierSpecs(sim, parentDir); + FieldDataIdentifierSpec[] fdiSpecs = getFieldDataIdentifierSpecs(sim, outputDir, parentDir); TempSimulation tempSimulation = new TempSimulation(sim, false); tempSimulation.setSimulationOwner(sim.getSimulationOwner()); SimulationJob tempSimulationJob = new SimulationJob(tempSimulation, 0, fdiSpecs); + + renameExistingFieldDataFiles(tempSimulation.getKey(), tempSimulationJob.getJobIndex(), outputDir); + SimulationTask simTask = new SimulationTask(tempSimulationJob, 0); LocalFVSolverStandalone solver = new LocalFVSolverStandalone(simTask, outputDir); solver.initialize(); } - private static FieldDataIdentifierSpec[] getFieldDataIdentifierSpecs(Simulation sim, File parentDir) throws MathException, ExpressionException { + private static void renameExistingFieldDataFiles(KeyValue tempSimKey, int jobId, File outputDir) { + File[] files = outputDir.listFiles(); + if (files != null) { + for (File file : files) { + if (file.getName().startsWith("SimID_SIMULATIONKEY_JOBINDEX_")) { + String newName = file.getName().replace("SIMULATIONKEY",tempSimKey.toString()).replace("JOBINDEX",String.valueOf(jobId)); + File newFile = new File(outputDir, newName); + if (!file.renameTo(newFile)){ + throw new RuntimeException("Could not rename " + file.getName() + " to " + newFile.getAbsolutePath()); + } + } + } + } + } + + private static FieldDataIdentifierSpec[] getFieldDataIdentifierSpecs(Simulation sim, File outputDir, File parentDir) throws MathException, ExpressionException { FieldDataIdentifierSpec[] fdiSpecs = null; FieldFunctionArguments[] fieldFuncArgs = FieldUtilities.getFieldFunctionArguments(sim.getMathDescription()); if (fieldFuncArgs != null) { @@ -67,6 +87,21 @@ private static FieldDataIdentifierSpec[] getFieldDataIdentifierSpecs(Simulation for (FieldFunctionArguments fieldFuncArg : fieldFuncArgs) { if (fieldFuncArg != null) { String name = fieldFuncArg.getFieldName(); + // + // First, check if the resampled field data files are already present (e.g. if pyvcell wrote the files directly from image data) + // + ExternalDataIdentifier fakeExtDataId = new ExternalDataIdentifier(sim.getKey(), User.tempUser, name); + String fieldDataFileName = SimulationData.createCanonicalResampleFileName(fakeExtDataId, fieldFuncArg); + fieldDataFileName = fieldDataFileName.replace("SimID_" + sim.getKey().toString() + "_0_", "SimID_SIMULATIONKEY_JOBINDEX_"); + File preexistingFieldDataFile = new File(outputDir, fieldDataFileName); + if (preexistingFieldDataFile.exists()) { + fdiSpecList.add(new FieldDataIdentifierSpec(fieldFuncArg, fakeExtDataId)); + continue; + } + + // + // If not, check if the field data directory exists as a subdirectory of the parentDir - holding simulation results. + // File fieldDataDir = new File(parentDir, name); if (!fieldDataDir.exists()) { throw new IllegalArgumentException("Field data directory does not exist: " + fieldDataDir.getAbsolutePath()); diff --git a/vcell-native/src/main/java/org/vcell/libvcell/solvers/LocalFiniteVolumeFileWriter.java b/vcell-native/src/main/java/org/vcell/libvcell/solvers/LocalFiniteVolumeFileWriter.java index 1457088..3813594 100644 --- a/vcell-native/src/main/java/org/vcell/libvcell/solvers/LocalFiniteVolumeFileWriter.java +++ b/vcell-native/src/main/java/org/vcell/libvcell/solvers/LocalFiniteVolumeFileWriter.java @@ -17,6 +17,8 @@ import cbit.vcell.solver.Simulation; import cbit.vcell.solvers.FiniteVolumeFileWriter; import org.vcell.util.DataAccessException; +import org.vcell.util.document.ExternalDataIdentifier; +import org.vcell.util.document.User; import java.io.File; import java.io.IOException; @@ -106,7 +108,8 @@ private VariableType getVariableTypeFromFieldDataFiles(FieldDataIdentifierSpec f // First, look to see if the processed field data file already exists, if so, use it to determine the variable type // DataSet dataSet = new DataSet(); - File existingFieldDataFile = new File(workingDirectory, SimulationData.createCanonicalResampleFileName(fieldDataIDSpec.getExternalDataIdentifier(), ffa)); + ExternalDataIdentifier existingFieldDataID = new ExternalDataIdentifier(this.simTask.getSimKey(), User.tempUser, ffa.getFieldName()); + File existingFieldDataFile = new File(workingDirectory, SimulationData.createCanonicalResampleFileName(existingFieldDataID, ffa)); if (existingFieldDataFile.exists()) { // field data file may already exist // 1. from pyvcell writing the field data file directly into this directory for an image-based field data diff --git a/vcell-native/src/test/java/org/vcell/libvcell/SolverEntrypointsTest.java b/vcell-native/src/test/java/org/vcell/libvcell/SolverEntrypointsTest.java index 157d6be..e3b890c 100644 --- a/vcell-native/src/test/java/org/vcell/libvcell/SolverEntrypointsTest.java +++ b/vcell-native/src/test/java/org/vcell/libvcell/SolverEntrypointsTest.java @@ -50,6 +50,23 @@ public void testSbmlToFiniteVolumeInput_vcml_instead() throws IOException { assertEquals("expecting SBML content, not VCML", exc.getMessage()); } + @Test + public void testVcmlToFiniteVolumeInput_field_data_already_sampled() throws SolverException, ExpressionException, MappingException, IOException, XmlParseException, MathException, InterruptedException { + String vcmlContent = getFileContentsAsString("/FieldDataDemo.vcml"); + File parent_dir = Files.createTempDirectory("vcmlToFiniteVolumeInput_"+UUID.randomUUID()).toFile(); + File output_dir = new File(parent_dir, "output_dir"); + assertEquals(0, countFiles(output_dir)); + // prepopulate the output_dir with the resampled field data files, should use these instead. + extractTgz(SolverEntrypointsTest.class.getResourceAsStream("/test2_lsm_DEMO_resampled.tgz"), output_dir); + listFilesInDirectory(output_dir); + assertEquals(2, countFiles(output_dir)); + + String simulationName = "Simulation0"; + vcmlToFiniteVolumeInput(vcmlContent, simulationName, parent_dir, output_dir); + listFilesInDirectory(output_dir); + assertEquals(6, countFiles(output_dir)); + } + @Test public void testVcmlToFiniteVolumeInput_field_data() throws SolverException, ExpressionException, MappingException, IOException, XmlParseException, MathException, InterruptedException { String vcmlContent = getFileContentsAsString("/FieldDataDemo.vcml"); @@ -70,7 +87,7 @@ public void testVcmlToFiniteVolumeInput_field_data() throws SolverException, Exp } @Test - public void testVcmlToFiniteVolumeInput_field_data_not_found() throws SolverException, ExpressionException, MappingException, IOException, XmlParseException, MathException, InterruptedException { + public void testVcmlToFiniteVolumeInput_field_data_not_found() throws IOException { String vcmlContent = getFileContentsAsString("/FieldDataDemo.vcml"); File parent_dir = Files.createTempDirectory("vcmlToFiniteVolumeInput_"+UUID.randomUUID()).toFile(); File output_dir = new File(parent_dir, "output_dir"); diff --git a/vcell-native/src/test/resources/test2_lsm_DEMO_resampled.tgz b/vcell-native/src/test/resources/test2_lsm_DEMO_resampled.tgz new file mode 100644 index 0000000000000000000000000000000000000000..c2fd6d737f5ef791c0f9ff95ee42a85454e82eda GIT binary patch literal 78192 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 literal 0 HcmV?d00001 From 3a42ff0c29135bd41cb570af3b1206a01c254908 Mon Sep 17 00:00:00 2001 From: jcschaff Date: Fri, 4 Apr 2025 14:13:30 -0400 Subject: [PATCH 5/5] bump version to 0.0.10 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index eb8cd13..e8b84ac 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api" [tool.poetry] name = "libvcell" -version = "0.0.9" +version = "0.0.10" description = "This is a python package which wraps a subset of VCell Java code as a native python package." authors = ["Jim Schaff ", "Ezequiel Valencia "] repository = "https://github.com/virtualcell/libvcell"