1.完成源项处理模块导出概率分布图数据、导出观测值和模拟值的活度浓度比较结果数据、导出单变量后验分布结果数据、导出双变量后验分布结果数据接口
This commit is contained in:
parent
00d013ec55
commit
74b03a60ac
|
@ -0,0 +1,59 @@
|
|||
package org.jeecg.common.util;
|
||||
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import org.springframework.http.MediaType;
|
||||
import java.io.*;
|
||||
import java.net.URLEncoder;
|
||||
|
||||
/**
|
||||
* 下载文件工具
|
||||
*
|
||||
*/
|
||||
public class DownloadUtils {
|
||||
|
||||
public static void downloadTxt(HttpServletResponse response,InputStream is,String fileName){
|
||||
download(response,is,fileName,MediaType.TEXT_PLAIN_VALUE);
|
||||
}
|
||||
|
||||
private static void download(HttpServletResponse response,InputStream is,String fileName,String contentType){
|
||||
response.reset();
|
||||
response.setContentType(contentType);
|
||||
response.setCharacterEncoding("utf-8");
|
||||
try {
|
||||
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
|
||||
response.setHeader("Access-Control-Expose-Headers","Content-disposition");
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
BufferedInputStream bis = null;
|
||||
BufferedOutputStream bos = null;
|
||||
try {
|
||||
bis = new BufferedInputStream(is);
|
||||
bos = new BufferedOutputStream(response.getOutputStream());
|
||||
byte[] buff = new byte[1024];
|
||||
int bytesRead;
|
||||
try {
|
||||
while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
|
||||
bos.write(buff, 0, bytesRead);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
} catch (IOException e1) {
|
||||
e1.printStackTrace();
|
||||
}finally{
|
||||
try {
|
||||
if(bis!=null){
|
||||
bis.close();
|
||||
}
|
||||
if(bis!=null){
|
||||
bos.flush();
|
||||
bos.close();
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -48,10 +48,38 @@ public class TaskResultDataController {
|
|||
return Result.OK(taskResultDataService.getBayesMonovarPosterior(taskId));
|
||||
}
|
||||
|
||||
@AutoLog(value = "导出TXT")
|
||||
@Operation(summary = "导出TXT")
|
||||
@GetMapping("exportTxt")
|
||||
public void exportTxt(HttpServletResponse response) throws IOException {
|
||||
@AutoLog(value = "获取双变量后验分布")
|
||||
@Operation(summary = "获取双变量后验分布")
|
||||
@GetMapping("getBayesBivarPosterior")
|
||||
public Result<?> getBayesBivarPosterior(@NotNull(message = "任务ID不能为空") Integer taskId){
|
||||
return Result.OK(taskResultDataService.getBayesBivarPosterior(taskId));
|
||||
}
|
||||
|
||||
@AutoLog(value = "导出概率分布图数据")
|
||||
@Operation(summary = "导出概率分布图数据")
|
||||
@GetMapping("exportBayesProbLocTxt")
|
||||
public void exportBayesProbLocTxt(@NotNull(message = "任务ID不能为空") Integer taskId,HttpServletResponse response) throws IOException {
|
||||
taskResultDataService.exportBayesProbLocTxt(taskId,response);
|
||||
}
|
||||
|
||||
@AutoLog(value = "导出观测值和模拟值的活度浓度比较结果数据")
|
||||
@Operation(summary = "导出观测值和模拟值的活度浓度比较结果数据")
|
||||
@GetMapping("exportBayesAcTimeSeriesTxt")
|
||||
public void exportBayesAcTimeSeriesTxt(@NotNull(message = "任务ID不能为空") Integer taskId,HttpServletResponse response) throws IOException {
|
||||
taskResultDataService.exportBayesAcTimeSeriesTxt(taskId,response);
|
||||
}
|
||||
|
||||
@AutoLog(value = "导出单变量后验分布结果数据")
|
||||
@Operation(summary = "导出单变量后验分布结果数据")
|
||||
@GetMapping("exportBayesMonovarPosterior")
|
||||
public void exportBayesMonovarPosterior(@NotNull(message = "任务ID不能为空") Integer taskId,HttpServletResponse response) throws IOException {
|
||||
taskResultDataService.exportBayesMonovarPosterior(taskId,response);
|
||||
}
|
||||
|
||||
@AutoLog(value = "导出双变量后验分布结果数据")
|
||||
@Operation(summary = "导出双变量后验分布结果数据")
|
||||
@GetMapping("exportBayesBivarPosterior")
|
||||
public void exportBayesBivarPosterior(@NotNull(message = "任务ID不能为空") Integer taskId,HttpServletResponse response) throws IOException {
|
||||
taskResultDataService.exportBayesBivarPosterior(taskId,response);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
package org.jeecg.service;
|
||||
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import org.jeecg.vo.ActivityConcComparResult;
|
||||
import org.jeecg.vo.SourceProbabilityGrid;
|
||||
|
||||
|
@ -28,11 +30,39 @@ public interface TaskResultDataService {
|
|||
* 获取双变量后验分布
|
||||
* @param taskId
|
||||
*/
|
||||
void getBayesBivarPosterior(Integer taskId);
|
||||
Map<String,Object> getBayesBivarPosterior(Integer taskId);
|
||||
|
||||
/**
|
||||
* 获取单变量后验分布
|
||||
* @param taskId
|
||||
*/
|
||||
Map<String,Object> getBayesMonovarPosterior(Integer taskId);
|
||||
|
||||
/**
|
||||
* 导出概率分布图数据
|
||||
* @param taskId
|
||||
* @param response
|
||||
*/
|
||||
void exportBayesProbLocTxt(@NotNull(message = "任务ID不能为空") Integer taskId, HttpServletResponse response);
|
||||
|
||||
/**
|
||||
* 导出观测值和模拟值的活度浓度比较结果数据
|
||||
* @param taskId
|
||||
* @param response
|
||||
*/
|
||||
void exportBayesAcTimeSeriesTxt(@NotNull(message = "任务ID不能为空") Integer taskId, HttpServletResponse response);
|
||||
|
||||
/**
|
||||
* 导出单变量后验分布结果数据
|
||||
* @param taskId
|
||||
* @param response
|
||||
*/
|
||||
void exportBayesMonovarPosterior(@NotNull(message = "任务ID不能为空") Integer taskId, HttpServletResponse response);
|
||||
|
||||
/**
|
||||
* 导出双变量后验分布结果数据
|
||||
* @param taskId
|
||||
* @param response
|
||||
*/
|
||||
void exportBayesBivarPosterior(@NotNull(message = "任务ID不能为空") Integer taskId, HttpServletResponse response);
|
||||
}
|
||||
|
|
|
@ -1,9 +1,10 @@
|
|||
package org.jeecg.service.impl;
|
||||
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.jeecg.common.properties.SourceRebuildParams;
|
||||
import org.jeecg.common.util.DownloadUtils;
|
||||
import org.jeecg.modules.base.entity.SourceRebuildTask;
|
||||
import org.jeecg.service.SourceRebuildTaskService;
|
||||
import org.jeecg.service.TaskResultDataService;
|
||||
|
@ -15,6 +16,9 @@ import org.rosuda.REngine.Rserve.RConnection;
|
|||
import org.rosuda.REngine.Rserve.RserveException;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.InputStream;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.*;
|
||||
|
||||
|
@ -51,6 +55,7 @@ public class TaskResultDataServiceImpl implements TaskResultDataService {
|
|||
}
|
||||
|
||||
/**
|
||||
* 获取概率分布数据
|
||||
* @param taskId
|
||||
* @return
|
||||
*/
|
||||
|
@ -140,7 +145,7 @@ public class TaskResultDataServiceImpl implements TaskResultDataService {
|
|||
* @param taskId
|
||||
*/
|
||||
@Override
|
||||
public void getBayesBivarPosterior(Integer taskId) {
|
||||
public Map<String,Object> getBayesBivarPosterior(Integer taskId) {
|
||||
SourceRebuildTask task = this.sourceRebuildTaskService.getById(taskId);
|
||||
if(StringUtils.isBlank(task.getResultAddress())){
|
||||
throw new RuntimeException("此任务运行结果不存在,请检查运行日志");
|
||||
|
@ -149,6 +154,60 @@ public class TaskResultDataServiceImpl implements TaskResultDataService {
|
|||
if(!conn.isConnected()){
|
||||
throw new RuntimeException("Rserve连接不可用");
|
||||
}
|
||||
Map<String,Object> result = new HashMap<>();
|
||||
try {
|
||||
String posteriorRdsPath = task.getResultAddress()+"/bayes_bivarPosterior_aux.RDS";
|
||||
REXP posteriorResult = conn.eval("readRDS('" + posteriorRdsPath + "')");
|
||||
if (posteriorResult.isList()) {
|
||||
//list是一个列表,拥有chaindf, post_median, breaks, zprior多个嵌套对象
|
||||
RList list = posteriorResult.asList();
|
||||
//chaindf,它是一个R的DataFrame,存储的是抽样数据
|
||||
REXP chaindf = list.at("chaindf");
|
||||
//trueValues存储的是已知的释放源信息
|
||||
//REXP trueValues = list.at("trueValues");
|
||||
//存储的是lon、lat、log10_Q、tstart、tstop的中位数
|
||||
REXP post_median = list.at("post_median");
|
||||
//存储的是lon、lat、log10_Q、tstart、tstop的X轴的边界数据
|
||||
REXP breaks = list.at("breaks");
|
||||
//先验密度(在 breaks 点上)
|
||||
REXP zprior = list.at("zprior");
|
||||
Map<String, Object> lonChartDataMap = this.processLonChart(chaindf, post_median, breaks, zprior);
|
||||
Map<String, Object> latChartDataMap = this.processLatChart(chaindf, post_median, breaks, zprior);
|
||||
Map<String, Object> log10ChartDataMap = this.processLog10Chart(chaindf, post_median, breaks, zprior);
|
||||
Map<String, Object> startChartDataMap = this.processStartChart(chaindf, post_median, breaks, zprior);
|
||||
Map<String, Object> stopChartDataMap = this.processStopChart(chaindf, post_median, breaks, zprior);
|
||||
Map<String, Object> lonAndLatChartDataMap = this.processLonAndLatChart(chaindf, post_median, breaks);
|
||||
Map<String, Object> lonAndLog10ChartDataMap = this.processLonAndLog10Chart(chaindf, post_median, breaks);
|
||||
Map<String, Object> lonAndStartChartDataMap = this.processLonAndStartChart(chaindf, post_median, breaks);
|
||||
Map<String, Object> lonAndStopChartDataMap = this.processLonAndStopChart(chaindf, post_median, breaks);
|
||||
Map<String, Object> latAndLog10ChartDataMap = this.processLatAndLog10Chart(chaindf, post_median, breaks);
|
||||
Map<String, Object> latAndStartChartDataMap = this.processLatAndStartChart(chaindf, post_median, breaks);
|
||||
Map<String, Object> latAndStopChartDataMap = this.processLatAndStopChart(chaindf, post_median, breaks);
|
||||
Map<String, Object> log10AndStartChartDataMap = this.processLog10AndStartChart(chaindf, post_median, breaks);
|
||||
Map<String, Object> log10AndStopChartDataMap = this.processLog10AndStopChart(chaindf, post_median, breaks);
|
||||
Map<String, Object> startAndStopChartDataMap = this.processStartAndStopChart(chaindf, post_median, breaks);
|
||||
result.putAll(lonChartDataMap);
|
||||
result.putAll(latChartDataMap);
|
||||
result.putAll(log10ChartDataMap);
|
||||
result.putAll(startChartDataMap);
|
||||
result.putAll(stopChartDataMap);
|
||||
result.putAll(lonAndLatChartDataMap);
|
||||
result.putAll(lonAndLog10ChartDataMap);
|
||||
result.putAll(lonAndStartChartDataMap);
|
||||
result.putAll(lonAndStopChartDataMap);
|
||||
result.putAll(latAndLog10ChartDataMap);
|
||||
result.putAll(latAndStartChartDataMap);
|
||||
result.putAll(latAndStopChartDataMap);
|
||||
result.putAll(log10AndStartChartDataMap);
|
||||
result.putAll(log10AndStopChartDataMap);
|
||||
result.putAll(startAndStopChartDataMap);
|
||||
}
|
||||
} catch (RserveException e) {
|
||||
throw new RuntimeException("RDS读取异常",e);
|
||||
} catch (REXPMismatchException e) {
|
||||
throw new RuntimeException("RDS 文件不是一个列表结构",e);
|
||||
}
|
||||
return result;
|
||||
|
||||
}
|
||||
|
||||
|
@ -203,6 +262,163 @@ public class TaskResultDataServiceImpl implements TaskResultDataService {
|
|||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出概率分布图数据
|
||||
*
|
||||
* @param taskId
|
||||
* @param response
|
||||
*/
|
||||
@Override
|
||||
public void exportBayesProbLocTxt(Integer taskId, HttpServletResponse response) {
|
||||
SourceRebuildTask task = this.sourceRebuildTaskService.getById(taskId);
|
||||
if(StringUtils.isBlank(task.getResultAddress())){
|
||||
throw new RuntimeException("此任务运行结果不存在,请检查运行日志");
|
||||
}
|
||||
RConnection conn = this.getRConnection();
|
||||
if(!conn.isConnected()){
|
||||
throw new RuntimeException("Rserve连接不可用");
|
||||
}
|
||||
try {
|
||||
String rdsPath = task.getResultAddress()+"/probloc.RDS";
|
||||
REXP result = conn.eval("readRDS('" + rdsPath + "')");
|
||||
if (result.isNumeric()) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
double[][] doubleMatrix = result.asDoubleMatrix();
|
||||
for (int i = 0; i < doubleMatrix.length; i++) {
|
||||
for (int j = 0; j < doubleMatrix[i].length; j++) {
|
||||
sb.append(doubleMatrix[i][j]);
|
||||
if (j < doubleMatrix[i].length - 1) {
|
||||
sb.append(" ");
|
||||
}
|
||||
}
|
||||
sb.append("\n");
|
||||
}
|
||||
InputStream inputStream = new ByteArrayInputStream(sb.toString().getBytes(StandardCharsets.UTF_8));
|
||||
String fileName = task.getTaskName()+"_概率分布数据.txt";
|
||||
DownloadUtils.downloadTxt(response,inputStream,fileName);
|
||||
}
|
||||
} catch (RserveException e) {
|
||||
throw new RuntimeException("RDS读取异常",e);
|
||||
} catch (REXPMismatchException e) {
|
||||
throw new RuntimeException("RDS 文件不是一个矩阵结构",e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出观测值和模拟值的活度浓度比较结果数据
|
||||
*
|
||||
* @param taskId
|
||||
* @param response
|
||||
*/
|
||||
@Override
|
||||
public void exportBayesAcTimeSeriesTxt(Integer taskId, HttpServletResponse response) {
|
||||
SourceRebuildTask task = this.sourceRebuildTaskService.getById(taskId);
|
||||
if(StringUtils.isBlank(task.getResultAddress())){
|
||||
throw new RuntimeException("此任务运行结果不存在,请检查运行日志");
|
||||
}
|
||||
RConnection conn = this.getRConnection();
|
||||
if(!conn.isConnected()){
|
||||
throw new RuntimeException("Rserve连接不可用");
|
||||
}
|
||||
try {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
String obsRdsPath = task.getResultAddress()+"/obs.RDS";
|
||||
REXP obsResult = conn.eval("readRDS('" + obsRdsPath + "')");
|
||||
if (obsResult.isNumeric()) {
|
||||
sb.append("#obs\n");
|
||||
double[] obsData = obsResult.asDoubles();
|
||||
for (int i = 0; i < obsData.length; i++) {
|
||||
sb.append(obsData[i]);
|
||||
if (i < obsData.length - 1) {
|
||||
sb.append(" ");
|
||||
}
|
||||
if(i>0 && (i+1)%10==0){
|
||||
sb.append("\n");
|
||||
}
|
||||
}
|
||||
sb.append("\n\n");
|
||||
}
|
||||
String modRdsPath = task.getResultAddress()+"/mod.RDS";
|
||||
REXP modResult = conn.eval("readRDS('" + modRdsPath + "')");
|
||||
if (modResult.isNumeric()) {
|
||||
sb.append("#mod\n");
|
||||
double[] modData = modResult.asDoubles();
|
||||
for (int i = 0; i < modData.length; i++) {
|
||||
sb.append(modData[i]);
|
||||
if (i < modData.length - 1) {
|
||||
sb.append(" ");
|
||||
}
|
||||
if(i>0 && (i+1)%10==0){
|
||||
sb.append("\n");
|
||||
}
|
||||
}
|
||||
sb.append("\n\n");
|
||||
}
|
||||
String mdcRdsPath = task.getResultAddress()+"/MDC.RDS";
|
||||
REXP mdcResult = conn.eval("readRDS('" + mdcRdsPath + "')");
|
||||
if (mdcResult.isNumeric()) {
|
||||
sb.append("#mdc\n");
|
||||
double[] mdcData = mdcResult.asDoubles();
|
||||
for (int i = 0; i < mdcData.length; i++) {
|
||||
sb.append(mdcData[i]);
|
||||
if (i < mdcData.length - 1) {
|
||||
sb.append(" ");
|
||||
}
|
||||
if(i>0 && (i+1)%10==0){
|
||||
sb.append("\n");
|
||||
}
|
||||
}
|
||||
sb.append("\n\n");
|
||||
}
|
||||
String stationsTxtPath = task.getResultAddress()+"/statnames.txt";
|
||||
REXP stationsResult = conn.eval("readLines('" + stationsTxtPath + "')");
|
||||
if (stationsResult.isString()) {
|
||||
sb.append("#stations\n");
|
||||
String[] stationsData = stationsResult.asStrings();
|
||||
for (int i = 0; i < stationsData.length; i++) {
|
||||
sb.append(stationsData[i]);
|
||||
if (i < stationsData.length - 1) {
|
||||
sb.append(" ");
|
||||
}
|
||||
if(i>0 && (i+1)%10==0){
|
||||
sb.append("\n");
|
||||
}
|
||||
}
|
||||
sb.append("\n");
|
||||
}
|
||||
InputStream inputStream = new ByteArrayInputStream(sb.toString().getBytes(StandardCharsets.UTF_8));
|
||||
String fileName = task.getTaskName()+"_观测值与模拟值对比数据.txt";
|
||||
DownloadUtils.downloadTxt(response,inputStream,fileName);
|
||||
} catch (RserveException e) {
|
||||
throw new RuntimeException("RDS读取异常",e);
|
||||
} catch (REXPMismatchException e) {
|
||||
throw new RuntimeException("RDS 文件不是一个数组结构",e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出单变量后验分布结果数据
|
||||
*
|
||||
* @param taskId
|
||||
* @param response
|
||||
*/
|
||||
@Override
|
||||
public void exportBayesMonovarPosterior(Integer taskId, HttpServletResponse response) {
|
||||
this.getBayesAuxData(taskId,response,"bayes_monovarPosterior_aux.RDS");
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出双变量后验分布结果数据
|
||||
*
|
||||
* @param taskId
|
||||
* @param response
|
||||
*/
|
||||
@Override
|
||||
public void exportBayesBivarPosterior(Integer taskId, HttpServletResponse response) {
|
||||
this.getBayesAuxData(taskId,response,"bayes_bivarPosterior_aux.RDS");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 处理lon图表数据
|
||||
* @param chaindf
|
||||
|
@ -498,6 +714,622 @@ public class TaskResultDataServiceImpl implements TaskResultDataService {
|
|||
return map;
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理lon&lat图表数据
|
||||
* @param chaindf
|
||||
* @param postMedian
|
||||
* @param breaks
|
||||
* @return
|
||||
* @throws REXPMismatchException
|
||||
*/
|
||||
private Map<String,Object> processLonAndLatChart(REXP chaindf,REXP postMedian,REXP breaks) throws REXPMismatchException {
|
||||
Map<String,Object> map = new HashMap<>();
|
||||
//封装对象
|
||||
ScatterPlotChartStru scatterPlotChartStru = new ScatterPlotChartStru();
|
||||
//设置中位数点(蓝色点)
|
||||
REXP lon = postMedian.asList().at("lon");
|
||||
REXP lat = postMedian.asList().at("lat");
|
||||
PriorDistribution postMedianPoint = new PriorDistribution();
|
||||
postMedianPoint.setXValue(lon.asDouble());
|
||||
postMedianPoint.setYValue(lat.asDouble());
|
||||
scatterPlotChartStru.setPriorDistribution(postMedianPoint);
|
||||
//设置X轴边界
|
||||
REXP break1 = breaks.asList().at(0);
|
||||
if(break1.isNumeric()){
|
||||
double[] break1Data = break1.asDoubles();
|
||||
scatterPlotChartStru.setXMin(break1Data[0]);
|
||||
scatterPlotChartStru.setXMax(break1Data[break1Data.length-1]);
|
||||
}
|
||||
//设置散点坐标
|
||||
REXP lons = chaindf.asList().at(0);
|
||||
REXP lats = chaindf.asList().at(1);
|
||||
if(lons.isNumeric() && lats.isNumeric()){
|
||||
double[] lonData = lons.asDoubles();
|
||||
double[] latData = lats.asDoubles();
|
||||
List<PriorDistribution> priorDistributionList = new ArrayList<>();
|
||||
//lonData和latData长度肯定一致,循环一个获取同样下表即可
|
||||
for (int i= 0; i < lonData.length; i++) {
|
||||
PriorDistribution scatterPoint = new PriorDistribution();
|
||||
scatterPoint.setXValue(lonData[i]);
|
||||
scatterPoint.setYValue(latData[i]);
|
||||
priorDistributionList.add(scatterPoint);
|
||||
}
|
||||
scatterPlotChartStru.setPriorDistributionList(priorDistributionList);
|
||||
}
|
||||
map.put("lonAndLatChartStru",scatterPlotChartStru);
|
||||
return map;
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理lon&log10图表数据
|
||||
* @param chaindf
|
||||
* @param postMedian
|
||||
* @param breaks
|
||||
* @return
|
||||
* @throws REXPMismatchException
|
||||
*/
|
||||
private Map<String,Object> processLonAndLog10Chart(REXP chaindf,REXP postMedian,REXP breaks) throws REXPMismatchException {
|
||||
Map<String,Object> map = new HashMap<>();
|
||||
//封装对象
|
||||
ScatterPlotChartStru scatterPlotChartStru = new ScatterPlotChartStru();
|
||||
//设置中位数点(蓝色点)
|
||||
REXP lon = postMedian.asList().at("lon");
|
||||
REXP log10 = postMedian.asList().at("log10_Q");
|
||||
PriorDistribution postMedianPoint = new PriorDistribution();
|
||||
postMedianPoint.setXValue(lon.asDouble());
|
||||
postMedianPoint.setYValue(log10.asDouble());
|
||||
scatterPlotChartStru.setPriorDistribution(postMedianPoint);
|
||||
//设置X轴边界
|
||||
REXP break1 = breaks.asList().at(0);
|
||||
if(break1.isNumeric()){
|
||||
double[] break1Data = break1.asDoubles();
|
||||
scatterPlotChartStru.setXMin(break1Data[0]);
|
||||
scatterPlotChartStru.setXMax(break1Data[break1Data.length-1]);
|
||||
}
|
||||
//设置散点坐标
|
||||
REXP lons = chaindf.asList().at(0);
|
||||
REXP log10s = chaindf.asList().at(2);
|
||||
if(lons.isNumeric() && log10s.isNumeric()){
|
||||
double[] lonData = lons.asDoubles();
|
||||
double[] log10Data = log10s.asDoubles();
|
||||
List<PriorDistribution> priorDistributionList = new ArrayList<>();
|
||||
//lonData和log10Data长度肯定一致,循环一个获取同样下表即可
|
||||
for (int i= 0; i < lonData.length; i++) {
|
||||
PriorDistribution scatterPoint = new PriorDistribution();
|
||||
scatterPoint.setXValue(lonData[i]);
|
||||
scatterPoint.setYValue(log10Data[i]);
|
||||
priorDistributionList.add(scatterPoint);
|
||||
}
|
||||
scatterPlotChartStru.setPriorDistributionList(priorDistributionList);
|
||||
}
|
||||
map.put("lonAndLog10ChartStru",scatterPlotChartStru);
|
||||
return map;
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理lon&tstart图表数据
|
||||
* @param chaindf
|
||||
* @param postMedian
|
||||
* @param breaks
|
||||
* @return
|
||||
* @throws REXPMismatchException
|
||||
*/
|
||||
private Map<String,Object> processLonAndStartChart(REXP chaindf,REXP postMedian,REXP breaks) throws REXPMismatchException {
|
||||
Map<String,Object> map = new HashMap<>();
|
||||
//封装对象
|
||||
ScatterPlotChartStru scatterPlotChartStru = new ScatterPlotChartStru();
|
||||
//设置中位数点(蓝色点)
|
||||
REXP lon = postMedian.asList().at("lon");
|
||||
REXP rstart = postMedian.asList().at("rstart");
|
||||
PriorDistribution postMedianPoint = new PriorDistribution();
|
||||
postMedianPoint.setXValue(lon.asDouble());
|
||||
postMedianPoint.setYValue(this.posixctToCSTString(rstart.asDouble()));
|
||||
scatterPlotChartStru.setPriorDistribution(postMedianPoint);
|
||||
//设置X轴边界
|
||||
REXP break1 = breaks.asList().at(0);
|
||||
if(break1.isNumeric()){
|
||||
double[] break1Data = break1.asDoubles();
|
||||
scatterPlotChartStru.setXMin(break1Data[0]);
|
||||
scatterPlotChartStru.setXMax(break1Data[break1Data.length-1]);
|
||||
}
|
||||
//设置散点坐标
|
||||
REXP lons = chaindf.asList().at(0);
|
||||
REXP rstarts = chaindf.asList().at(3);
|
||||
if(lons.isNumeric() && rstarts.isNumeric()){
|
||||
double[] lonData = lons.asDoubles();
|
||||
double[] rstartData = rstarts.asDoubles();
|
||||
List<PriorDistribution> priorDistributionList = new ArrayList<>();
|
||||
//lonData和rstartData长度肯定一致,循环一个获取同样下表即可
|
||||
for (int i= 0; i < lonData.length; i++) {
|
||||
PriorDistribution scatterPoint = new PriorDistribution();
|
||||
scatterPoint.setXValue(lonData[i]);
|
||||
scatterPoint.setYValue(this.posixctToCSTString(rstartData[i]));
|
||||
priorDistributionList.add(scatterPoint);
|
||||
}
|
||||
scatterPlotChartStru.setPriorDistributionList(priorDistributionList);
|
||||
}
|
||||
map.put("lonAndStartChartStru",scatterPlotChartStru);
|
||||
return map;
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理lon&tstop图表数据
|
||||
* @param chaindf
|
||||
* @param postMedian
|
||||
* @param breaks
|
||||
* @return
|
||||
* @throws REXPMismatchException
|
||||
*/
|
||||
private Map<String,Object> processLonAndStopChart(REXP chaindf,REXP postMedian,REXP breaks) throws REXPMismatchException {
|
||||
Map<String,Object> map = new HashMap<>();
|
||||
//封装对象
|
||||
ScatterPlotChartStru scatterPlotChartStru = new ScatterPlotChartStru();
|
||||
//设置中位数点(蓝色点)
|
||||
REXP lon = postMedian.asList().at("lon");
|
||||
REXP rstop = postMedian.asList().at("rstop");
|
||||
PriorDistribution postMedianPoint = new PriorDistribution();
|
||||
postMedianPoint.setXValue(lon.asDouble());
|
||||
postMedianPoint.setYValue(this.posixctToCSTString(rstop.asDouble()));
|
||||
scatterPlotChartStru.setPriorDistribution(postMedianPoint);
|
||||
//设置X轴边界
|
||||
REXP break1 = breaks.asList().at(0);
|
||||
if(break1.isNumeric()){
|
||||
double[] break1Data = break1.asDoubles();
|
||||
scatterPlotChartStru.setXMin(break1Data[0]);
|
||||
scatterPlotChartStru.setXMax(break1Data[break1Data.length-1]);
|
||||
}
|
||||
//设置散点坐标
|
||||
REXP lons = chaindf.asList().at(0);
|
||||
REXP rstops = chaindf.asList().at(4);
|
||||
if(lons.isNumeric() && rstops.isNumeric()){
|
||||
double[] lonData = lons.asDoubles();
|
||||
double[] rstopData = rstops.asDoubles();
|
||||
List<PriorDistribution> priorDistributionList = new ArrayList<>();
|
||||
//lonData和rstopData长度肯定一致,循环一个获取同样下表即可
|
||||
for (int i= 0; i < lonData.length; i++) {
|
||||
PriorDistribution scatterPoint = new PriorDistribution();
|
||||
scatterPoint.setXValue(lonData[i]);
|
||||
scatterPoint.setYValue(this.posixctToCSTString(rstopData[i]));
|
||||
priorDistributionList.add(scatterPoint);
|
||||
}
|
||||
scatterPlotChartStru.setPriorDistributionList(priorDistributionList);
|
||||
}
|
||||
map.put("lonAndStopChartStru",scatterPlotChartStru);
|
||||
return map;
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理lat&log10图表数据
|
||||
* @param chaindf
|
||||
* @param postMedian
|
||||
* @param breaks
|
||||
* @return
|
||||
* @throws REXPMismatchException
|
||||
*/
|
||||
private Map<String,Object> processLatAndLog10Chart(REXP chaindf,REXP postMedian,REXP breaks) throws REXPMismatchException {
|
||||
Map<String,Object> map = new HashMap<>();
|
||||
//封装对象
|
||||
ScatterPlotChartStru scatterPlotChartStru = new ScatterPlotChartStru();
|
||||
//设置中位数点(蓝色点)
|
||||
REXP lat = postMedian.asList().at("lat");
|
||||
REXP log10 = postMedian.asList().at("log10_Q");
|
||||
PriorDistribution postMedianPoint = new PriorDistribution();
|
||||
postMedianPoint.setXValue(lat.asDouble());
|
||||
postMedianPoint.setYValue(log10.asDouble());
|
||||
scatterPlotChartStru.setPriorDistribution(postMedianPoint);
|
||||
//设置X轴边界
|
||||
REXP break2 = breaks.asList().at(1);
|
||||
if(break2.isNumeric()){
|
||||
double[] break2Data = break2.asDoubles();
|
||||
scatterPlotChartStru.setXMin(break2Data[0]);
|
||||
scatterPlotChartStru.setXMax(break2Data[break2Data.length-1]);
|
||||
}
|
||||
//设置散点坐标
|
||||
REXP lats = chaindf.asList().at(1);
|
||||
REXP log10s = chaindf.asList().at(2);
|
||||
if(lats.isNumeric() && log10s.isNumeric()){
|
||||
double[] latData = lats.asDoubles();
|
||||
double[] log10Data = log10s.asDoubles();
|
||||
List<PriorDistribution> priorDistributionList = new ArrayList<>();
|
||||
//latData和log10Data长度肯定一致,循环一个获取同样下表即可
|
||||
for (int i= 0; i < latData.length; i++) {
|
||||
PriorDistribution scatterPoint = new PriorDistribution();
|
||||
scatterPoint.setXValue(latData[i]);
|
||||
scatterPoint.setYValue(log10Data[i]);
|
||||
priorDistributionList.add(scatterPoint);
|
||||
}
|
||||
scatterPlotChartStru.setPriorDistributionList(priorDistributionList);
|
||||
}
|
||||
map.put("latAndLog10ChartStru",scatterPlotChartStru);
|
||||
return map;
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理lat&tstart图表数据
|
||||
* @param chaindf
|
||||
* @param postMedian
|
||||
* @param breaks
|
||||
* @return
|
||||
* @throws REXPMismatchException
|
||||
*/
|
||||
private Map<String,Object> processLatAndStartChart(REXP chaindf,REXP postMedian,REXP breaks) throws REXPMismatchException {
|
||||
Map<String,Object> map = new HashMap<>();
|
||||
//封装对象
|
||||
ScatterPlotChartStru scatterPlotChartStru = new ScatterPlotChartStru();
|
||||
//设置中位数点(蓝色点)
|
||||
REXP lat = postMedian.asList().at("lat");
|
||||
REXP rstart = postMedian.asList().at("rstart");
|
||||
PriorDistribution postMedianPoint = new PriorDistribution();
|
||||
postMedianPoint.setXValue(lat.asDouble());
|
||||
postMedianPoint.setYValue(this.posixctToCSTString(rstart.asDouble()));
|
||||
scatterPlotChartStru.setPriorDistribution(postMedianPoint);
|
||||
//设置X轴边界
|
||||
REXP break2 = breaks.asList().at(1);
|
||||
if(break2.isNumeric()){
|
||||
double[] break2Data = break2.asDoubles();
|
||||
scatterPlotChartStru.setXMin(break2Data[0]);
|
||||
scatterPlotChartStru.setXMax(break2Data[break2Data.length-1]);
|
||||
}
|
||||
//设置散点坐标
|
||||
REXP lats = chaindf.asList().at(1);
|
||||
REXP rstarts = chaindf.asList().at(3);
|
||||
if(lats.isNumeric() && rstarts.isNumeric()){
|
||||
double[] latData = lats.asDoubles();
|
||||
double[] rstartData = rstarts.asDoubles();
|
||||
List<PriorDistribution> priorDistributionList = new ArrayList<>();
|
||||
//latData和rstartData长度肯定一致,循环一个获取同样下表即可
|
||||
for (int i= 0; i < latData.length; i++) {
|
||||
PriorDistribution scatterPoint = new PriorDistribution();
|
||||
scatterPoint.setXValue(latData[i]);
|
||||
scatterPoint.setYValue(this.posixctToCSTString(rstartData[i]));
|
||||
priorDistributionList.add(scatterPoint);
|
||||
}
|
||||
scatterPlotChartStru.setPriorDistributionList(priorDistributionList);
|
||||
}
|
||||
map.put("latAndStartChartStru",scatterPlotChartStru);
|
||||
return map;
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理lat&tstop图表数据
|
||||
* @param chaindf
|
||||
* @param postMedian
|
||||
* @param breaks
|
||||
* @return
|
||||
* @throws REXPMismatchException
|
||||
*/
|
||||
private Map<String,Object> processLatAndStopChart(REXP chaindf,REXP postMedian,REXP breaks) throws REXPMismatchException {
|
||||
Map<String,Object> map = new HashMap<>();
|
||||
//封装对象
|
||||
ScatterPlotChartStru scatterPlotChartStru = new ScatterPlotChartStru();
|
||||
//设置中位数点(蓝色点)
|
||||
REXP lat = postMedian.asList().at("lat");
|
||||
REXP rstop = postMedian.asList().at("rstop");
|
||||
PriorDistribution postMedianPoint = new PriorDistribution();
|
||||
postMedianPoint.setXValue(lat.asDouble());
|
||||
postMedianPoint.setYValue(this.posixctToCSTString(rstop.asDouble()));
|
||||
scatterPlotChartStru.setPriorDistribution(postMedianPoint);
|
||||
//设置X轴边界
|
||||
REXP break2 = breaks.asList().at(1);
|
||||
if(break2.isNumeric()){
|
||||
double[] break2Data = break2.asDoubles();
|
||||
scatterPlotChartStru.setXMin(break2Data[0]);
|
||||
scatterPlotChartStru.setXMax(break2Data[break2Data.length-1]);
|
||||
}
|
||||
//设置散点坐标
|
||||
REXP lats = chaindf.asList().at(1);
|
||||
REXP rstops = chaindf.asList().at(4);
|
||||
if(lats.isNumeric() && rstops.isNumeric()){
|
||||
double[] latData = lats.asDoubles();
|
||||
double[] rstopData = rstops.asDoubles();
|
||||
List<PriorDistribution> priorDistributionList = new ArrayList<>();
|
||||
//latData和rstopData长度肯定一致,循环一个获取同样下表即可
|
||||
for (int i= 0; i < latData.length; i++) {
|
||||
PriorDistribution scatterPoint = new PriorDistribution();
|
||||
scatterPoint.setXValue(latData[i]);
|
||||
scatterPoint.setYValue(this.posixctToCSTString(rstopData[i]));
|
||||
priorDistributionList.add(scatterPoint);
|
||||
}
|
||||
scatterPlotChartStru.setPriorDistributionList(priorDistributionList);
|
||||
}
|
||||
map.put("latAndStopChartStru",scatterPlotChartStru);
|
||||
return map;
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理log10&tstart图表数据
|
||||
* @param chaindf
|
||||
* @param postMedian
|
||||
* @param breaks
|
||||
* @return
|
||||
* @throws REXPMismatchException
|
||||
*/
|
||||
private Map<String,Object> processLog10AndStartChart(REXP chaindf,REXP postMedian,REXP breaks) throws REXPMismatchException {
|
||||
Map<String,Object> map = new HashMap<>();
|
||||
//封装对象
|
||||
ScatterPlotChartStru scatterPlotChartStru = new ScatterPlotChartStru();
|
||||
//设置中位数点(蓝色点)
|
||||
REXP log10 = postMedian.asList().at("log10_Q");
|
||||
REXP rstart = postMedian.asList().at("rstart");
|
||||
PriorDistribution postMedianPoint = new PriorDistribution();
|
||||
postMedianPoint.setXValue(log10.asDouble());
|
||||
postMedianPoint.setYValue(this.posixctToCSTString(rstart.asDouble()));
|
||||
scatterPlotChartStru.setPriorDistribution(postMedianPoint);
|
||||
//设置X轴边界
|
||||
REXP break3 = breaks.asList().at(2);
|
||||
if(break3.isNumeric()){
|
||||
double[] break3Data = break3.asDoubles();
|
||||
scatterPlotChartStru.setXMin(break3Data[0]);
|
||||
scatterPlotChartStru.setXMax(break3Data[break3Data.length-1]);
|
||||
}
|
||||
//设置散点坐标
|
||||
REXP log10s = chaindf.asList().at(2);
|
||||
REXP rstarts = chaindf.asList().at(3);
|
||||
if(log10s.isNumeric() && rstarts.isNumeric()){
|
||||
double[] log10Data = log10s.asDoubles();
|
||||
double[] rstartData = rstarts.asDoubles();
|
||||
List<PriorDistribution> priorDistributionList = new ArrayList<>();
|
||||
//log10Data和rstartData长度肯定一致,循环一个获取同样下表即可
|
||||
for (int i= 0; i < log10Data.length; i++) {
|
||||
PriorDistribution scatterPoint = new PriorDistribution();
|
||||
scatterPoint.setXValue(log10Data[i]);
|
||||
scatterPoint.setYValue(this.posixctToCSTString(rstartData[i]));
|
||||
priorDistributionList.add(scatterPoint);
|
||||
}
|
||||
scatterPlotChartStru.setPriorDistributionList(priorDistributionList);
|
||||
}
|
||||
map.put("log10AndStartChartStru",scatterPlotChartStru);
|
||||
return map;
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理log10&tstop图表数据
|
||||
* @param chaindf
|
||||
* @param postMedian
|
||||
* @param breaks
|
||||
* @return
|
||||
* @throws REXPMismatchException
|
||||
*/
|
||||
private Map<String,Object> processLog10AndStopChart(REXP chaindf,REXP postMedian,REXP breaks) throws REXPMismatchException {
|
||||
Map<String,Object> map = new HashMap<>();
|
||||
//封装对象
|
||||
ScatterPlotChartStru scatterPlotChartStru = new ScatterPlotChartStru();
|
||||
//设置中位数点(蓝色点)
|
||||
REXP log10 = postMedian.asList().at("log10_Q");
|
||||
REXP rstop = postMedian.asList().at("rstop");
|
||||
PriorDistribution postMedianPoint = new PriorDistribution();
|
||||
postMedianPoint.setXValue(log10.asDouble());
|
||||
postMedianPoint.setYValue(this.posixctToCSTString(rstop.asDouble()));
|
||||
scatterPlotChartStru.setPriorDistribution(postMedianPoint);
|
||||
//设置X轴边界
|
||||
REXP break3 = breaks.asList().at(2);
|
||||
if(break3.isNumeric()){
|
||||
double[] break3Data = break3.asDoubles();
|
||||
scatterPlotChartStru.setXMin(break3Data[0]);
|
||||
scatterPlotChartStru.setXMax(break3Data[break3Data.length-1]);
|
||||
}
|
||||
//设置散点坐标
|
||||
REXP log10s = chaindf.asList().at(2);
|
||||
REXP rstops = chaindf.asList().at(4);
|
||||
if(log10s.isNumeric() && rstops.isNumeric()){
|
||||
double[] log10Data = log10s.asDoubles();
|
||||
double[] rstopData = rstops.asDoubles();
|
||||
List<PriorDistribution> priorDistributionList = new ArrayList<>();
|
||||
//log10Data和rstopData长度肯定一致,循环一个获取同样下表即可
|
||||
for (int i= 0; i < log10Data.length; i++) {
|
||||
PriorDistribution scatterPoint = new PriorDistribution();
|
||||
scatterPoint.setXValue(log10Data[i]);
|
||||
scatterPoint.setYValue(this.posixctToCSTString(rstopData[i]));
|
||||
priorDistributionList.add(scatterPoint);
|
||||
}
|
||||
scatterPlotChartStru.setPriorDistributionList(priorDistributionList);
|
||||
}
|
||||
map.put("log10AndStopChartStru",scatterPlotChartStru);
|
||||
return map;
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理tstart&tstop图表数据
|
||||
* @param chaindf
|
||||
* @param postMedian
|
||||
* @param breaks
|
||||
* @return
|
||||
* @throws REXPMismatchException
|
||||
*/
|
||||
private Map<String,Object> processStartAndStopChart(REXP chaindf,REXP postMedian,REXP breaks) throws REXPMismatchException {
|
||||
Map<String,Object> map = new HashMap<>();
|
||||
//封装对象
|
||||
ScatterPlotChartStru scatterPlotChartStru = new ScatterPlotChartStru();
|
||||
//设置中位数点(蓝色点)
|
||||
REXP rstart = postMedian.asList().at("rstart");
|
||||
REXP rstop = postMedian.asList().at("rstop");
|
||||
PriorDistribution postMedianPoint = new PriorDistribution();
|
||||
postMedianPoint.setXValue(this.posixctToCSTString(rstart.asDouble()));
|
||||
postMedianPoint.setYValue(this.posixctToCSTString(rstop.asDouble()));
|
||||
scatterPlotChartStru.setPriorDistribution(postMedianPoint);
|
||||
//设置X轴边界
|
||||
REXP break4 = breaks.asList().at(3);
|
||||
if(break4.isNumeric()){
|
||||
double[] break4Data = break4.asDoubles();
|
||||
scatterPlotChartStru.setXMin(break4Data[0]);
|
||||
scatterPlotChartStru.setXMax(break4Data[break4Data.length-1]);
|
||||
}
|
||||
//设置散点坐标
|
||||
REXP rstarts = chaindf.asList().at(3);
|
||||
REXP rstops = chaindf.asList().at(4);
|
||||
if(rstarts.isNumeric() && rstops.isNumeric()){
|
||||
double[] rstartData = rstarts.asDoubles();
|
||||
double[] rstopData = rstops.asDoubles();
|
||||
List<PriorDistribution> priorDistributionList = new ArrayList<>();
|
||||
//log10Data和rstopData长度肯定一致,循环一个获取同样下表即可
|
||||
for (int i= 0; i < rstartData.length; i++) {
|
||||
PriorDistribution scatterPoint = new PriorDistribution();
|
||||
scatterPoint.setXValue(this.posixctToCSTString(rstartData[i]));
|
||||
scatterPoint.setYValue(this.posixctToCSTString(rstopData[i]));
|
||||
priorDistributionList.add(scatterPoint);
|
||||
}
|
||||
scatterPlotChartStru.setPriorDistributionList(priorDistributionList);
|
||||
}
|
||||
map.put("startAndStopChartStru",scatterPlotChartStru);
|
||||
return map;
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出单变量和双变量后验分布数据
|
||||
* @param taskId
|
||||
* @param response
|
||||
* @param rdsFileName
|
||||
*/
|
||||
private void getBayesAuxData(Integer taskId, HttpServletResponse response,String rdsFileName) {
|
||||
SourceRebuildTask task = this.sourceRebuildTaskService.getById(taskId);
|
||||
if(StringUtils.isBlank(task.getResultAddress())){
|
||||
throw new RuntimeException("此任务运行结果不存在,请检查运行日志");
|
||||
}
|
||||
RConnection conn = this.getRConnection();
|
||||
if(!conn.isConnected()){
|
||||
throw new RuntimeException("Rserve连接不可用");
|
||||
}
|
||||
try {
|
||||
String posteriorRdsPath = task.getResultAddress()+"/"+rdsFileName;
|
||||
REXP posteriorResult = conn.eval("readRDS('" + posteriorRdsPath + "')");
|
||||
if (posteriorResult.isList()) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
//list是一个列表,拥有chaindf, post_median, breaks, zprior多个嵌套对象
|
||||
RList list = posteriorResult.asList();
|
||||
//chaindf,它是一个R的DataFrame,存储的是抽样数据
|
||||
REXP chaindf = list.at("chaindf");
|
||||
sb.append("#chaindf\n");
|
||||
String title = String.format("%-9s %-9s %-9s %-20s %-20s","lon","lat","log10_Q","tstart","tstop");
|
||||
sb.append(title);
|
||||
sb.append("\n");
|
||||
double[] lonData = chaindf.asList().at(0).asDoubles();
|
||||
double[] latData = chaindf.asList().at(1).asDoubles();
|
||||
double[] log10Data = chaindf.asList().at(2).asDoubles();
|
||||
double[] tstartData = chaindf.asList().at(3).asDoubles();
|
||||
double[] tstopData = chaindf.asList().at(4).asDoubles();
|
||||
for (int i = 0; i < lonData.length; i++) {
|
||||
String line = String.format("%-9.5f %-9.5f %-9.5f %-20s %-20s",lonData[i],latData[i],log10Data[i],this.posixctToCSTString(tstartData[i]),this.posixctToCSTString(tstopData[i]));
|
||||
sb.append(line);
|
||||
sb.append("\n");
|
||||
}
|
||||
sb.append("\n");
|
||||
|
||||
//trueValues存储的是已知的释放源信息
|
||||
// REXP trueValues = list.at("trueValues");
|
||||
//存储的是lon、lat、log10_Q、tstart、tstop的中位数
|
||||
REXP postMedian = list.at("post_median");
|
||||
sb.append("#post_median\n");
|
||||
double lon = postMedian.asList().at("lon").asDouble();
|
||||
double lat = postMedian.asList().at("lat").asDouble();
|
||||
double log10_Q = postMedian.asList().at("log10_Q").asDouble();
|
||||
double rstart = postMedian.asList().at("rstart").asDouble();
|
||||
double rstop = postMedian.asList().at("rstop").asDouble();
|
||||
String postMedianTitle = String.format("%-9s %-9s %-9s %-20s %-20s","lon","lat","log10_Q","tstart","tstop");
|
||||
sb.append(postMedianTitle);
|
||||
sb.append("\n");
|
||||
String line = String.format("%-9.5f %-9.5f %-9.5f %-20s %-20s",lon,lat,log10_Q,this.posixctToCSTString(rstart),this.posixctToCSTString(rstop));
|
||||
sb.append(line);
|
||||
sb.append("\n\n");
|
||||
|
||||
//存储的是lon、lat、log10_Q、tstart、tstop的X轴的边界数据
|
||||
REXP breaks = list.at("breaks");
|
||||
sb.append("#breaks\n");
|
||||
double[] breakLonData = breaks.asList().at(0).asDoubles();
|
||||
sb.append("#breaks:lon\n");
|
||||
for (int i = 0; i < breakLonData.length; i++) {
|
||||
String breakLonDataStr = String.format("%-9.5f",breakLonData[i]);
|
||||
sb.append(breakLonDataStr);
|
||||
if (i < breakLonData.length - 1) {
|
||||
sb.append(" ");
|
||||
}
|
||||
if(i>0 && (i+1)%15==0){
|
||||
sb.append("\n");
|
||||
}
|
||||
}
|
||||
sb.append("\n");
|
||||
|
||||
double[] breakLatData = breaks.asList().at(1).asDoubles();
|
||||
sb.append("#breaks:lat\n");
|
||||
for (int i = 0; i < breakLatData.length; i++) {
|
||||
String breakLatDataStr = String.format("%-9.5f",breakLatData[i]);
|
||||
sb.append(breakLatDataStr);
|
||||
if (i < breakLatData.length - 1) {
|
||||
sb.append(" ");
|
||||
}
|
||||
if(i>0 && (i+1)%15==0){
|
||||
sb.append("\n");
|
||||
}
|
||||
}
|
||||
sb.append("\n");
|
||||
|
||||
double[] breakLog10Data = breaks.asList().at(2).asDoubles();
|
||||
sb.append("#breaks:log10_Q\n");
|
||||
for (int i = 0; i < breakLog10Data.length; i++) {
|
||||
String breakLog10DataStr = String.format("%-9.5f",breakLog10Data[i]);
|
||||
sb.append(breakLog10DataStr);
|
||||
if (i < breakLog10Data.length - 1) {
|
||||
sb.append(" ");
|
||||
}
|
||||
if(i>0 && (i+1)%15==0){
|
||||
sb.append("\n");
|
||||
}
|
||||
}
|
||||
sb.append("\n");
|
||||
|
||||
double[] breakRstartData = breaks.asList().at(3).asDoubles();
|
||||
sb.append("#breaks:rstart\n");
|
||||
for (int i = 0; i < breakRstartData.length; i++) {
|
||||
String breakRstartDataStr = String.format("%-20s",this.posixctToCSTString(breakRstartData[i]));
|
||||
sb.append(breakRstartDataStr);
|
||||
if (i < breakRstartData.length - 1) {
|
||||
sb.append(" ");
|
||||
}
|
||||
if(i>0 && (i+1)%6==0){
|
||||
sb.append("\n");
|
||||
}
|
||||
}
|
||||
sb.append("\n");
|
||||
|
||||
double[] breakRstopData = breaks.asList().at(4).asDoubles();
|
||||
sb.append("#breaks:rstop\n");
|
||||
for (int i = 0; i < breakRstopData.length; i++) {
|
||||
String breakRstopDataStr = String.format("%-20s",this.posixctToCSTString(breakRstopData[i]));
|
||||
sb.append(breakRstopDataStr);
|
||||
if (i < breakRstopData.length - 1) {
|
||||
sb.append(" ");
|
||||
}
|
||||
if(i>0 && (i+1)%6==0){
|
||||
sb.append("\n");
|
||||
}
|
||||
}
|
||||
sb.append("\n\n");
|
||||
|
||||
//先验密度(在 breaks 点上)
|
||||
REXP zprior = list.at("zprior");
|
||||
sb.append("#zprior\n");
|
||||
double[][] zpriorMatrix = zprior.asDoubleMatrix();
|
||||
for (int i = 0; i < zpriorMatrix.length; i++) {
|
||||
double zpriorLonVal = zpriorMatrix[i][0];
|
||||
double zpriorLatVal = zpriorMatrix[i][1];
|
||||
double zpriorLog10Val = zpriorMatrix[i][2];
|
||||
double zpriorStartVal = zpriorMatrix[i][3];
|
||||
double zpriorStopVal = zpriorMatrix[i][4];
|
||||
String zpriorLine = String.format("%-12.1f %-12.1f %-12.1f %-12.6e %-12.6e",zpriorLonVal,zpriorLatVal,zpriorLog10Val,zpriorStartVal,zpriorStopVal);
|
||||
sb.append(zpriorLine);
|
||||
sb.append("\n");
|
||||
}
|
||||
|
||||
InputStream inputStream = new ByteArrayInputStream(sb.toString().getBytes(StandardCharsets.UTF_8));
|
||||
String fileName = task.getTaskName()+"_单变量后验分布结果数据.txt";
|
||||
DownloadUtils.downloadTxt(response,inputStream,fileName);
|
||||
}
|
||||
} catch (RserveException e) {
|
||||
throw new RuntimeException("RDS读取异常",e);
|
||||
} catch (REXPMismatchException e) {
|
||||
throw new RuntimeException("RDS 文件不是一个列表结构",e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换R语言项目的时间
|
||||
* @param posixctSeconds
|
||||
|
|
|
@ -5,7 +5,7 @@ import lombok.Data;
|
|||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* 直方图先验分布数据
|
||||
* 先验分布数据
|
||||
*/
|
||||
@Data
|
||||
public class PriorDistribution implements Serializable {
|
||||
|
|
|
@ -0,0 +1,33 @@
|
|||
package org.jeecg.vo;
|
||||
|
||||
import lombok.Data;
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 双变量分布图散点图数据
|
||||
*/
|
||||
@Data
|
||||
public class ScatterPlotChartStru implements Serializable {
|
||||
|
||||
/**
|
||||
* X轴最小值
|
||||
*/
|
||||
private Object xMin;
|
||||
|
||||
/**
|
||||
* X轴最大值
|
||||
*/
|
||||
private Object xMax;
|
||||
|
||||
/**
|
||||
* 散点图
|
||||
*/
|
||||
private List<PriorDistribution> priorDistributionList;
|
||||
|
||||
/**
|
||||
* 中位数点位
|
||||
*/
|
||||
private PriorDistribution priorDistribution;
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user