Search in sources :

Example 1 with BNGException

use of cbit.vcell.server.bionetgen.BNGException in project vcell by virtualcell.

the class BiomodelsDB_TestSuite method main.

public static void main(String[] args) {
    ys_runall();
    System.exit(0);
    try {
        /*sanity check -- we currently only have a copasi_java dll for 32-bit, so let's make sure 
			 * we're running on the right JVM. (Note we can run this on 64 bit machine, just have to install
			 * a 32 bit JVM...)
			 */
        OperatingSystemInfo osi = OperatingSystemInfo.getInstance();
        // if (!osi.isWindows() || osi.is64bit()) {
        // System.err.println("run on 32 bit JVM");
        // System.exit(99);
        // }
        // following are set in command line processing
        SortedSet<BiomodelsNetEntry> modelIDs = new TreeSet<BiomodelsNetEntry>();
        BioModelsWebServices service = null;
        File outDir = null;
        boolean isDetailed;
        {
            // scope for command line processing
            Options commandOptions = new Options();
            Option help = new Option("help", false, "show help");
            commandOptions.addOption(help);
            Option detailed = new Option("detailed", false, "record detailed information");
            commandOptions.addOption(detailed);
            Option output = new Option("output", true, "output directory");
            output.setRequired(true);
            commandOptions.addOption(output);
            OptionGroup primary = new OptionGroup();
            LOption min = new LOption("min", true, "minimum number of model to import", true);
            min.setType(Number.class);
            LOption only = new LOption("only", true, "run only this model", false);
            only.setType(Number.class);
            LOption include = new LOption("include", true, "run on models in specified file", false);
            include.setType(String.class);
            LOption exclude = new LOption("exclude", true, "exclude models in specified file", true);
            exclude.setType(String.class);
            primary.addOption(min).addOption(only).addOption(include).addOption(exclude);
            for (Object obj : primary.getOptions()) {
                // CLI old, non-generic API
                commandOptions.addOption((Option) obj);
            }
            CommandLine cmdLine = null;
            try {
                CommandLineParser parser = new DefaultParser();
                cmdLine = parser.parse(commandOptions, args);
            } catch (ParseException e1) {
                e1.printStackTrace();
                HelpFormatter hf = new HelpFormatter();
                hf.printHelp("BiomodelsDB_TestSuite", commandOptions);
                System.exit(2);
            }
            Option[] present = cmdLine.getOptions();
            Set<Option> optionSet = new HashSet<Option>(Arrays.asList(present));
            if (optionSet.contains(help)) {
                HelpFormatter hf = new HelpFormatter();
                hf.printHelp("BiomodelsDB_TestSuite", commandOptions);
                System.exit(0);
            }
            // placeholder, avoid messing with nulls
            LOption primaryOpt = new LOption("", false, "", true);
            @SuppressWarnings("unchecked") Collection<? extends Option> priOpts = primary.getOptions();
            priOpts.retainAll(optionSet);
            if (!priOpts.isEmpty()) {
                assert (priOpts.size() == 1);
                primaryOpt = (LOption) priOpts.iterator().next();
            }
            outDir = new File(cmdLine.getOptionValue(output.getOpt()));
            if (!outDir.exists()) {
                outDir.mkdirs();
            }
            isDetailed = optionSet.contains(detailed);
            BioModelsWebServicesServiceLocator locator = new BioModelsWebServicesServiceLocator();
            service = locator.getBioModelsWebServices();
            if (primaryOpt.downloads) {
                String[] modelStrings = service.getAllCuratedModelsId();
                for (String s : modelStrings) {
                    modelIDs.add(new BiomodelsNetEntry(s));
                }
            }
            if (primaryOpt == only) {
                Long only1 = (Long) cmdLine.getParsedOptionValue(only.getOpt());
                modelIDs.add(new BiomodelsNetEntry(only1.intValue()));
            } else if (primaryOpt == min) {
                Long lv = (Long) cmdLine.getParsedOptionValue(min.getOpt());
                int minimumModel = lv.intValue();
                for (int m = 0; m < minimumModel; m++) {
                    modelIDs.remove(new BiomodelsNetEntry(m));
                }
            } else if (primaryOpt == include) {
                FileBaseFilter fbf = new FileBaseFilter(cmdLine.getOptionValue(include.getOpt()));
                modelIDs.addAll(fbf.models);
            } else if (primaryOpt == exclude) {
                FileBaseFilter fbf = new FileBaseFilter(cmdLine.getOptionValue(exclude.getOpt()));
                modelIDs.removeAll(fbf.models);
            }
        }
        // end command line processing
        WriterFlusher flusher = new WriterFlusher(10);
        PrintWriter detailWriter;
        PrintWriter bngWriter;
        PrintWriter sbmlWriter;
        SBMLExceptionSorter sbmlExceptions;
        if (isDetailed) {
            detailWriter = new PrintWriter(new File(outDir, "compareDetail.txt"));
            bngWriter = new PrintWriter(new File(outDir, "bngErrors.txt"));
            sbmlWriter = new PrintWriter(new File(outDir, "sbmlErrors.txt"));
            sbmlExceptions = new LiveSorter();
            flusher.add(detailWriter);
            flusher.add(bngWriter);
            flusher.add(sbmlWriter);
        } else {
            detailWriter = new PrintWriter(new NullWriter());
            bngWriter = new PrintWriter(new NullWriter());
            sbmlWriter = new PrintWriter(new NullWriter());
            sbmlExceptions = new NullSorter();
        }
        PropertyLoader.loadProperties();
        /**
         * example properties
         *
         * vcell.COPASI.executable = "C:\\Program Files\\COPASI\\bin\\CopasiSE.exe"
         * vcell.mathSBML.directory = "c:\\developer\\eclipse\\workspace\\mathsbml\\"
         * vcell.mathematica.kernel.executable = "C:\\Program Files\\Wolfram Research\\Mathematica\\7.0\\MathKernel.exe"
         */
        ResourceUtil.setNativeLibraryDirectory();
        PrintWriter printWriter = new PrintWriter(new FileWriter(new File(outDir, "summary.log"), true));
        flusher.add(printWriter);
        listModels(printWriter, modelIDs);
        // SBMLSolver copasiSBMLSolver = new CopasiSBMLSolver();
        SBMLSolver copasiSBMLSolver = new SBMLSolver() {

            @Override
            public File solve(String filePrefix, File outDir, String sbmlText, SimSpec testSpec) throws IOException, SolverException, SbmlException {
                throw new RuntimeException("COPASI SOLVER REMOVED, REIMPLEMENT");
            }

            @Override
            public String getResultsFileColumnDelimiter() {
                throw new RuntimeException("COPASI SOLVER REMOVED, REIMPLEMENT");
            }
        };
        try {
            printWriter.println(" | *BIOMODEL ID* | *BioModel name* | *PASS* | *Rel Error (VC/COP)(VC/MSBML)(COP/MSBML)* | *Exception* | ");
            removeToxic(modelIDs, printWriter);
            for (BiomodelsNetEntry modelID : modelIDs) {
                String modelName = service.getModelNameById(modelID.toString());
                String modelSBML = service.getModelById(modelID.toString());
                /*
					modelSBML = modelSBML.replace("id=\"x\"", "id=\"s_x\"");
					modelSBML = modelSBML.replace("id=\"y\"", "id=\"s_y\"");
					modelSBML = modelSBML.replace("id=\"z\"", "id=\"s_z\"");
					modelSBML = modelSBML.replace("species=\"x\"", "species=\"s_x\"");
					modelSBML = modelSBML.replace("species=\"y\"", "species=\"s_y\"");
					modelSBML = modelSBML.replace("species=\"z\"", "species=\"s_z\"");

					modelSBML = modelSBML.replace("id=\"t\"", "id=\"s_t\"");
					modelSBML = modelSBML.replace("species=\"t\"", "species=\"s_t\"");

					modelSBML = modelSBML.replace("name=\"x\"", "name=\"s_x\"");
					modelSBML = modelSBML.replace("name=\"y\"", "name=\"s_y\"");
					modelSBML = modelSBML.replace("name=\"z\"", "name=\"s_z\"");
					modelSBML = modelSBML.replace("name=\"t\"", "name=\"s_t\"");
					
					modelSBML = modelSBML.replace("<ci> x ", "<ci> s_x ");
					modelSBML = modelSBML.replace("<ci> y ", "<ci> s_y ");
					modelSBML = modelSBML.replace("<ci> z ", "<ci> s_z ");
					modelSBML = modelSBML.replace("<ci> t ", "<ci> s_t ");

					*/
                Element bioModelInfo = new Element(BioModelsNetPanel.BIOMODELINFO_ELEMENT_NAME);
                bioModelInfo.setAttribute(BioModelsNetPanel.ID_ATTRIBUTE_NAME, modelID.toString());
                bioModelInfo.setAttribute(BioModelsNetPanel.SUPPORTED_ATTRIBUTE_NAME, "false");
                bioModelInfo.setAttribute("vcell_ran", "false");
                bioModelInfo.setAttribute("COPASI_ran", "false");
                bioModelInfo.setAttribute("mSBML_ran", "false");
                bioModelInfo.setAttribute(BioModelsNetPanel.MODELNAME_ATTRIBUTE_NAME, modelName);
                boolean bUseUTF8 = true;
                File sbmlFile = new File(outDir, modelID + ".sbml");
                XmlUtil.writeXMLStringToFile(modelSBML, sbmlFile.getAbsolutePath(), bUseUTF8);
                PrintStream saved_sysout = System.out;
                PrintStream saved_syserr = System.err;
                PrintStream new_sysout = null;
                PrintStream new_syserr = null;
                try {
                    String filePrefix = modelID.toString();
                    String sbmlText = modelSBML;
                    File logFile = new File(outDir, filePrefix + ".log");
                    new_sysout = new PrintStream(logFile);
                    new_syserr = new_sysout;
                    System.setOut(new_sysout);
                    System.setErr(new_syserr);
                    StringBuffer combinedErrorBuffer = new StringBuffer();
                    SimSpec simSpec = SimSpec.fromSBML(modelSBML);
                    String[] varsToTest = simSpec.getVarsList();
                    /*			            for(int i=0; i<varsToTest.length; i++) {
			            	if(varsToTest[i].contentEquals("x")) {
			            		varsToTest[i] = "s_x";
			            	} else if(varsToTest[i].contentEquals("y")) {
			            		varsToTest[i] = "s_y";
			            	} else if(varsToTest[i].contentEquals("z")) {
			            		varsToTest[i] = "s_z";
			            	} else if(varsToTest[i].contentEquals("t")) {
			            		varsToTest[i] = "s_t";
			            	}
			            }
*/
                    printWriter.print("ModelId: " + modelID + ": ");
                    // if a model crashes out the libSBML dll, we will terminate abruptly. Flush
                    // summary log before that happens
                    printWriter.flush();
                    try {
                        // 
                        // get VCell solution with an embedded "ROUND TRIP" (time and species concentrations)
                        // 
                        ODESolverResultSet vcellResults_RT = null;
                        try {
                            VCellSBMLSolver vcellSBMLSolver_RT = new VCellSBMLSolver();
                            vcellSBMLSolver_RT.setRoundTrip(false);
                            // TODO try with round-trip later.
                            String columnDelimiter = vcellSBMLSolver_RT.getResultsFileColumnDelimiter();
                            File resultFile = vcellSBMLSolver_RT.solve(filePrefix, outDir, sbmlFile.getAbsolutePath(), simSpec);
                            vcellResults_RT = readResultFile(resultFile, columnDelimiter);
                            bioModelInfo.setAttribute("vcell_ran", "true");
                        } catch (BNGException e) {
                            bngWriter.println(modelID + " " + e.getMessage());
                            throw e;
                        } catch (SBMLImportException e) {
                            ModelException me = new ModelException(modelID, e);
                            write(sbmlWriter, me);
                            sbmlExceptions.add(me);
                            throw e;
                        } catch (Exception e) {
                            printWriter.println("vcell solve(roundtrip=true) failed");
                            e.printStackTrace(printWriter);
                            System.out.println("vcell solve(roundtrip=true) failed");
                            e.printStackTrace(System.out);
                            combinedErrorBuffer.append(" *VCELL_RT* _" + e.getMessage() + "_ ");
                            Element vcellSolverReport = new Element("SolverReport");
                            vcellSolverReport.setAttribute("solverName", "vcell");
                            vcellSolverReport.setAttribute("errorMessage", e.getMessage());
                            bioModelInfo.addContent(vcellSolverReport);
                            bioModelInfo.setAttribute("vcell_ran", "false");
                        }
                        // 
                        // get COPASI solution (time and species concentrations)
                        // 
                        ODESolverResultSet copasiResults = null;
                        try {
                            String columnDelimiter = copasiSBMLSolver.getResultsFileColumnDelimiter();
                            File resultFile = copasiSBMLSolver.solve(filePrefix, outDir, sbmlText, simSpec);
                            copasiResults = readResultFile(resultFile, columnDelimiter);
                            bioModelInfo.setAttribute("COPASI_ran", "true");
                        } catch (Exception e) {
                            printWriter.println("Copasi solve() failed");
                            e.printStackTrace(printWriter);
                            System.out.println("Copasi solve() failed");
                            e.printStackTrace(System.out);
                            combinedErrorBuffer.append(" *COPASI* _" + e.getMessage() + "_ ");
                            Element copasiSolverReport = new Element("SolverReport");
                            copasiSolverReport.setAttribute("solverName", "COPASI");
                            copasiSolverReport.setAttribute("errorMessage", e.getMessage());
                            bioModelInfo.addContent(copasiSolverReport);
                            bioModelInfo.setAttribute("COPASI_ran", "false");
                        }
                        // 
                        // get mSBML solution (time and species concentrations)
                        // 
                        /*
							ODESolverResultSet mSBMLResults = null;
							if (idInt != 246 && idInt != 250 && idInt != 285 && idInt != 301) {
								try {
									MathSBMLSolver mSBMLSolver = new MathSBMLSolver();
									String columnDelimiter = mSBMLSolver.getResultsFileColumnDelimiter();
									org.sbml.libsbml.SBMLDocument sbmlDocument = new SBMLReader().readSBML(sbmlFile.getAbsolutePath());
									long level = sbmlDocument.getLevel();
									long version = sbmlDocument.getVersion();
									String mathsbmlFilePrefix = filePrefix;
									if (level!=2 || (level==2 && version>3)){
	//									sbmlDocument.setConsistencyChecksForConversion(libsbmlConstants.LIBSBML_CAT_MODELING_PRACTICE, false);
										long numErrors = sbmlDocument.checkL2v3Compatibility();

										if (numErrors==0){
											boolean bConversionWorked = sbmlDocument.setLevelAndVersion(2, 3, false);
											SBMLDocument doc = new SBMLDocument(sbmlDocument);
											doc.setLevelAndVersion(2,3,false);
											if (bConversionWorked){
												mathsbmlFilePrefix = filePrefix+"_L2V3";
												long newVersion = doc.getVersion();
												SBMLWriter sbmlWriter = new SBMLWriter();
												sbmlText = sbmlWriter.writeToString(doc);
												try {
													XmlUtil.writeXMLStringToFile(sbmlText, mathsbmlFilePrefix+".sbml", true);
												} catch (IOException e1) {
													e1.printStackTrace(System.out);
												} 
											}else{
												throw new RuntimeException("couldn't convert SBML from L"+level+"V"+version+" to L2V3");
											}
										}else{
											throw new RuntimeException("couldn't convert SBML from L"+level+"V"+version+" to L2V3, not compatible: "+sbmlDocument.getError(0));
										}
									}
									File resultFile = mSBMLSolver.solve(mathsbmlFilePrefix, outDir, sbmlText, simSpec);
									mSBMLResults = readResultFile(resultFile, columnDelimiter); 
									bioModelInfo.setAttribute("mSBML_ran","true");
								}catch (Exception e){
									printWriter.println("mSBML solve() failed");
									e.printStackTrace(printWriter);
									System.out.println("mSBML solve() failed");
									e.printStackTrace(System.out);
									combinedErrorBuffer.append(" *mSBML* _"+e.getMessage()+"_ ");

									Element mSBMLSolverReport = new Element("SolverReport");
									mSBMLSolverReport.setAttribute("solverName","mSBML");
									mSBMLSolverReport.setAttribute("errorMessage",e.getMessage());
									bioModelInfo.addContent(mSBMLSolverReport);

									bioModelInfo.setAttribute("mSBML_ran","false");
								}
							}
							 */
                        // 
                        // compare results from COPASI and VCELL_RT
                        // 
                        Boolean bCOPASI_VCELL_matched = null;
                        if (copasiResults != null && vcellResults_RT != null) {
                            try {
                                SimulationComparisonSummary summary = MathTestingUtilities.compareResultSets(copasiResults, vcellResults_RT, varsToTest, TestCaseNew.REGRESSION, 1e-5, 1e-5);
                                double maxRelError = summary.getMaxRelativeError();
                                bioModelInfo.setAttribute("COPASI_VCELL_maxRelErr", Double.toString(maxRelError));
                                if (maxRelError < 1) {
                                    bCOPASI_VCELL_matched = true;
                                } else {
                                    detailWriter.println(modelID + " " + modelName);
                                    bCOPASI_VCELL_matched = false;
                                    Element solverComparison = new Element("SolverComparison");
                                    solverComparison.setAttribute("solver1", "vcell");
                                    solverComparison.setAttribute("solver2", "COPASI");
                                    VariableComparisonSummary[] failedVCSummaries = summary.getFailingVariableComparisonSummaries(1e-5, 1e-5);
                                    for (VariableComparisonSummary vcSummary : failedVCSummaries) {
                                        Element failedVariableSummary = getVariableSummary(vcSummary);
                                        solverComparison.addContent(failedVariableSummary);
                                        String ss = vcSummary.toShortString();
                                        detailWriter.print('\t');
                                        detailWriter.println(ss);
                                        System.out.println(ss);
                                    }
                                    detailWriter.println();
                                    bioModelInfo.addContent(solverComparison);
                                }
                            } catch (Exception e) {
                                printWriter.println("COMPARE VC/COPASI failed");
                                e.printStackTrace(printWriter);
                                System.out.println("COMPARE VC/COPASI failed");
                                e.printStackTrace(System.out);
                                combinedErrorBuffer.append(" *COMPARE VC/COPASI* _" + e.getMessage() + "_ ");
                                Element solverComparison = new Element("SolverComparison");
                                solverComparison.setAttribute("solver1", "vcell");
                                solverComparison.setAttribute("solver2", "COPASI");
                                solverComparison.setAttribute("error", e.getMessage());
                                bioModelInfo.addContent(solverComparison);
                            }
                        }
                        /*						
							Boolean bmSBML_VCELL_matched = null;
							if (mSBMLResults!=null && vcellResults_RT!=null){
								try {
									SimulationComparisonSummary summary = MathTestingUtilities.compareUnEqualResultSets(mSBMLResults, vcellResults_RT, varsToTest, 1e-5, 1e-5, 1);
									double maxRelError = summary.getMaxRelativeError();
									bioModelInfo.setAttribute("mSBML_VCELL_maxRelErr", Double.toString(maxRelError));

									if (maxRelError<1){
										bmSBML_VCELL_matched = true;
									}else{
										bmSBML_VCELL_matched = false;
										Element solverComparison = new Element("SolverComparison");
										solverComparison.setAttribute("solver1","vcell");
										solverComparison.setAttribute("solver2","mSBML");
										VariableComparisonSummary[] failedVCSummaries = summary.getFailingVariableComparisonSummaries(1e-5, 1e-5);
										for (VariableComparisonSummary vcSummary : failedVCSummaries){
											Element failedVariableSummary = getVariableSummary(vcSummary);
											solverComparison.addContent(failedVariableSummary);
											System.out.println(vcSummary.toShortString());
										}
										bioModelInfo.addContent(solverComparison);
									}
								} catch (Exception e) {
									printWriter.println("COMPARE VCRT/mSBML failed");
									e.printStackTrace(printWriter);
									System.out.println("COMPARE VCRT/mSBML failed");
									e.printStackTrace(System.out);
									combinedErrorBuffer.append(" *COMPARE VCRT/mSBML* _"+e.getMessage()+"_ ");

									Element solverComparison = new Element("SolverComparison");
									solverComparison.setAttribute("solver1","vcell");
									solverComparison.setAttribute("solver2","mSBML");
									solverComparison.setAttribute("error",e.getMessage());
									bioModelInfo.addContent(solverComparison);
								}
							}

							//
							// compare results from COPASI and mSBML
							//
							Boolean bCOPASI_mSBML_matched = null;
							if (copasiResults!=null && mSBMLResults!=null){
								try {
									SimulationComparisonSummary summary = MathTestingUtilities.compareUnEqualResultSets(copasiResults, mSBMLResults, varsToTest, 1e-5, 1e-5, 1);
									double maxRelError = summary.getMaxRelativeError();
									bioModelInfo.setAttribute("COPASI_mSBML_maxRelErr", Double.toString(maxRelError));

									if (maxRelError<1){
										bCOPASI_mSBML_matched = true;
									}else{
										bCOPASI_mSBML_matched = false;
										Element solverComparison = new Element("SolverComparison");
										solverComparison.setAttribute("solver1","COPASI");
										solverComparison.setAttribute("solver2","mSBML");
										solverComparison.setAttribute("result","failed");
										VariableComparisonSummary[] vcSummaries = summary.getVariableComparisonSummaries();
										for (VariableComparisonSummary vcSummary : vcSummaries){
											Element failedVariableSummary = getVariableSummary(vcSummary);
											solverComparison.addContent(failedVariableSummary);
											System.out.println(vcSummary.toShortString());
										}
										bioModelInfo.addContent(solverComparison);
									}
								} catch (Exception e) {
									printWriter.println("COMPARE COPASI/mSBML failed");
									e.printStackTrace(printWriter);
									System.out.println("COMPARE COPASI/mSBML failed");
									e.printStackTrace(System.out);
									combinedErrorBuffer.append(" *COMPARE COPASI/mSBML* _"+e.getMessage()+"_ ");

									Element solverComparison = new Element("SolverComparison");
									solverComparison.setAttribute("solver1","COPASI");
									solverComparison.setAttribute("solver2","mSBML");
									solverComparison.setAttribute("error",e.getMessage());
								}
							}
							 */
                        if ((bCOPASI_VCELL_matched != null && bCOPASI_VCELL_matched.booleanValue())) {
                            // || /*(bmSBML_VCELL_matched!=null && bmSBML_VCELL_matched.booleanValue()) */ )
                            bioModelInfo.setAttribute(BioModelsNetPanel.SUPPORTED_ATTRIBUTE_NAME, "true");
                            printWriter.println("PASS");
                        } else {
                            bioModelInfo.setAttribute(BioModelsNetPanel.SUPPORTED_ATTRIBUTE_NAME, "false");
                            printWriter.println("FAIL");
                        }
                    } catch (Exception e) {
                        e.printStackTrace(printWriter);
                        combinedErrorBuffer.append(" *UNKNOWN* _" + e.getMessage() + "_ ");
                        bioModelInfo.setAttribute(BioModelsNetPanel.SUPPORTED_ATTRIBUTE_NAME, "false");
                        bioModelInfo.setAttribute("exception", e.getMessage());
                    }
                    printWriter.flush();
                    // write for each model just in case files get corrupted (it happened).
                    write(bioModelInfo, new File(outDir, modelID + "_report.xml"));
                } finally {
                    if (new_sysout != null) {
                        new_sysout.close();
                        new_sysout = null;
                    }
                    if (new_syserr != null) {
                        new_syserr.close();
                        new_syserr = null;
                    }
                    System.setOut(saved_sysout);
                    System.setOut(saved_syserr);
                }
            }
            // this writes out the SBML import exceptions grouped by type
            if (!sbmlExceptions.isEmpty()) {
                Map<Category, Collection<ModelException>> map = sbmlExceptions.getMap();
                try (PrintWriter pw = new PrintWriter(new File(outDir, "sbmlSorted.txt"))) {
                    // SBMLImportException.Category
                    for (Category c : Category.values()) {
                        Collection<ModelException> meCollection = map.get(c);
                        for (ModelException me : meCollection) {
                            write(pw, me);
                        }
                    }
                }
            }
        } finally {
            printWriter.close();
            detailWriter.close();
            bngWriter.close();
        }
    } catch (Throwable e) {
        e.printStackTrace(System.out);
        e.printStackTrace(System.err);
    }
    System.exit(0);
}
Also used : BNGException(cbit.vcell.server.bionetgen.BNGException) HelpFormatter(org.apache.commons.cli.HelpFormatter) TreeSet(java.util.TreeSet) SBMLSolver(org.vcell.sbml.SBMLSolver) VariableComparisonSummary(cbit.vcell.solver.test.VariableComparisonSummary) BioModelsWebServicesServiceLocator(uk.ac.ebi.www.biomodels_main.services.BioModelsWebServices.BioModelsWebServicesServiceLocator) Collection(java.util.Collection) Option(org.apache.commons.cli.Option) File(java.io.File) Options(org.apache.commons.cli.Options) SortedSet(java.util.SortedSet) Set(java.util.Set) ODESolverResultSet(cbit.vcell.solver.ode.ODESolverResultSet) TreeSet(java.util.TreeSet) HashSet(java.util.HashSet) Category(org.vcell.sbml.vcell.SBMLImportException.Category) OperatingSystemInfo(cbit.vcell.resource.OperatingSystemInfo) FileWriter(java.io.FileWriter) Element(org.jdom.Element) NullWriter(org.apache.commons.io.output.NullWriter) OptionGroup(org.apache.commons.cli.OptionGroup) ODESolverResultSet(cbit.vcell.solver.ode.ODESolverResultSet) SimulationComparisonSummary(cbit.vcell.solver.test.SimulationComparisonSummary) CommandLineParser(org.apache.commons.cli.CommandLineParser) DefaultParser(org.apache.commons.cli.DefaultParser) PrintWriter(java.io.PrintWriter) PrintStream(java.io.PrintStream) SBMLImportException(org.vcell.sbml.vcell.SBMLImportException) SimSpec(org.vcell.sbml.SimSpec) SbmlException(org.vcell.sbml.SbmlException) FileNotFoundException(java.io.FileNotFoundException) BNGException(cbit.vcell.server.bionetgen.BNGException) SBMLImportException(org.vcell.sbml.vcell.SBMLImportException) ParseException(org.apache.commons.cli.ParseException) SolverException(cbit.vcell.solver.SolverException) IOException(java.io.IOException) BioModelsWebServices(uk.ac.ebi.www.biomodels_main.services.BioModelsWebServices.BioModelsWebServices) CommandLine(org.apache.commons.cli.CommandLine) ParseException(org.apache.commons.cli.ParseException)

