diff --git a/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/common/util/PHDFileUtil.java b/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/common/util/PHDFileUtil.java index 4f7d35cb..89ff123f 100644 --- a/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/common/util/PHDFileUtil.java +++ b/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/common/util/PHDFileUtil.java @@ -1,19 +1,13 @@ package org.jeecg.common.util; -import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.StringPool; import com.baomidou.mybatisplus.core.toolkit.StringUtils; -import com.google.common.cache.Cache; import org.apache.commons.io.FileUtils; -import org.apache.commons.net.ftp.FTP; -import org.apache.commons.net.ftp.FTPClient; -import org.apache.commons.net.ftp.FTPFile; +import org.apache.commons.math3.fitting.WeightedObservedPoints; import org.jeecg.common.properties.ParameterProperties; -import org.jeecg.common.properties.SpectrumPathProperties; import org.jeecg.modules.base.abstracts.AbstractLogOrReport; import org.jeecg.modules.base.entity.rnman.GardsXeResults; -import org.jeecg.modules.base.enums.DataType; import org.jeecg.modules.base.enums.DataTypeAbbr; import org.jeecg.modules.base.enums.XeNuclideName; import org.jeecg.modules.entity.*; @@ -27,7 +21,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.io.*; -import java.text.DecimalFormat; import java.text.ParseException; import java.util.*; import java.util.stream.Collectors; @@ -861,6 +854,49 @@ public class PHDFileUtil extends AbstractLogOrReport { path.append("Spectrum"); path.append(StringPool.SLASH+"Xenon"); path.append(StringPool.SLASH+"Spalax"); + } else if (systemType.contains("C")) { + path.append("Spectrum"); + path.append(StringPool.SLASH+"Xenon"); + path.append(StringPool.SLASH+"Self"); + } + if(dataType.contains("SAMPLEPHD")) { + path.append(StringPool.SLASH+"Samplephd"); + } else if(dataType.contains("DETBKPHD")) { + path.append(StringPool.SLASH+"Detbkphd"); + } else if(dataType.contains("GASBKPHD")) { + path.append(StringPool.SLASH+"Gasbkphd"); + } else if(dataType.contains("QCPHD")) { + path.append(StringPool.SLASH+"Qcphd"); + } + int pos = fileName.indexOf('-'); + if(-1 == pos) { + + } else if(fileName.length() >= pos+7) { + path.append(StringPool.SLASH+fileName.substring(pos+1,pos+5)); + path.append(StringPool.SLASH+fileName.substring(pos+5,pos+7)); + } + path.append(StringPool.SLASH+fileName); + return path.toString(); + }catch (Exception e){ + e.printStackTrace(); + return path.toString(); + } + } + public String NameStandardBy(String fileName, String systemType,String dataType) { + StringBuffer path = new StringBuffer(); + try { + if(systemType.contains("B")) { + path.append("Spectrum"); + path.append(StringPool.SLASH+"Xenon"); + path.append(StringPool.SLASH+"Sauna"); + } else if(systemType.contains("G")) { + path.append("Spectrum"); + path.append(StringPool.SLASH+"Xenon"); + path.append(StringPool.SLASH+"Spalax"); + } else if (systemType.contains("C")) { + path.append("Spectrum"); + path.append(StringPool.SLASH+"Xenon"); + path.append(StringPool.SLASH+"Self"); } if(dataType.contains("SAMPLEPHD")) { path.append(StringPool.SLASH+"Samplephd"); @@ -891,39 +927,44 @@ public class PHDFileUtil extends AbstractLogOrReport { List fileNames = new LinkedList<>(); String station = sampleFileName.substring(0, 9); //连接ftp - FTPClient ftpClient = ftpUtil.LoginFTP(); - if (Objects.isNull(ftpClient)){ - return fileNames; - } +// FTPClient ftpClient = ftpUtil.LoginFTP(); +// if (Objects.isNull(ftpClient)){ +// return fileNames; +// } try { //被动模式 - ftpClient.enterLocalPassiveMode(); - //设置文件类型--二进制文件 - ftpClient.setFileType(FTP.BINARY_FILE_TYPE); - // - ftpClient.setControlEncoding("UTF-8"); - ftpClient.setFileTransferMode(FTPClient.STREAM_TRANSFER_MODE); - //切换文件路径 - ftpClient.changeWorkingDirectory(filePath); - //获取路径下所有文件信息 - List ftpFiles = Arrays.asList(ftpClient.listFiles()); +// ftpClient.enterLocalPassiveMode(); +// //设置文件类型--二进制文件 +// ftpClient.setFileType(FTP.BINARY_FILE_TYPE); +// // +// ftpClient.setControlEncoding("UTF-8"); +// ftpClient.setFileTransferMode(FTPClient.STREAM_TRANSFER_MODE); +// //切换文件路径 +// ftpClient.changeWorkingDirectory(filePath); +// //获取路径下所有文件信息 +// List ftpFiles = Arrays.asList(ftpClient.listFiles()); + File file = new File(filePath); + List ftpFiles = Arrays.asList(file.listFiles()); if (CollectionUtils.isNotEmpty(ftpFiles)){ - fileNames = ftpFiles.stream().filter(item-> item.getName().contains(station)).map(FTPFile::getName).collect(Collectors.toList()); + fileNames = ftpFiles.stream().filter(item-> item.getName().contains(station)).map(File::getName).collect(Collectors.toList()); } - } catch (IOException e) { + } catch (Exception e) { throw new RuntimeException(e); } finally { - try { - ftpClient.disconnect(); - } catch (IOException e) { - throw new RuntimeException(e); - } +// try { +// ftpClient.disconnect(); +// } catch (IOException e) { +// throw new RuntimeException(e); +// } } return fileNames; } public String GetMatchFile(String tmpFileName, List fileNames, String type) { String matchFileName = ""; + if (StringUtils.isBlank(tmpFileName)) { + return matchFileName; + } fileNames = fileNames.stream().filter(item-> item.contains(type)).sorted().collect(Collectors.toList()); //用于比较的字符串 String fileCompare = tmpFileName.substring(0,23); @@ -2735,6 +2776,94 @@ public class PHDFileUtil extends AbstractLogOrReport { return xeResultsViewList; } + /** + * 获取beta刻度校正数据 + * @param gEtoCParam gamma e2c公式参数 + * @param bElectronEnergy beta energy + * @param bEtoCParam beta e2c公式参数 + * @param numGChannel gamma 道址数 + * @param qcStruct + */ + public List getBetaCalibrationCorrection(List gEtoCParam, List bElectronEnergy, + List bEtoCParam, long numGChannel, + EnergySpectrumStruct qcStruct) { + // E_β=661.6-E_γ,E_γ=F(C) + // 中心:C_β=F(E_β),范围:左[C_β-3√(C_β ), C_β+3√(C_β )]右 + // 高斯函数拟合得到拟合的中心道址,显示Energy vs. Channel + // 页面展示的表单数据数组 + List table = new LinkedList<>(); + for (int i = 0; i < bElectronEnergy.size(); i++) { + // 获取beta energy + Double be = bElectronEnergy.get(i); + // energy 转化为 channel + double bc = bEtoCParam.get(0) + bEtoCParam.get(1) * be + bEtoCParam.get(2) * Math.sqrt(be); + // 计算得到gamma energy + Double ge = 661.656 - be; + // gamma energy 转化 channel + double gc = gEtoCParam.get(0) + gEtoCParam.get(1) * ge + gEtoCParam.get(2) * Math.sqrt(ge); + // 通过gamma channel获取gammaGate数据 + List seriseDatas = this.getGammaGated((int) numGChannel, 5, (int) gc, qcStruct); + // 开始计算中心道址, 范围:左[C_β-3√(C_β ), C_β+3√(C_β )]右 + WeightedObservedPoints points = new WeightedObservedPoints(); + double left = bc - Math.cbrt(bc); + double right = bc + Math.cbrt(bc); + int sum = 0; + for (SeriseData f : seriseDatas) { + if(left < f.getX() && right > f.getX()){ + points.add(f.getX(), f.getY()); + sum += f.getX(); + } + } + // todo 高斯拟合有问题,暂时使用平均值 + Double channel = sum / (right - left); + //表单数据信息 + TableWidget tableWidget = new TableWidget(); + tableWidget.setRowCount(i+1); + tableWidget.setChannel(channel); + tableWidget.setEnergy(be); + table.add(tableWidget); + } + return table; + } + /** + * + * @param chartHeight 图形高度 + * @param channelWidth 图形宽度 + * @param gammaChannel gamma道址 + * @param struct qc数据 + * @return + */ + private List getGammaGated(int chartHeight, int channelWidth, int gammaChannel, EnergySpectrumStruct struct){ + List series_data = new LinkedList<>(); + //选择矩形框高度 + int flagHeight = channelWidth * (chartHeight / 256); + int value = Double.valueOf(flagHeight / 2).intValue(); + //计算得到最高值 + int up = gammaChannel - value; + if (up < 0){ + up = 0; + } + //计算得到最低值 + int down = up + value; + if (Objects.nonNull(struct)) { + //Beta-Gamma Spectrum: QC + long bChannels = struct.b_channels; + + List hCounts = struct.h_counts; + for ( int i=0; i < bChannels; ++i ) { + long count = 0; + for (int j = up; j <= down; ++j) { + long index = j * bChannels + i; + count += hCounts.get((int) index); + } + SeriseData temp = new SeriseData(); + temp.setX(i); + temp.setY(count); + series_data.add(temp); + } + } + return series_data; + } } diff --git a/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/service/impl/SpectrumAnalysisServiceImpl.java b/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/service/impl/SpectrumAnalysisServiceImpl.java index 73cf6e48..7598133d 100644 --- a/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/service/impl/SpectrumAnalysisServiceImpl.java +++ b/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/service/impl/SpectrumAnalysisServiceImpl.java @@ -2120,12 +2120,12 @@ public class SpectrumAnalysisServiceImpl extends AbstractLogOrReport implements } map.put("CToE", fittingParaStr); List channel = new LinkedList<>(); - for (int i=0; i<255; ++i) { + for (int i = 0; i < numBChannel - 1; ++i) { channel.add(Double.valueOf(i)); } List energy = EnergySpectrumHandler.GetFileFittingData(channel, fittingPara); List oldLineSeries = new LinkedList<>(); - for (int i=0; i fittingParaToUi = EnergySpectrumHandler.GetFileFittingPara(energy, channel); List fittingParaToUiStr = new LinkedList<>(); - for (Double para:fittingParaToUi) { + for (Double para : fittingParaToUi) { fittingParaToUiStr.add(String.valueOf(para)); } map.put("EToC", fittingParaToUiStr); + // 得到gamma谱 e2c公式 + List gFittingPara = EnergySpectrumHandler.GetFileFittingPara(gEnergy, gCentroidChannel); + map.put("tableWidgets", phdFileUtil.getBetaCalibrationCorrection(gFittingPara, bElectronEnergy, + fittingParaToUi, numGChannel, betaDataFile.getQcStruct())); + //判断人工交互的道值与能量对应参数数组是否为空 if (Objects.nonNull(betaDataFile.getBgPara()) && CollectionUtils.isNotEmpty(betaDataFile.getBetaList())) { //存储计算参数道值