diff --git a/vcell-core/src/main/java/cbit/vcell/simdata/DataSetControllerImpl.java b/vcell-core/src/main/java/cbit/vcell/simdata/DataSetControllerImpl.java index c767b96aae..bc53a48a79 100644 --- a/vcell-core/src/main/java/cbit/vcell/simdata/DataSetControllerImpl.java +++ b/vcell-core/src/main/java/cbit/vcell/simdata/DataSetControllerImpl.java @@ -2402,7 +2402,15 @@ public ODEDataBlock getODEDataBlock(VCDataIdentifier vcdID) throws DataAccessExc public LangevinBatchResultSet getLangevinBatchResultSet(VCDataIdentifier vcdID) throws DataAccessException { if (lg.isTraceEnabled()) lg.trace("DataSetControllerImpl.getLangevinBatchResultSet()"); try { - VCData simData = getVCData(vcdID); + VCData vcData = getVCData(vcdID); + if(!(vcData instanceof SimulationData)) { + return null; + } + SimulationData simData = (SimulationData)vcData; + if(!(simData.getIsIDAData())) { + return null; + } + ODEDataInfo odeDataInfo = new ODEDataInfo(vcdID.getOwner(), vcdID.getID(), simData.getDataBlockTimeStamp(ODE_DATA, 0)); int keepAtMost = 10000; diff --git a/vcell-core/src/main/java/cbit/vcell/simdata/LangevinSolverResultSet.java b/vcell-core/src/main/java/cbit/vcell/simdata/LangevinSolverResultSet.java new file mode 100644 index 0000000000..edf1b5a234 --- /dev/null +++ b/vcell-core/src/main/java/cbit/vcell/simdata/LangevinSolverResultSet.java @@ -0,0 +1,74 @@ +package cbit.vcell.simdata; + +import cbit.vcell.solver.ode.ODESimData; + +import java.io.*; + +public class LangevinSolverResultSet implements Serializable { + + private final LangevinBatchResultSet raw; + + public LangevinSolverResultSet(LangevinBatchResultSet raw) { + this.raw = raw; + } + +// // safe getter that returns a deep copy, but I don't think we need it +// public LangevinBatchResultSet getLangevinBatchResultSetSafe() { +// return deepCopy(raw); +// } + + // convenience getters + public ODESimData getAvg() { + return raw == null ? null : raw.getOdeSimDataAvg(); + } + public ODESimData getMin() { + return raw == null ? null : raw.getOdeSimDataMin(); + } + public ODESimData getMax() { + return raw == null ? null : raw.getOdeSimDataMax(); + } + public ODESimData getStd() { + return raw == null ? null : raw.getOdeSimDataStd(); + } + public ODESimData getClusterCounts() { + return raw == null ? null : raw.getOdeSimDataClusterCounts(); + } + public ODESimData getClusterMean() { + return raw == null ? null : raw.getOdeSimDataClusterMean(); + } + public ODESimData getClusterOverall() { + return raw == null ? null : raw.getOdeSimDataClusterOverall(); + } + + // helper functions + public boolean isAverageDataAvailable() { + return getAvg() != null && + getMin() != null && + getMax() != null && + getStd() != null; + } + public boolean isClusterDataAvailable() { + return getClusterCounts() != null && + getClusterMean() != null && + getClusterOverall() != null; + } + + private static LangevinBatchResultSet deepCopy(LangevinBatchResultSet original) { + if (original == null) { + return null; + } + try { + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + ObjectOutputStream out = new ObjectOutputStream(bos); + out.writeObject(original); + out.flush(); + + ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(bos.toByteArray())); + return (LangevinBatchResultSet) in.readObject(); + + } catch (ClassNotFoundException | IOException e) { + throw new RuntimeException("Deep copy failed", e); + } + } + +} diff --git a/vcell-core/src/main/java/cbit/vcell/simdata/ODEDataManager.java b/vcell-core/src/main/java/cbit/vcell/simdata/ODEDataManager.java index 6b6645d14b..418d034b5c 100644 --- a/vcell-core/src/main/java/cbit/vcell/simdata/ODEDataManager.java +++ b/vcell-core/src/main/java/cbit/vcell/simdata/ODEDataManager.java @@ -35,7 +35,7 @@ public class ODEDataManager implements DataManager { private VCDataIdentifier vcDataIdentifier = null; private ODESolverResultSet odeSolverResultSet = null; private NFSimMolecularConfigurations nFSimMolecularConfigurations = null; - private LangevinBatchResultSet langevinBatchResultSet = null; + private LangevinSolverResultSet langevinSolverResultSet = null; private OutputContext outputContext = null; public OutputContext getOutputContext() { @@ -180,7 +180,11 @@ private void connect() throws DataAccessException { // clone, so we can operate safely on it (adding/removing user-defined functions) - real remote data is being cached... odeSolverResultSet = new ODESimData(getVCDataIdentifier(),getVCDataManager().getODEData(getVCDataIdentifier())); nFSimMolecularConfigurations = getVCDataManager().getNFSimMolecularConfigurations(getVCDataIdentifier()); -// langevinBatchResultSet = getVCDataManager().getLangevinBatchResultSet(getVCDataIdentifier()); + LangevinBatchResultSet raw = getVCDataManager().getLangevinBatchResultSet(getVCDataIdentifier()); + langevinSolverResultSet = new LangevinSolverResultSet(raw); // may be null + if( langevinSolverResultSet.isAverageDataAvailable()) { + odeSolverResultSet = langevinSolverResultSet.getAvg(); + } } private void addOutputFunction(AnnotatedFunction function, ODESolverResultSet odeRS) { diff --git a/vcell-core/src/main/java/cbit/vcell/simdata/SimulationData.java b/vcell-core/src/main/java/cbit/vcell/simdata/SimulationData.java index 0d55950ba8..e08a9270b3 100644 --- a/vcell-core/src/main/java/cbit/vcell/simdata/SimulationData.java +++ b/vcell-core/src/main/java/cbit/vcell/simdata/SimulationData.java @@ -639,11 +639,17 @@ public synchronized File getJobFunctionsFile() throws FileNotFoundException { -public synchronized boolean getIsODEData() throws DataAccessException { - refreshLogFile(); - return isODEData; -} - + public synchronized boolean getIsODEData() throws DataAccessException { + refreshLogFile(); + return isODEData; + } + public synchronized boolean getIsIDAData() throws DataAccessException { + refreshLogFile(); + return odeIdentifier.equals(IDA_DATA_IDENTIFIER); + } + public String getDataIdentifierSafe() { + return new String(odeIdentifier); + } private long getLastModified(File pdeFile, File zipFile) throws IOException { if (zipFile == null) { diff --git a/vcell-core/src/test/java/cbit/vcell/simdata/LangevinResultsReadTest.java b/vcell-core/src/test/java/cbit/vcell/simdata/LangevinResultsReadTest.java index 2c34ed1797..944a7b9898 100644 --- a/vcell-core/src/test/java/cbit/vcell/simdata/LangevinResultsReadTest.java +++ b/vcell-core/src/test/java/cbit/vcell/simdata/LangevinResultsReadTest.java @@ -46,6 +46,9 @@ public class LangevinResultsReadTest { private static File langevin_input_file; private static File messaging_config_file; + private static File euler_log_file; + private static File euler_ode_file; + // results for first task in the batch, named to match single run file (ending in "_") ex: SimID_303404574_0_ private static File ida_0_file; // log produced by the solver for first task in the batch, named using the normal convention ex: SimID_303404574_0_0.log @@ -56,6 +59,8 @@ public class LangevinResultsReadTest { // SimID_303404574_0_.ida private static File log_data_file; + // resource location of files for various test cases + private static String resourceBase = null; @BeforeAll public static void setUp() throws IOException { @@ -71,6 +76,7 @@ public static void setUp() throws IOException { throw new IOException("Failed to create subdirectory: " + localSimDir.getAbsolutePath()); } + resourceBase = "cbit/vcell/simdata/langevin/batch/"; functions_file = copyToPrimaryDir("SimID_303404574_0_.functions"); ida_0_file = copyToPrimaryDir("SimID_303404574_0_.ida"); // results for batch run0 (or for single run) log_0_file = copyToPrimaryDir("SimID_303404574_0_0.log"); // langevin-made log for run 0 @@ -87,6 +93,11 @@ public static void setUp() throws IOException { ida_min_file = copyToPrimaryDir("SimID_303404574_0__Min.ida"); ida_std_file = copyToPrimaryDir("SimID_303404574_0__Std.ida"); + resourceBase = "cbit/vcell/simdata/langevin/euler/"; + euler_log_file = copyToPrimaryDir("SimID_303690651_0_.log"); + euler_ode_file = copyToPrimaryDir("SimID_303690651_0_.ode"); + + // ida_1_File = File.createTempFile("SimID_284673710_0_", ".ida"); // Resources.asByteSource(Resources.getResource("cbit/vcell/simdata/SimID_284673710_0_.ida")) // .copyTo(com.google.common.io.Files.asByteSink(ida_1_File)); @@ -102,7 +113,7 @@ public static void tearDown() { @Test - public void testReadData() throws IOException, DataAccessException, CacheException { + public void testReadDataLangevinBatch() throws IOException, DataAccessException, CacheException { String simID = "303404574"; KeyValue key = new KeyValue(simID); @@ -111,10 +122,13 @@ public void testReadData() throws IOException, DataAccessException, CacheExcepti VCDataIdentifier vCDataIdentifier = new VCSimulationDataIdentifier(vcSimID, 0); VCData vcData = new SimulationData(vCDataIdentifier, primaryDir, localSimDir, null); + SimulationData simData = (SimulationData)vcData; + String identifier = simData.getDataIdentifierSafe(); + assertTrue(identifier.equals(SimDataConstants.IDA_DATA_IDENTIFIER), "Langevin simulation should be IDA data"); + assertFalse(identifier.equals(SimDataConstants.ODE_DATA_IDENTIFIER), "Langevin simulation should not be ODE data"); Cachetable aCacheTable = new Cachetable(10 * Cachetable.minute, 100000); aCacheTable.put(vCDataIdentifier, vcData); - DataSetControllerImpl dataSetControllerImpl = new DataSetControllerImpl(aCacheTable, primaryDir, localSimDir); LangevinBatchResultSet lbrs = dataSetControllerImpl.getLangevinBatchResultSet(vCDataIdentifier); @@ -143,6 +157,31 @@ public void testReadData() throws IOException, DataAccessException, CacheExcepti } + // we should not try to read euler results using LangevinBatchResultSet + @Test + public void testReadDataEulerBatch() throws IOException, DataAccessException, CacheException { + + String simID = "303690651"; + KeyValue key = new KeyValue(simID); + User usr = new User("temp",key); + VCSimulationIdentifier vcSimID = new VCSimulationIdentifier(key, usr); + + VCDataIdentifier vCDataIdentifier = new VCSimulationDataIdentifier(vcSimID, 0); + VCData vcData = new SimulationData(vCDataIdentifier, primaryDir, localSimDir, null); + SimulationData simData = (SimulationData)vcData; + String identifier = simData.getDataIdentifierSafe(); + assertFalse(identifier.equals(SimDataConstants.IDA_DATA_IDENTIFIER), "Langevin simulation should not be IDA data"); + assertTrue(identifier.equals(SimDataConstants.ODE_DATA_IDENTIFIER), "Langevin simulation should be ODE data"); + + Cachetable aCacheTable = new Cachetable(10 * Cachetable.minute, 100000); + aCacheTable.put(vCDataIdentifier, vcData); + DataSetControllerImpl dataSetControllerImpl = new DataSetControllerImpl(aCacheTable, primaryDir, localSimDir); + + LangevinBatchResultSet lbrs = dataSetControllerImpl.getLangevinBatchResultSet(vCDataIdentifier); + assertNull(lbrs, "Result set should be null for Euler data when read as LangevinBatchResultSet"); + + } + // @Test // public void testRead() throws IOException { // @@ -167,7 +206,7 @@ private static void deleteRecursively(File file) { private static File copyToPrimaryDir(String resourceName) throws IOException { File out = new File(primaryDir, resourceName); - Resources.asByteSource(Resources.getResource("cbit/vcell/simdata/langevin/batch/" + resourceName)) + Resources.asByteSource(Resources.getResource(resourceBase + resourceName)) .copyTo(com.google.common.io.Files.asByteSink(out)); return out; } diff --git a/vcell-core/src/test/resources/cbit/vcell/simdata/langevin/euler/SimID_303690651_0_.log b/vcell-core/src/test/resources/cbit/vcell/simdata/langevin/euler/SimID_303690651_0_.log new file mode 100644 index 0000000000..e38b829fbb --- /dev/null +++ b/vcell-core/src/test/resources/cbit/vcell/simdata/langevin/euler/SimID_303690651_0_.log @@ -0,0 +1,3 @@ +ODEData logfile +CompactODEData binary format version 1 +SimID_303690651_0_.ode diff --git a/vcell-core/src/test/resources/cbit/vcell/simdata/langevin/euler/SimID_303690651_0_.ode b/vcell-core/src/test/resources/cbit/vcell/simdata/langevin/euler/SimID_303690651_0_.ode new file mode 100644 index 0000000000..0187fd3864 Binary files /dev/null and b/vcell-core/src/test/resources/cbit/vcell/simdata/langevin/euler/SimID_303690651_0_.ode differ diff --git a/vcell-core/src/test/resources/cbit/vcell/simdata/langevin/euler/SimID_303690651_0__0.simtask.xml b/vcell-core/src/test/resources/cbit/vcell/simdata/langevin/euler/SimID_303690651_0__0.simtask.xml new file mode 100644 index 0000000000..cc3dac9d5d --- /dev/null +++ b/vcell-core/src/test/resources/cbit/vcell/simdata/langevin/euler/SimID_303690651_0__0.simtask.xml @@ -0,0 +1,74 @@ + + + 96485.3321 + 9.64853321E-5 + 1.0E-9 + 6.02214179E11 + 3.141592653589793 + 8314.46261815 + 300.0 + 1.0 + 180.0 + 0.018 + 1.0 + 1000.0 + 0.015 + 0.001660538783162726 + 1.0 + 0.0 + 0.0 + + + (k4prime / k4) + (K_EmptySet_total / Size_cell) + (Size_cell * EmptySet_init_mole_litre_1) + (Size_cell * s_z_init_mole_litre_1) + ((k4 * (v - u) * (alpha + pow(u,2.0))) - (k6 * u)) + (kappa - (k6 * u)) + (K_s_z_total / Size_cell) + (v_init_mole_litre_1 - u_init_mole_litre_1) + + + + + + + + + (LumpedJ_r0 / Size_cell) + u_init_mole_litre_1 + + + (LumpedJ_r1 / Size_cell) + v_init_mole_litre_1 + + + + + + + + + + + + + + 1 + + + + + + + + + + + + + + + + + \ No newline at end of file