Example 2 with BNGException

use of cbit.vcell.server.bionetgen.BNGException in project vcell by virtualcell.

the class BiomodelsDB_TestSuite method ys_runall.

public static void ys_runall() {
    System.out.println("testing");
    try {
        OperatingSystemInfo osi = OperatingSystemInfo.getInstance();
        if (!osi.isWindows() || osi.is64bit()) {
            System.err.println("run on 32 bit JVM");
        // System.exit(99);
        }
        // File outDir = new File("C:\\Users\\yskaf\\Documents\\ModelFiles\\vcell_output\\runAll_10_21_19");
        File outDir = new File("C:\\TEMP\\ddd\\274out");
        if (!outDir.exists()) {
            outDir.mkdirs();
        }
        WriterFlusher flusher = new WriterFlusher(10);
        PrintWriter detailWriter;
        PrintWriter bngWriter;
        PrintWriter sbmlWriter;
        SBMLExceptionSorter sbmlExceptions;
        detailWriter = new PrintWriter(new File(outDir, "compareDetail.txt"));
        bngWriter = new PrintWriter(new File(outDir, "bngErrors.txt"));
        sbmlWriter = new PrintWriter(new File(outDir, "sbmlErrors.txt"));
        sbmlExceptions = new LiveSorter();
        flusher.add(detailWriter);
        flusher.add(bngWriter);
        flusher.add(sbmlWriter);
        PropertyLoader.loadProperties();
        ResourceUtil.setNativeLibraryDirectory();
        PrintWriter printWriter = new PrintWriter(new FileWriter(new File(outDir, "summary.log"), true));
        flusher.add(printWriter);
        try {
            File inDir = new File("C:\\TEMP\\ddd\\274");
            // File inDir = new File("C:\\Users\\yskaf\\Documents\\ModelFiles\\temp");
            File[] directoryListing = inDir.listFiles();
            if (directoryListing != null) {
                printWriter.println(" | *BIOMODEL ID* | *BioModel name* | *PASS* | *Rel Error (VC/COP)(VC/MSBML)(COP/MSBML)* | *Exception* | ");
                for (File modelFile : directoryListing) {
                    String fileName = modelFile.getName();
                    int end = fileName.indexOf(".");
                    String modelName = fileName.substring(0, end);
                    String modelSBML = new Scanner(modelFile).useDelimiter("\\Z").next();
                    String modelID = modelName.replaceAll("[^0-9]", "");
                    // **********
                    // try {
                    // modelSBML = modelSBML.replace("id=\"x\"", "id=\"s_x\"");
                    // modelSBML = modelSBML.replace("id=\"y\"", "id=\"s_y\"");
                    // modelSBML = modelSBML.replace("id=\"z\"", "id=\"s_z\"");
                    // modelSBML = modelSBML.replace("species=\"x\"", "species=\"s_x\"");
                    // modelSBML = modelSBML.replace("species=\"y\"", "species=\"s_y\"");
                    // modelSBML = modelSBML.replace("species=\"z\"", "species=\"s_z\"");
                    // 
                    // modelSBML = modelSBML.replace("id=\"t\"", "id=\"s_t\"");
                    // modelSBML = modelSBML.replace("species=\"t\"", "species=\"s_t\"");
                    // 
                    // modelSBML = modelSBML.replace("name=\"x\"", "name=\"s_x\"");
                    // modelSBML = modelSBML.replace("name=\"y\"", "name=\"s_y\"");
                    // modelSBML = modelSBML.replace("name=\"z\"", "name=\"s_z\"");
                    // modelSBML = modelSBML.replace("name=\"t\"", "name=\"s_t\"");
                    // 
                    // modelSBML = modelSBML.replace("<ci> x ", "<ci> s_x ");
                    // modelSBML = modelSBML.replace("<ci> y ", "<ci> s_y ");
                    // modelSBML = modelSBML.replace("<ci> z ", "<ci> s_z ");
                    // modelSBML = modelSBML.replace("<ci> t ", "<ci> s_t ");
                    // 
                    // /*FileOutputStream fooStream = new FileOutputStream(modelFile, false); // true to append, false to overwrite
                    // byte[] myBytes = modelSBML.getBytes();
                    // fooStream.write(myBytes);
                    // fooStream.close();*/
                    // 
                    // } catch (Exception e) {
                    // printWriter.print(modelName + ": error with SBML replacement.");
                    // printWriter.print(e.getMessage());
                    // }
                    Element bioModelInfo = new Element(BioModelsNetPanel.BIOMODELINFO_ELEMENT_NAME);
                    bioModelInfo.setAttribute(BioModelsNetPanel.ID_ATTRIBUTE_NAME, modelID);
                    bioModelInfo.setAttribute(BioModelsNetPanel.SUPPORTED_ATTRIBUTE_NAME, "false");
                    bioModelInfo.setAttribute("vcell_ran", "false");
                    bioModelInfo.setAttribute("COPASI_ran", "false");
                    bioModelInfo.setAttribute("mSBML_ran", "false");
                    bioModelInfo.setAttribute(BioModelsNetPanel.MODELNAME_ATTRIBUTE_NAME, modelName);
                    boolean bUseUTF8 = true;
                    File sbmlFile = new File(outDir, modelName + ".sbml");
                    XmlUtil.writeXMLStringToFile(modelSBML, sbmlFile.getAbsolutePath(), bUseUTF8);
                    PrintStream saved_sysout = System.out;
                    PrintStream saved_syserr = System.err;
                    PrintStream new_sysout = null;
                    PrintStream new_syserr = null;
                    try {
                        String filePrefix = modelName;
                        String sbmlText = modelSBML;
                        File logFile = new File(outDir, filePrefix + ".log");
                        new_sysout = new PrintStream(logFile);
                        new_syserr = new_sysout;
                        System.setOut(new_sysout);
                        System.setErr(new_syserr);
                        StringBuffer combinedErrorBuffer = new StringBuffer();
                        SimSpec simSpec = SimSpec.fromSBML(modelSBML);
                        String[] varsToTest = simSpec.getVarsList();
                        /*		            for(int i=0; i<varsToTest.length; i++) {
		            	if(varsToTest[i].contentEquals("x")) {
		            		varsToTest[i] = "s_x";
		            	} else if(varsToTest[i].contentEquals("y")) {
		            		varsToTest[i] = "s_y";
		            	} else if(varsToTest[i].contentEquals("z")) {
		            		varsToTest[i] = "s_z";
		            	} else if(varsToTest[i].contentEquals("t")) {
		            		varsToTest[i] = "s_t";
		            	}
		            }
		            */
                        printWriter.print(modelName + ": ");
                        printWriter.flush();
                        try {
                            // get VCell solution with an embedded "ROUND TRIP" (time and species concentrations)
                            ODESolverResultSet vcellResults_RT = null;
                            try {
                                VCellSBMLSolver vcellSBMLSolver_RT = new VCellSBMLSolver();
                                vcellSBMLSolver_RT.setRoundTrip(false);
                                // TODO try with round-trip later.
                                String columnDelimiter = vcellSBMLSolver_RT.getResultsFileColumnDelimiter();
                                File resultFile = vcellSBMLSolver_RT.solve(filePrefix, outDir, sbmlFile.getAbsolutePath(), simSpec);
                                vcellResults_RT = readResultFile(resultFile, columnDelimiter);
                                bioModelInfo.setAttribute("vcell_ran", "true");
                            } catch (BNGException e) {
                                bngWriter.println(modelID + " " + e.getMessage());
                                throw e;
                            } catch (SBMLImportException e) {
                                // sbmlExceptions.add(me);
                                throw e;
                            } catch (Exception e) {
                                printWriter.println("vcell solve(roundtrip=true) failed");
                                e.printStackTrace(printWriter);
                                System.out.println("vcell solve(roundtrip=true) failed");
                                e.printStackTrace(System.out);
                                combinedErrorBuffer.append(" *VCELL_RT* _" + e.getMessage() + "_ ");
                                Element vcellSolverReport = new Element("SolverReport");
                                vcellSolverReport.setAttribute("solverName", "vcell");
                                vcellSolverReport.setAttribute("errorMessage", e.getMessage());
                                bioModelInfo.addContent(vcellSolverReport);
                                bioModelInfo.setAttribute("vcell_ran", "false");
                            }
                            if (vcellResults_RT != null) {
                                bioModelInfo.setAttribute(BioModelsNetPanel.SUPPORTED_ATTRIBUTE_NAME, "true");
                                printWriter.println("PASS");
                            } else {
                                bioModelInfo.setAttribute(BioModelsNetPanel.SUPPORTED_ATTRIBUTE_NAME, "false");
                                printWriter.println("FAIL");
                            }
                        } catch (Exception e) {
                            e.printStackTrace(printWriter);
                            combinedErrorBuffer.append(" *UNKNOWN* _" + e.getMessage() + "_ ");
                            bioModelInfo.setAttribute(BioModelsNetPanel.SUPPORTED_ATTRIBUTE_NAME, "false");
                            bioModelInfo.setAttribute("exception", e.getMessage());
                        }
                        printWriter.flush();
                        // write for each model just in case files get corrupted (it happened).
                        write(bioModelInfo, new File(outDir, modelName + "_report.xml"));
                    } finally {
                        if (new_sysout != null) {
                            new_sysout.close();
                            new_sysout = null;
                        }
                        if (new_syserr != null) {
                            new_syserr.close();
                            new_syserr = null;
                        }
                        System.setOut(saved_sysout);
                        System.setOut(saved_syserr);
                    }
                }
            } else {
                System.err.println("inDir not a directory");
                System.exit(99);
            }
            // this writes out the SBML import exceptions grouped by type
            if (!sbmlExceptions.isEmpty()) {
                Map<Category, Collection<ModelException>> map = sbmlExceptions.getMap();
                try (PrintWriter pw = new PrintWriter(new File(outDir, "sbmlSorted.txt"))) {
                    // SBMLImportException.Category
                    for (Category c : Category.values()) {
                        Collection<ModelException> meCollection = map.get(c);
                        for (ModelException me : meCollection) {
                            write(pw, me);
                        }
                    }
                }
            }
        } finally {
            printWriter.close();
            detailWriter.close();
            bngWriter.close();
        }
    } catch (Throwable e) {
        e.printStackTrace(System.out);
        e.printStackTrace(System.err);
    }
    System.exit(0);
}
Also used : Scanner(java.util.Scanner) Category(org.vcell.sbml.vcell.SBMLImportException.Category) OperatingSystemInfo(cbit.vcell.resource.OperatingSystemInfo) FileWriter(java.io.FileWriter) Element(org.jdom.Element) BNGException(cbit.vcell.server.bionetgen.BNGException) ODESolverResultSet(cbit.vcell.solver.ode.ODESolverResultSet) PrintWriter(java.io.PrintWriter) PrintStream(java.io.PrintStream) SBMLImportException(org.vcell.sbml.vcell.SBMLImportException) SimSpec(org.vcell.sbml.SimSpec) SbmlException(org.vcell.sbml.SbmlException) FileNotFoundException(java.io.FileNotFoundException) BNGException(cbit.vcell.server.bionetgen.BNGException) SBMLImportException(org.vcell.sbml.vcell.SBMLImportException) ParseException(org.apache.commons.cli.ParseException) SolverException(cbit.vcell.solver.SolverException) IOException(java.io.IOException) Collection(java.util.Collection) File(java.io.File)

