V1_0.java [src/java/m/rhem/rhem06_riskassessment] Revision: default Date:
/*
* $Id$
*
* This file is part of the Cloud Services Integration Platform (CSIP),
* a Model-as-a-Service framework, API, and application suite.
*
* 2012-2017, OMSLab, Colorado State University.
*
* OMSLab licenses this file to you under the MIT license.
* See the LICENSE file in the project root for more information.
*/
package m.rhem.rhem06_riskassessment;
import csip.api.server.Executable;
import csip.ModelDataService;
import csip.api.server.ServiceException;
import csip.annotations.Polling;
import csip.annotations.Resource;
import static csip.annotations.ResourceType.OUTPUT;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import javax.ws.rs.Path;
import csip.annotations.Description;
import csip.annotations.Name;
import m.rhem.ApplicationResources;
import static m.rhem.ApplicationResources.RHEM_RA_EXE;
import m.rhem.DBResources;
import rhem.utils.RHEMUtils;
/**
* RHEM-06: Risk Assessment
*
* @author rumpal
* @version 1.0
*/
@Name("RHEM-06: Risk Assessment")
@Description("This service runs risk assessment with a maximum of five detailed output files.")
@Path("m/rhem/riskassessment/1.0")
@Polling(first = 10000, next = 2000)
@Resource(file = "*.out *.run", type = OUTPUT)
@Resource(from = DBResources.class)
@Resource(from = ApplicationResources.class)
public class V1_0 extends ModelDataService {
private String baseLineScenarioFileName;
private List<String> raScenarioFilenameList = new ArrayList<>();
private List<String> scenarioNames = new ArrayList<>();
@Override
public void preProcess() throws ServiceException {
int numberOfFiles = parameter().getInt("number_of_files");
if (numberOfFiles > 5) {
throw new ServiceException("The risk assessment can be performed with a maximum of five scenarios.");
}
for (int i = 1; i < numberOfFiles; i++) {
raScenarioFilenameList.add(parameter().getString("scenario_" + i + "_filename"));
}
baseLineScenarioFileName = parameter().getString("base_line_scenario_file");
}
@Override
public void doProcess() throws Exception {
writeOutFilesToWorkspace();
generateRARunFile();
runRiskAssessment();
double[][] outRAarray = readRiskAssessmentOutFile();
List<List> interpolatedResultsArray = RHEMUtils.calculateReturnPeriods(outRAarray);
writeInterpolatedResultsArray(interpolatedResultsArray);
}
private void writeOutFilesToWorkspace() throws ServiceException {
attachments().getFile(baseLineScenarioFileName);
for (String filename : raScenarioFilenameList) {
attachments().getFile(filename);
}
}
private void generateRARunFile() throws Exception {
try (PrintWriter writer = new PrintWriter(workspace().getFile("risk_assessment.run"))) {
writer.println(baseLineScenarioFileName);
for (String fileName : raScenarioFilenameList) {
writer.println(fileName);
}
}
}
private void runRiskAssessment() throws Exception {
Executable rh = resources().getExe(RHEM_RA_EXE);
rh.setArguments("-b", workspace().getFile("risk_assessment.run").toPath());
int run = rh.exec();
if (run != 0) {
throw new ServiceException("Problem in running risk assessment.");
}
}
private double[][] readRiskAssessmentOutFile() throws Exception {
double outputRAArray[][] = new double[12][raScenarioFilenameList.size() + 2];
int count = -1;
boolean check = false;
try (BufferedReader bufferedReader = new BufferedReader(
new FileReader(workspace().getFile("risk_assessment.OUT")))) {
String line;
while ((line = bufferedReader.readLine()) != null && !check) {
if (line.contains("FREQUENCY ANALYSIS")) {
check = true;
for (int i = 0; i < 3; i++) {
line = bufferedReader.readLine();
if (i == 2) {
String[] test = line.trim().split("\\s+");
for (int j = 1; j < test.length; j++) {
scenarioNames.add(test[j]);
}
}
}
}
}
do {
count++;
String[] test = line.trim().split("\\s+");
for (int i = 0; i < test.length; i++) {
outputRAArray[count][i] = Double.parseDouble(test[i].trim());
}
} while ((line = bufferedReader.readLine()) != null && check);
}
return outputRAArray;
}
public void writeInterpolatedResultsArray(List<List> interpolatedResultsArray) throws Exception {
try (PrintWriter w = new PrintWriter(workspace().getFile("frequencyAnalysisReturnPeriodTable.out"))) {
w.print(String.format("%-20s %-20s", "BASELINE SCENARIO", "RETURN PERIOD"));
for (String name : scenarioNames) {
w.print(String.format("%-20s", name + "(years)"));
}
w.println();
for (int i = 0; i < interpolatedResultsArray.size(); i++) {
for (int j = 0; j < interpolatedResultsArray.get(i).size(); j++) {
w.print(String.format("%-20s", interpolatedResultsArray.get(i).get(j).toString()));
}
w.println();
}
}
}
}