Example 3 with BNGException

use of cbit.vcell.server.bionetgen.BNGException in project vcell by virtualcell.

the class NetworkTransformer method generateNetwork.

private BNGOutputSpec generateNetwork(SimulationContext simContext, MathMappingCallback mathMappingCallback, NetworkGenerationRequirements networkGenerationRequirements) throws ClassNotFoundException, IOException {
    TaskCallbackMessage tcm;
    BNGOutputSpec outputSpec;
    speciesEquivalenceMap.clear();
    kineticsParameterMap.clear();
    String input = convertToBngl(simContext, true, mathMappingCallback, networkGenerationRequirements);
    for (Map.Entry<FakeSeedSpeciesInitialConditionsParameter, Pair<SpeciesContext, Expression>> entry : speciesEquivalenceMap.entrySet()) {
        FakeSeedSpeciesInitialConditionsParameter key = entry.getKey();
        Pair<SpeciesContext, Expression> value = entry.getValue();
        SpeciesContext sc = value.one;
        Expression initial = value.two;
        System.out.println("key: " + key.fakeParameterName + ",   species: " + sc.getName() + ", initial: " + initial.infix());
    }
    String md5hash = MD5.md5(input);
    if (isBngHashValid(input, md5hash, simContext)) {
        String s = "Previously saved outputSpec is up-to-date, no need to generate network.";
        System.out.println(s);
        tcm = new TaskCallbackMessage(TaskCallbackStatus.Notification, s);
        simContext.appendToConsole(tcm);
        if (simContext.isInsufficientIterations()) {
            s = NetworkTransformer.getInsufficientIterationsMessage();
            System.out.println(s);
            tcm = new TaskCallbackMessage(TaskCallbackStatus.Error, s);
            simContext.appendToConsole(tcm);
        }
        if (simContext.isInsufficientMaxMolecules()) {
            s = NetworkTransformer.getInsufficientMaxMoleculesMessage();
            System.out.println(s);
            tcm = new TaskCallbackMessage(TaskCallbackStatus.Error, s);
            simContext.appendToConsole(tcm);
        }
        outputSpec = simContext.getMostRecentlyCreatedOutputSpec();
        return (BNGOutputSpec) BeanUtils.cloneSerializable(outputSpec);
    }
    BNGInput bngInput = new BNGInput(input);
    BNGOutput bngOutput = null;
    try {
        final BNGExecutorService bngService = BNGExecutorService.getInstance(bngInput, networkGenerationRequirements.timeoutDurationMS);
        bngService.registerBngUpdaterCallback(simContext);
        bngOutput = bngService.executeBNG();
    } catch (BNGException ex) {
        ex.printStackTrace(System.out);
        System.out.println("bionetgen exception");
        if (ex.getMessage().contains("was asked to write the network, but no reactions were found")) {
            RuntimeException rex = new RuntimeException("Specified species and reaction rules are not sufficient to define reaction network.");
            throw rex;
        } else {
            // rethrow without losing context
            throw ex;
        }
    } catch (RuntimeException ex) {
        ex.printStackTrace(System.out);
        System.out.println("runtime exception");
        throw ex;
    } catch (Exception ex) {
        ex.printStackTrace(System.out);
        System.out.println("other exception");
        throw new RuntimeException(ex.getMessage());
    }
    // simContext.setInsufficientIterations(false);
    // simContext.setInsufficientMaxMolecules(false);
    String bngConsoleString = bngOutput.getConsoleOutput();
    // TODO: this message we check if insufficient iterations / max molecules
    // DO IT OUTSIDE (in the bng service), we now can
    // tcm = new TaskCallbackMessage(TaskCallbackStatus.DetailBatch, bngConsoleString);
    // simContext.appendToConsole(tcm);
    tcm = new TaskCallbackMessage(TaskCallbackStatus.TaskEndNotificationOnly, "");
    simContext.setNewCallbackMessage(tcm);
    tcm = new TaskCallbackMessage(TaskCallbackStatus.TaskEndAdjustSimulationContextFlagsOnly, "");
    simContext.setNewCallbackMessage(tcm);
    String bngNetString = bngOutput.getNetFileContent();
    outputSpec = BNGOutputFileParser.createBngOutputSpec(bngNetString);
    // prints all output to console
    BNGOutputFileParser.printBNGNetOutput(outputSpec);
    if (mathMappingCallback.isInterrupted()) {
        String msg = "Canceled by user.";
        tcm = new TaskCallbackMessage(TaskCallbackStatus.Error, msg);
        simContext.appendToConsole(tcm);
        // clean the cache if the user interrupts
        simContext.setMd5hash(null);
        throw new UserCancelException(msg);
    }
    if (outputSpec.getBNGSpecies().length > NetworkTransformer.getSpeciesLimit(simContext)) {
        String message = NetworkTransformer.getSpeciesLimitExceededMessage(outputSpec, simContext);
        tcm = new TaskCallbackMessage(TaskCallbackStatus.Error, message);
        simContext.appendToConsole(tcm);
        simContext.setMd5hash(null);
        message = "Unable to generate Math for Application " + simContext.getName() + ".\n" + message;
        throw new RuntimeException(message);
    }
    if (outputSpec.getBNGReactions().length > NetworkTransformer.getReactionsLimit(simContext)) {
        String message = NetworkTransformer.getReactionsLimitExceededMessage(outputSpec, simContext);
        tcm = new TaskCallbackMessage(TaskCallbackStatus.Error, message);
        simContext.appendToConsole(tcm);
        simContext.setMd5hash(null);
        message = "Unable to generate Math for Application " + simContext.getName() + ".\n" + message;
        throw new RuntimeException(message);
    }
    // System.out.println("old hash: " + simContext.getMd5hash());
    if (md5hash != null && md5hash.length() != 0 && outputSpec != null) {
        System.out.println("saving hash and output spec");
        synchronized (this) {
            simContext.setMd5hash(md5hash);
            simContext.setMostRecentlyCreatedOutputSpec(outputSpec);
        }
    } else {
        System.out.println("something is wrong with the hash and/or output spec");
    }
    return (BNGOutputSpec) BeanUtils.cloneSerializable(outputSpec);
}
Also used : UserCancelException(org.vcell.util.UserCancelException) SpeciesContext(cbit.vcell.model.SpeciesContext) BNGExecutorService(cbit.vcell.server.bionetgen.BNGExecutorService) BNGOutput(cbit.vcell.server.bionetgen.BNGOutput) FakeSeedSpeciesInitialConditionsParameter(org.vcell.model.rbm.FakeSeedSpeciesInitialConditionsParameter) BNGOutputSpec(cbit.vcell.bionetgen.BNGOutputSpec) PropertyVetoException(java.beans.PropertyVetoException) ExpressionBindingException(cbit.vcell.parser.ExpressionBindingException) ParseException(org.vcell.model.bngl.ParseException) BNGException(cbit.vcell.server.bionetgen.BNGException) ModelException(cbit.vcell.model.ModelException) IOException(java.io.IOException) ExpressionException(cbit.vcell.parser.ExpressionException) UserCancelException(org.vcell.util.UserCancelException) BNGException(cbit.vcell.server.bionetgen.BNGException) Expression(cbit.vcell.parser.Expression) BNGInput(cbit.vcell.server.bionetgen.BNGInput) Map(java.util.Map) HashMap(java.util.HashMap) LinkedHashMap(java.util.LinkedHashMap) Pair(org.vcell.util.Pair)

Aggregations

BNGException (cbit.vcell.server.bionetgen.BNGException)3 IOException (java.io.IOException)3 OperatingSystemInfo (cbit.vcell.resource.OperatingSystemInfo)2 SolverException (cbit.vcell.solver.SolverException)2 ODESolverResultSet (cbit.vcell.solver.ode.ODESolverResultSet)2 File (java.io.File)2 FileNotFoundException (java.io.FileNotFoundException)2 FileWriter (java.io.FileWriter)2 PrintStream (java.io.PrintStream)2 PrintWriter (java.io.PrintWriter)2 Collection (java.util.Collection)2 ParseException (org.apache.commons.cli.ParseException)2 Element (org.jdom.Element)2 SbmlException (org.vcell.sbml.SbmlException)2 SimSpec (org.vcell.sbml.SimSpec)2 SBMLImportException (org.vcell.sbml.vcell.SBMLImportException)2 Category (org.vcell.sbml.vcell.SBMLImportException.Category)2 BNGOutputSpec (cbit.vcell.bionetgen.BNGOutputSpec)1 ModelException (cbit.vcell.model.ModelException)1 SpeciesContext (cbit.vcell.model.SpeciesContext)1