diff --git a/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/common/cache/SelfCache.java b/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/common/cache/SelfCache.java new file mode 100644 index 00000000..1ea4b6d4 --- /dev/null +++ b/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/common/cache/SelfCache.java @@ -0,0 +1,48 @@ +package org.jeecg.common.cache; + +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import org.jeecg.common.properties.DurationProperties; +import org.jeecg.modules.entity.vo.SelfStationData; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.concurrent.TimeUnit; + +@Component +public class SelfCache { + + @Autowired + private DurationProperties durationProperties; + + private Cache selfCache; + + public void initCache() { + selfCache = CacheBuilder.newBuilder() + //设置缓存初始大小,应该合理设置,后续会扩容 + .initialCapacity(10) + //最大值 + .maximumSize(100) + //并发数设置 + .concurrencyLevel(5) + //缓存过期时间,写入后XX小时后过期 + .expireAfterWrite(durationProperties.getCache(), TimeUnit.HOURS) + //统计缓存命中率 + .recordStats() + .build(); + } + + + public Cache getSelfCache() { + return selfCache; + } + + public void setSelfCache(Cache selfCache) { + this.selfCache = selfCache; + } + + public void deleteSelfCache(String key){ + this.selfCache.invalidate(key); + } + +} diff --git a/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/common/util/SelfStationUtil.java b/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/common/util/SelfStationUtil.java new file mode 100644 index 00000000..f01270a1 --- /dev/null +++ b/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/common/util/SelfStationUtil.java @@ -0,0 +1,589 @@ +package org.jeecg.common.util; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.StringPool; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import lombok.extern.slf4j.Slf4j; +import org.jeecg.modules.base.abstracts.AbstractLogOrReport; +import org.jeecg.modules.base.enums.CalName; +import org.jeecg.modules.entity.vo.*; +import org.jeecg.modules.native_jni.CalValuesHandler; +import org.jeecg.modules.native_jni.EnergySpectrumHandler; +import org.jeecg.modules.native_jni.struct.EnergySpectrumStruct; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.io.File; +import java.text.ParseException; +import java.util.*; + +@Component +@Slf4j +public class SelfStationUtil extends AbstractLogOrReport { + + @Autowired + private FTPUtil ftpUtil; + + public void loadFile(SelfStationData selfStationData, Integer sampleId, String status, Map map) { + try { + //读取sample的分析文件内容 + EnergySpectrumStruct struct = selfStationData.getSampleStruct(); + SpectrumData spectrumData = new SpectrumData(); + //封装散点图下的基础数据信息 + //Station Code + String stationCode = struct.site_code; + //Detector Code + String detectorCode = struct.detector_code; + //Data Type + String dataType = struct.data_type; + //Collection Start + Date CollectionStart = null; + if ( StringUtils.isNotBlank(struct.collection_start_date) && StringUtils.isNotBlank(struct.collection_start_time) ){ + CollectionStart = DateUtils.parseDate(struct.collection_start_date + StringPool.SPACE + struct.collection_start_time); + } + //Collection Stop + Date CollectionStop = null; + if ( StringUtils.isNotBlank(struct.collection_stop_date) && StringUtils.isNotBlank(struct.collection_stop_time) ){ + CollectionStop = DateUtils.parseDate(struct.collection_stop_date + StringPool.SPACE + struct.collection_stop_time); + } + //Collection Time + String CollectionTime = ""; + if ( Objects.nonNull(CollectionStart) && Objects.nonNull(CollectionStop) ){ + CollectionTime = String.format ("%.2f",Double.valueOf((CollectionStop.getTime() - CollectionStart.getTime())/ 1000)); + } + //Acquisition Start + Date AcquisitionStart = null; + if ( StringUtils.isNotBlank(struct.acquisition_start_date) && StringUtils.isNotBlank(struct.acquisition_start_time) ){ + AcquisitionStart = DateUtils.parseDate(struct.acquisition_start_date + StringPool.SPACE + struct.acquisition_start_time); + } + //Acq Real Time + double AcquisitionRealTime = struct.acquisition_real_time; + //Acq live Time + double AcquisitionLiveTime = struct.acquisition_live_time; + //Air Volume[m3] + double airVolume = struct.air_volume; + //Xe Volume[m3] + double xeVolume = struct.sample_volume_of_Xe; + //xeCollectionYield + double xeCollectionYield = struct.Xe_collection_yield; + //gasBkMeasurementId + String gasBkMeasurementId = struct.gas_bk_measurement_id; + //detectorBkMeasurementId + String detectorBkMeasurementId = struct.detector_bk_measurement_id; + //measurementId + String measurementId = struct.measurement_id; + spectrumData.setSampleId(sampleId); + spectrumData.setStatus(status); + spectrumData.setStationCode(stationCode); + spectrumData.setDetectorCode(detectorCode); + spectrumData.setDataType(dataType); + spectrumData.setCollectionStart(CollectionStart); + spectrumData.setCollectionStop(CollectionStop); + spectrumData.setCollectionTime(CollectionTime); + spectrumData.setAcquisitionStart(AcquisitionStart); + spectrumData.setAcquisitionRealTime(String.format("%.2f", AcquisitionRealTime)); + spectrumData.setAcquisitionLiveTime(String.format("%.2f", AcquisitionLiveTime)); + spectrumData.setAirVolume(String.format("%.5f", airVolume)); + spectrumData.setXeVolume(String.format("%.5f", xeVolume)); + spectrumData.setYield(xeCollectionYield); + spectrumData.setGasBkMeasurementId(gasBkMeasurementId); + spectrumData.setDetectorBkMeasurementId(detectorBkMeasurementId); + spectrumData.setMeasurementId(measurementId); + map.put("spectrumData", spectrumData); + //根据范围1划分 范围1对应的折线图 + statisticsROIList(struct.POI_B_x1.get(0).intValue(), struct.POI_B_x2.get(0).intValue(), 1, selfStationData); + if ( CollectionUtils.isNotEmpty(selfStationData.getROIOneList()) && Objects.nonNull(selfStationData.getROIOneBetaStart()) + && Objects.nonNull(selfStationData.getROIOneBetaStop()) ) { + map.put("ROIOneList", selfStationData.getROIOneList()); + map.put("ROIOneStart", selfStationData.getROIOneBetaStart()); + map.put("ROIOneStop", selfStationData.getROIOneBetaStop()); + } + //根据范围2划分 范围2对应的折线图 + statisticsROIList(struct.POI_B_x1.get(1).intValue(), struct.POI_B_x2.get(1).intValue(), 2, selfStationData); + if ( CollectionUtils.isNotEmpty(selfStationData.getROITwoList()) && Objects.nonNull(selfStationData.getROITwoBetaStart()) + && Objects.nonNull(selfStationData.getROITwoBetaStop()) ) { + map.put("ROITwoList", selfStationData.getROITwoList()); + map.put("ROITwoStart", selfStationData.getROITwoBetaStart()); + map.put("ROITwoStop", selfStationData.getROITwoBetaStop()); + } + //根据范围3划分 范围3对应的折线图 + statisticsROIList(struct.POI_B_x1.get(2).intValue(), struct.POI_B_x2.get(2).intValue(), 3, selfStationData); + if ( CollectionUtils.isNotEmpty(selfStationData.getROIThreeList()) && Objects.nonNull(selfStationData.getROIThreeBetaStart()) + && Objects.nonNull(selfStationData.getROIThreeBetaStop()) ) { + map.put("ROIThreeList", selfStationData.getROIThreeList()); + map.put("ROIThreeStart", selfStationData.getROIThreeBetaStart()); + map.put("ROIThreeStop", selfStationData.getROIThreeBetaStop()); + } + //根据范围4划分 范围4对应的折线图 + statisticsROIList(struct.POI_B_x1.get(3).intValue(), struct.POI_B_x2.get(3).intValue(), 4, selfStationData); + if ( CollectionUtils.isNotEmpty(selfStationData.getROIFourList()) && Objects.nonNull(selfStationData.getROIFourBetaStart()) + && Objects.nonNull(selfStationData.getROIFourBetaStop()) ) { + map.put("ROIFourList", selfStationData.getROIFourList()); + map.put("ROIFourStart", selfStationData.getROIFourBetaStart()); + map.put("ROIFourStop", selfStationData.getROIFourBetaStop()); + } + //散点图 + //统计散点图 + //横坐标 beta-gamma + long bChannels = struct.b_channels; + //纵坐标 gamma + long gChannels = struct.g_channels; + //值 + List hCounts = struct.h_counts; + List histogramDataList = new LinkedList<>(); + List histogramDataDList = new LinkedList<>(); + for (int i=0; i 0){ + HistogramData his = new HistogramData(); + his.setG(i); + his.setB(j); + his.setC(count); + histogramDataList.add(his); + histogramDataDList.add(his); + }else { + HistogramData his = new HistogramData(); + his.setG(i); + his.setB(j); + his.setC(count); + histogramDataDList.add(his); + } + } + } + map.put("histogramDataList", histogramDataList); +// map.put("histogramDataDList", histogramDataDList); + //gamma能量部分的计算参数 道值 + List gCentroidChannel = struct.g_centroid_channel; + //gamma能量部分的计算参数 道值对应能量 + List gEnergy = struct.g_energy; + //调用算法 传入道值和道值对应的能量 得到计算gamma能量公式的参数 + List gammaParam = EnergySpectrumHandler.GetFileFittingPara(gCentroidChannel, gEnergy); + //存储需要计算gamma能量的道值 + List gchannels = new ArrayList<>(); + for (int i=0; i gammaEnergyList = EnergySpectrumHandler.GetFileFittingData(gchannels, gammaParam); + //将gamma能量折线图进行赋值返回 + map.put("gammaEnergyData", gammaEnergyList); + //beta能量部分的计算参数 道值 + List bChannel = struct.b_channel; + //beta能量部分的计算参数 道值对应的能量 + List bElectronEnergy = struct.b_electron_energy; + //调用算法 传入道值和道值对应的能量 得到计算beta能量公式的参数 + List betaParam = EnergySpectrumHandler.GetFileFittingPara(bChannel, bElectronEnergy); + List bchannels = new ArrayList<>(); + for (int i=0; i betaEnergyList = EnergySpectrumHandler.GetFileFittingData(bchannels, betaParam); + //将beta能量折线图进行赋值返回 + map.put("betaEnergyData", betaEnergyList); + + //g_Energy + if (CollectionUtils.isNotEmpty(struct.g_energy) && CollectionUtils.isNotEmpty(struct.g_centroid_channel) && CollectionUtils.isNotEmpty(struct.g_uncertainty) && Objects.nonNull(struct.g_record_count)) { + GEnergyBlock gEnergyBlock = new GEnergyBlock(); + gEnergyBlock.setG_energy(struct.g_energy); + gEnergyBlock.setCentroid_channel(struct.g_centroid_channel); + gEnergyBlock.setUncertainty(struct.g_uncertainty); + gEnergyBlock.setRecord_count(struct.g_record_count); + selfStationData.getMapEnerKD().put(CalName.CalPHD.getType(), gEnergyBlock); + //计算得到公式的参数 + List calEnergyParam = CalValuesHandler.calFitPara("Cal_Energy", 2, struct.g_centroid_channel, struct.g_energy, struct.g_uncertainty); + ParameterInfo parameterInfo = new ParameterInfo(); + parameterInfo.setP(calEnergyParam); + selfStationData.getMapEnerPara().put(CalName.CalPHD.getType(), parameterInfo); + } + //g_Resolution + if (CollectionUtils.isNotEmpty(struct.g_r_energy) && CollectionUtils.isNotEmpty(struct.g_r_FWHM) && CollectionUtils.isNotEmpty(struct.g_r_uncertainty) && Objects.nonNull(struct.g_r_record_count)) { + GResolutionBlock gResolutionBlock = new GResolutionBlock(); + gResolutionBlock.setG_energy(struct.g_r_energy); + gResolutionBlock.setFWHM(struct.g_r_FWHM); + gResolutionBlock.setUncertainty(struct.g_r_uncertainty); + gResolutionBlock.setRecord_count(struct.g_r_record_count); + selfStationData.getMapResoKD().put(CalName.CalPHD.getType(), gResolutionBlock); + //计算得到公式的参数 + List calEnergyParam = CalValuesHandler.calFitPara("Cal_Resolution", 4, struct.g_r_energy, struct.g_r_FWHM, struct.g_r_uncertainty); + ParameterInfo parameterInfo = new ParameterInfo(); + parameterInfo.setP(calEnergyParam); + selfStationData.getMapResoPara().put(CalName.CalPHD.getType(), parameterInfo); + } + //g_Efficiency + if (CollectionUtils.isNotEmpty(struct.g_e_energy) && CollectionUtils.isNotEmpty(struct.g_e_efficiency) && CollectionUtils.isNotEmpty(struct.g_e_uncertainty) && Objects.nonNull(struct.g_e_record_count)) { + GEfficiencyBlock gEfficiencyBlock = new GEfficiencyBlock(); + gEfficiencyBlock.setG_energy(struct.g_e_energy); + gEfficiencyBlock.setEfficiency(struct.g_e_efficiency); + gEfficiencyBlock.setUncertainty(struct.g_e_uncertainty); + gEfficiencyBlock.setRecord_count(struct.g_e_record_count); + selfStationData.getMapEffiKD().put(CalName.CalPHD.getType(), gEfficiencyBlock); + //计算得到公式的参数 + List calEnergyParam = CalValuesHandler.calFitPara("Cal_Efficiency", 1, struct.g_e_energy, struct.g_e_efficiency, struct.g_e_uncertainty); + ParameterInfo parameterInfo = new ParameterInfo(); + parameterInfo.setP(calEnergyParam); + selfStationData.getMapEffiPara().put(CalName.CalPHD.getType(), parameterInfo); + } + + } catch (ParseException e) { + throw new RuntimeException(e); + } + + } + + /** + * 根据文件路径,类型获取对应的解析文件内容并返回进行存储 + * @param filePathName + * @param type + * @param selfStationData + * @return + */ + public EnergySpectrumStruct getSourceData(String filePathName, String type, SelfStationData selfStationData) { + EnergySpectrumStruct struct = null; + File file = null; + try { + //根据完整的文件路径 获取临时文件 + file = ftpUtil.downloadFile(filePathName, "betaGamma"); + if (Objects.nonNull(file)) { + if (type.equalsIgnoreCase("sample")) { + selfStationData.setSampleTmpPath(file.getAbsolutePath()); + } else if (type.equalsIgnoreCase("det")) { + selfStationData.setDetTmpPath(file.getAbsolutePath()); + } + //解析文件内容 + struct = EnergySpectrumHandler.getSourceData(file.getAbsolutePath()); + } + } catch (Exception e) { + e.printStackTrace(); + } + return struct; + } + + /** + * 统计道值范围内数量 + * @param startChannel 起始道值 + * @param endChannel 结束道值 + * @param num 第几个范围 + * @param selfStationData 自建台站对象 + */ + public void statisticsROIList(Integer startChannel, Integer endChannel, Integer num, SelfStationData selfStationData) { + EnergySpectrumStruct struct = selfStationData.getSampleStruct(); + //获取总行数信息 + long betaChannels = struct.b_channels; + //获取总列数信息 + long gammaChannels = struct.g_channels; + //获取散点图数量信息 + List h_counts = struct.h_counts; + //存储同一列不同行加和后的数量 + List sumList = new LinkedList<>(); + List seriseDataList = new LinkedList<>(); + //遍历所有列 + for (int i=0; i= 2 && m_curParam.getP().get(2) > 0) { + // Polynomial: y=a0+a1*x+a2*x^2+a3*x^3 + equation +="Energy = "+NumberFormatUtil.numberFormat(String.valueOf(m_curParam.getP().get(1)))+" + C * "+NumberFormatUtil.numberFormat(String.valueOf(m_curParam.getP().get(2))); + for(int i=3; i<=p_size; i++) { + equation += " + C" + (i-1) +" * "+NumberFormatUtil.numberFormat(String.valueOf(m_curParam.getP().get(i)))+""; + } + } else if(p_size == 1) { + equation = "Energy = "+NumberFormatUtil.numberFormat(String.valueOf(m_curParam.getP().get(1)))+" * C"; + } + return equation; + } + + public void UpdateChartEnergy(List m_vCurEnergy, ParameterInfo m_curParam, List m_vCurCentroid, SelfStationData selfStationData, Double width, Map map) { + int num = m_vCurEnergy.size(); + if(num < 1){ + return; + } + List datalist = new LinkedList<>(); + if(CollectionUtils.isNotEmpty(m_curParam.getP())) { + // 拟合曲线 + ChartData lData = new ChartData(); + lData.setColor("rgb(255, 255, 0)"); + lData.setType("Line"); + + List vChan = new LinkedList<>(); + double MaxChan = Double.valueOf(selfStationData.getSampleStruct().g_channels); + double d = 1; + double dStep = MaxChan / width * 2; + while(d < MaxChan) { + vChan.add(d); + d+= dStep; + } + vChan.add(MaxChan); + + List vFit = CalValuesHandler.calFcnEval(vChan, m_curParam.getP()).counts; + for(int i=0; i 0){ + SeriseData seriseData = new SeriseData(); + seriseData.setX(vChan.get(i)); + seriseData.setY(vFit.get(i)); + lData.getPointlist().add(seriseData); + } + } + if(lData.getPointlist().size() > 1){ + datalist.add(lData); + } + } + + // Channel——Energy 点集 + ChartData pData = new ChartData(); + pData.setColor("red"); + pData.setType("Scatter"); + for(int i=0; i= 2 && m_curParam.getP().get(1) > 0 && m_curParam.getP().get(2) > 0) { + // Square root of polynomial: y = sqrt(a0+a1*x+a2*x^2+a3*x^3 ) + equation += "FWHM = ("+NumberFormatUtil.numberFormat(String.valueOf(m_curParam.getP().get(1)))+" + E * "+NumberFormatUtil.numberFormat(String.valueOf(m_curParam.getP().get(2))); + for(int i=3; i<=p_size; i++) { + equation += " + E"+(i-1)+" * "+NumberFormatUtil.numberFormat(String.valueOf(m_curParam.getP().get(i))); + } + equation += ")"+1+"/"+2+""; + } + return equation; + } + + public void UpdateChartResolution(List m_vCurEnergy, ParameterInfo m_curParam, List m_vCurReso, SelfStationData selfStationData, Double width, Map map) { + int num = m_vCurEnergy.size(); + if(num < 1) return; + + List datalist = new LinkedList<>(); + if(CollectionUtils.isNotEmpty(m_curParam.getP())) { + // 拟合曲线 + ChartData lData = new ChartData(); + lData.setColor("rgb(255, 255, 0)"); + lData.setType("Line"); + + List vChan = new LinkedList<>(); + vChan.add(1.0); + vChan.add(Double.valueOf(selfStationData.getSampleStruct().g_channels)); + + List vEner = CalValuesHandler.calFcnEval(vChan, selfStationData.getUsedEnerPara().getP()).counts; + double d = vEner.get(0), maxE = vEner.get(1); + double dStep = maxE / width * 2; + + vEner.remove(vEner.size()-1); + while(d < maxE) { + vEner.add(d); + d += dStep; + } + vEner.add(maxE); + + List vFit = CalValuesHandler.calFcnEval(vEner, m_curParam.getP()).counts; + for(int i=0; i 0){ + SeriseData seriseData = new SeriseData(); + seriseData.setX(vEner.get(i)); + seriseData.setY(vFit.get(i)); + lData.getPointlist().add(seriseData); + } + } + if(lData.getPointlist().size() > 1){ + datalist.add(lData); + } + } + + // Channel——Energy 点集 + ChartData pData = new ChartData(); + pData.setColor("red"); + pData.setType("Scatter"); + for(int i=0; i m_vCurEnergy, ParameterInfo m_curParam, Integer curRow, Integer funId) { + String equation = ""; + if(m_curParam.getP().size() > 2) { + int p_size = m_curParam.getP().size()-1; + int e_size = m_vCurEnergy.size(); + if (Objects.isNull(funId)) { + funId = m_curParam.getP().get(0).intValue(); + } + switch(funId) { + case 1: // Interpolation: y=yi+(y(i+1)-yi)*(x-xi)/(x(i+1)-xi) for xi<=x= 4) { + int i = curRow; + if(i < 0 || i >= e_size) break; + + double y1, y0, x1, x0; + if(i < e_size - 1) + { + y1 = Double.valueOf(NumberFormatUtil.numberFormat(String.valueOf(m_curParam.getP().get(i*2+3)))); + y0 = Double.valueOf(NumberFormatUtil.numberFormat(String.valueOf(m_curParam.getP().get(i*2+1)))); + x1 = Double.valueOf(NumberFormatUtil.numberFormat(String.valueOf(m_curParam.getP().get(i*2+2)))); + x0 = Double.valueOf(NumberFormatUtil.numberFormat(String.valueOf(m_curParam.getP().get(i*2)))); + } else { + y1 = Double.valueOf(NumberFormatUtil.numberFormat(String.valueOf(m_curParam.getP().get(i*2+1)))); + y0 = Double.valueOf(NumberFormatUtil.numberFormat(String.valueOf(m_curParam.getP().get(i*2-1)))); + x1 = Double.valueOf(NumberFormatUtil.numberFormat(String.valueOf(m_curParam.getP().get(i*2)))); + x0 = Double.valueOf(NumberFormatUtil.numberFormat(String.valueOf(m_curParam.getP().get(i*2-2)))); + } + equation += "Efficiency = "+y0+" + ("+y1+"-"+y0+") * (E - "+x0+") / ("+x1+" - "+x0+")"; + } + break; + case 5: // HT Efficiency: y = A*exp(-(E1/x)^k)*(1-exp(-(E2/x)^n)) + if(p_size == 5) { + for(int i=1; i<=p_size; i++) { + if(m_curParam.getP().get(i) <= 0) break; + } + equation += "Efficiency = "+NumberFormatUtil.numberFormat(String.valueOf(m_curParam.getP().get(1)))+" * exp(-("+NumberFormatUtil.numberFormat(String.valueOf(m_curParam.getP().get(2)))+" / E)"+NumberFormatUtil.numberFormat(String.valueOf(m_curParam.getP().get(3)))+") * "+ + "(1-exp(-("+NumberFormatUtil.numberFormat(String.valueOf(m_curParam.getP().get(4)))+" / E)"+NumberFormatUtil.numberFormat(String.valueOf(m_curParam.getP().get(5)))+"))"; + } + break; + case 6: // Polynomial in log(y) against log(x): log(y) = a0 + a1*log(x) +a2*log(x)^2+ a3*log(x)^3 + if(p_size >= 2) { + equation += "log(Efficiency) = "+NumberFormatUtil.numberFormat(String.valueOf(m_curParam.getP().get(1)))+" + "+NumberFormatUtil.numberFormat(String.valueOf(m_curParam.getP().get(2)))+" * log(E)"; + for(int i=3; i<=p_size; i++) { + equation += " + "+NumberFormatUtil.numberFormat(String.valueOf(m_curParam.getP().get(i)))+" * log(E)"+(i-1)+""; + } + } + break; + case 8: // Polynomial in log(y) against log(1/x): log(y) = a0 + a1*log(c/x) + a2*log(c/x)^2 + a3*log(c/x)^3 + a4*log(c/x)^4 + if(p_size >= 3) { + equation += "log(Efficiency) = "+NumberFormatUtil.numberFormat(String.valueOf(m_curParam.getP().get(1)))+" + "+NumberFormatUtil.numberFormat(String.valueOf(m_curParam.getP().get(2)))+" * log(C/E)"; + for(int i=3; i<=p_size; i++) { + equation += " + "+NumberFormatUtil.numberFormat(String.valueOf(m_curParam.getP().get(i)))+" * log(C/E)"+(i-1)+""; + } + } + break; + case 93: // HAE Efficiency (1-3): y=S*exp(-(E1/x)^k)*(1- exp(-(2*E3/(x-E3))^n)) + if(p_size == 5) { + equation += "Efficiency = "+NumberFormatUtil.numberFormat(String.valueOf(m_curParam.getP().get(1)))+" * exp(-("+NumberFormatUtil.numberFormat(String.valueOf(m_curParam.getP().get(2)))+" / E)"+NumberFormatUtil.numberFormat(String.valueOf(m_curParam.getP().get(3)))+") * "+ + "(1 - exp(-(2 * "+NumberFormatUtil.numberFormat(String.valueOf(m_curParam.getP().get(4)))+" / (E - "+NumberFormatUtil.numberFormat(String.valueOf(m_curParam.getP().get(4)))+"))"+NumberFormatUtil.numberFormat(String.valueOf(m_curParam.getP().get(5)))+"))"; + } + break; + case 94: // HAE Efficiency (1-2): y=S*exp(-(E1/x)^k)*(1- exp(-b*(1/(x-E2))^m)) + if(p_size == 6) { + equation += "Efficiency = "+NumberFormatUtil.numberFormat(String.valueOf(m_curParam.getP().get(1)))+" * exp(-("+NumberFormatUtil.numberFormat(String.valueOf(m_curParam.getP().get(2)))+" / E)"+NumberFormatUtil.numberFormat(String.valueOf(m_curParam.getP().get(3)))+") * "+ + "(1 - exp(-"+NumberFormatUtil.numberFormat(String.valueOf(m_curParam.getP().get(4)))+" * (1 / (E - "+NumberFormatUtil.numberFormat(String.valueOf(m_curParam.getP().get(5)))+"))"+NumberFormatUtil.numberFormat(String.valueOf(m_curParam.getP().get(6)))+"))"; + } + break; + case 95: // HAE Efficiency (1-2-3): y = S * exp(-(E1/x)^k) * (1- exp(-b*(1/(x-E2))^m)) *(1 - exp(-(2*E3/(E-E3))^n)) + if(p_size == 8) { + equation += "Efficiency = "+NumberFormatUtil.numberFormat(String.valueOf(m_curParam.getP().get(1)))+" * exp(-("+NumberFormatUtil.numberFormat(String.valueOf(m_curParam.getP().get(2)))+" / E)"+NumberFormatUtil.numberFormat(String.valueOf(m_curParam.getP().get(3)))+") * "+ + "(1 - exp(-"+NumberFormatUtil.numberFormat(String.valueOf(m_curParam.getP().get(4)))+" * (1 / (E - "+NumberFormatUtil.numberFormat(String.valueOf(m_curParam.getP().get(5)))+"))"+NumberFormatUtil.numberFormat(String.valueOf(m_curParam.getP().get(6)))+")) * "+ + "(1 - exp(-(2 * "+NumberFormatUtil.numberFormat(String.valueOf(m_curParam.getP().get(7)))+" / (E - "+NumberFormatUtil.numberFormat(String.valueOf(m_curParam.getP().get(7)))+"))"+NumberFormatUtil.numberFormat(String.valueOf(m_curParam.getP().get(8)))+"))"; + } + break; + } + } + return equation; + } + + public void UpdateChartEfficiency(List m_vCurEnergy, ParameterInfo m_curParam, List m_vCurEffi, SelfStationData selfStationData, Double width, Map map) { + int num = m_vCurEnergy.size(); + if(num < 1) return; + + List datalist = new LinkedList<>(); + if(CollectionUtils.isNotEmpty(m_curParam.getP())) { + // 拟合曲线 + ChartData lData = new ChartData(); + lData.setColor("rgb(255, 255, 0)"); + lData.setType("Line"); + + List vChan = new LinkedList<>(); + vChan.add(1.0); + vChan.add(Double.valueOf(selfStationData.getSampleStruct().g_channels)); + + List vEner = CalValuesHandler.calFcnEval(vChan, selfStationData.getUsedEnerPara().getP()).counts; + double d = vEner.get(0); + double maxE = vEner.get(1); + double dStep = maxE / width * 2; + + vEner.remove(vEner.size()-1); + while(d < maxE) { + vEner.add(d); + d += dStep; + } + vEner.add(maxE); + + List vFit = CalValuesHandler.calFcnEval(vEner, m_curParam.getP()).counts; + for(int i=0; i 0){ + SeriseData seriseData = new SeriseData(); + seriseData.setX(vEner.get(i)); + seriseData.setY(vFit.get(i)); + lData.getPointlist().add(seriseData); + } + } + if(lData.getPointlist().size() > 1){ + datalist.add(lData); + } + } + + // Channel——Energy 点集 + ChartData pData = new ChartData(); + pData.setColor("red"); + pData.setType("Scatter"); + for(int i=0; i calParam; + + /** + * ROI-1结果数据 + */ + //折线图横纵坐标数组 + private List ROIOneList; + //ROI-1范围矩形框起始道值 + private Integer ROIOneBetaStart; + //ROI-1范围矩形框终止道值 + private Integer ROIOneBetaStop; + + /** + * ROI-2结果数据 + */ + //折线图横纵坐标数组 + private List ROITwoList; + //ROI-2范围矩形框起始道值 + private Integer ROITwoBetaStart; + //ROI-2范围矩形框终止道值 + private Integer ROITwoBetaStop; + + /** + * ROI-3结果数据 + */ + //折线图横纵坐标数组 + private List ROIThreeList; + //ROI-3范围矩形框起始道值 + private Integer ROIThreeBetaStart; + //ROI-3范围矩形框终止道值 + private Integer ROIThreeBetaStop; + + /** + * ROI-4结果数据 + */ + //折线图横纵坐标数组 + private List ROIFourList; + //ROI-4范围矩形框起始道值 + private Integer ROIFourBetaStart; + //ROI-4范围矩形框终止道值 + private Integer ROIFourBetaStop; + + // 当前修改的刻度名称 + private String newEner; + + private String newReso; + + private String newEffi; + + /** + * 使用中的能量参数对应的刻度名称 + */ + private String usedEner; + + private String usedReso; + + private String usedEffi; + + // 当前寻峰结果所用的刻度数据 + private GEnergyBlock usedEnerKD; + + private GResolutionBlock usedResoKD; + + private GEfficiencyBlock usedEffiKD; + + // 存储所有的刻度数据 + private Map mapEnerKD; // 能量刻度 + + private Map mapResoKD; // 分辨率刻度 + + private Map mapEffiKD; // 效率刻度 + + // 当前寻峰结果所用的刻度参数 + private ParameterInfo usedEnerPara; + + private ParameterInfo usedResoPara; + + private ParameterInfo usedEffiPara; + + // 存储所有的刻度参数 + private Map mapEnerPara; + + private Map mapResoPara; + + private Map mapEffiPara; + + public SelfStationData() { + newEner = "PHD"; + newReso = "PHD"; + newEffi = "PHD"; + usedEner= ""; + usedReso= ""; + usedEffi= ""; + mapEnerKD = new HashMap<>(); + mapResoKD = new HashMap<>(); + mapEffiKD = new HashMap<>(); + usedEnerPara = new ParameterInfo(); + usedResoPara = new ParameterInfo(); + usedEffiPara = new ParameterInfo(); + mapEnerPara = new HashMap<>(); + mapResoPara = new HashMap<>(); + mapEffiPara = new HashMap<>(); + } + +} diff --git a/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/service/ISelfStationService.java b/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/service/ISelfStationService.java new file mode 100644 index 00000000..5571554c --- /dev/null +++ b/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/service/ISelfStationService.java @@ -0,0 +1,53 @@ +package org.jeecg.modules.service; + +import org.jeecg.common.api.vo.Result; +import org.jeecg.modules.entity.vo.ParameterInfo; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +public interface ISelfStationService { + + Result loadSelfStationByFile(String sampleFileName, String detFileName, HttpServletRequest request); + + Result updateROI(Integer startChannel, Integer endChannel, Integer ROINum, String sampleFileName, HttpServletRequest request); + + Result energyCalibration(String fileName, String currentText, Double width, HttpServletRequest request); + + Result changeDataEnergy(List m_vCurCentroid, List m_vCurEnergy, List m_vCurUncert, ParameterInfo m_curParam, Integer sampleId, String fileName, Double width, HttpServletRequest request); + + Result applyDataEnergy(List m_vCurCentroid, List m_vCurEnergy, List m_vCurUncert, ParameterInfo m_curParam, String curCalName, Integer sampleId, String fileName, HttpServletRequest request); + + void saveDataEnergy(List m_vCurCentroid, List m_vCurEnergy, List m_vCurUncert, HttpServletResponse response); + + Result callDataEnergy(MultipartFile file, String sampleFileName, Double width, String currentText, HttpServletRequest request); + + Result setCurrentEnergy(String fileName, String currentName, HttpServletRequest request); + + Result resolutionCalibration(String fileName, String currentText, Double width, HttpServletRequest request); + + Result changeDataResolution(List m_vCurReso, List m_vCurEnergy, List m_vCurUncert, ParameterInfo m_curParam, Integer sampleId, String fileName, Double width, HttpServletRequest request); + + Result applyDataResolution(List m_vCurReso, List m_vCurEnergy, List m_vCurUncert, ParameterInfo m_curParam, String curCalName, Integer sampleId, String fileName, HttpServletRequest request); + + void saveDataResolution(List m_vCurReso, List m_vCurEnergy, List m_vCurUncert, HttpServletResponse response); + + Result callDataResolution(MultipartFile file, String sampleFileName, Double width, String currentText, HttpServletRequest request); + + Result setCurrentResolution(String fileName, String currentName, HttpServletRequest request); + + Result EfficiencyCalibration(String fileName, String currentText, Double width, HttpServletRequest request); + + Result changeDataEfficiency(List m_vCurEffi, List m_vCurEnergy, List m_vCurUncert, ParameterInfo m_curParam, Integer funcId, Integer sampleId, String fileName, Double width, Integer curRow, HttpServletRequest request); + + Result applyDataEfficiency(List m_vCurEffi, List m_vCurEnergy, List m_vCurUncert, ParameterInfo m_curParam, String curCalName, Integer sampleId, String fileName, HttpServletRequest request); + + void saveDataEfficiency(List m_vCurEffi, List m_vCurEnergy, List m_vCurUncert, Integer funId, HttpServletResponse response); + + Result callDataEfficiency(MultipartFile file, String sampleFileName, Double width, String currentText, HttpServletRequest request); + + Result setCurrentEfficiency(String fileName, String currentName, HttpServletRequest request); + +} diff --git a/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/service/impl/SelfStationServiceImpl.java b/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/service/impl/SelfStationServiceImpl.java new file mode 100644 index 00000000..2e701ad5 --- /dev/null +++ b/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/service/impl/SelfStationServiceImpl.java @@ -0,0 +1,1008 @@ +package org.jeecg.modules.service.impl; + +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.jeecg.common.api.vo.Result; +import org.jeecg.common.cache.SelfCache; +import org.jeecg.common.properties.SpectrumPathProperties; +import org.jeecg.common.system.util.JwtUtil; +import org.jeecg.common.util.FTPUtil; +import org.jeecg.common.util.PHDFileUtil; +import org.jeecg.common.util.SelfStationUtil; +import org.jeecg.modules.entity.vo.*; +import org.jeecg.modules.native_jni.CalValuesHandler; +import org.jeecg.modules.native_jni.EnergySpectrumHandler; +import org.jeecg.modules.native_jni.struct.EnergySpectrumStruct; +import org.jeecg.modules.service.ISelfStationService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.net.URLEncoder; +import java.util.*; +import java.util.stream.Collectors; + +@Service +public class SelfStationServiceImpl implements ISelfStationService { + + @Autowired + private FTPUtil ftpUtil; + @Autowired + private SpectrumPathProperties spectrumPathProperties; + @Autowired + private SelfStationUtil selfStationUtil; + @Autowired + private SelfCache selfStationCache; + + @Override + public Result loadSelfStationByFile(String sampleFileName, String detFileName, HttpServletRequest request) { + Result result = new Result(); + //返回结果map + Map map = new HashMap<>(); + //获取用户名 + String userName = JwtUtil.getUserNameByToken(request); + //解析文件 + //上传文件路径 + String path = StringPool.SLASH + ftpUtil.getFtpRootPath() + spectrumPathProperties.getUploadPath() + StringPool.SLASH + userName; + //获取自建台站缓存信息 + Cache selfCache = selfStationCache.getSelfCache(); + SelfStationData selfStationData = selfCache.getIfPresent(sampleFileName + StringPool.DASH + userName); + //判断缓存是否为空 + if (Objects.isNull(selfStationData)) { + //初始化自建台站数据对象 + selfStationData = new SelfStationData(); + //判断sample文件名是否为空 + if (StringUtils.isNotBlank(sampleFileName)) { + //拼接sample文件路径 + String sampleFilePath = path + StringPool.SLASH + sampleFileName; + //获取sample分析后的对象 + EnergySpectrumStruct struct = selfStationUtil.getSourceData(sampleFilePath, "sample", selfStationData); + selfStationData.setSampleStruct(struct); + selfStationUtil.loadFile(selfStationData, null, null, map); + } + //判断det文件名是否为空 + if (StringUtils.isNotBlank(detFileName)) { + //拼接det文件路径 + String detFilePath = path + StringPool.SLASH + detFileName; + //获取sample分析后的对象 + EnergySpectrumStruct struct = selfStationUtil.getSourceData(detFilePath, "det", selfStationData); + selfStationData.setDetStruct(struct); + } + } + //将自建台站的数据封装到缓存对象中 + selfCache.put(sampleFileName + StringPool.DASH + userName, selfStationData); + //将缓存对象存入到缓存中 + selfStationCache.setSelfCache(selfCache); + //将返回内容存入返回对象中 + result.setSuccess(true); + result.setResult(map); + return result; + } + + @Override + public Result updateROI(Integer startChannel, Integer endChannel, Integer ROINum, String sampleFileName, HttpServletRequest request) { + Result result = new Result(); + Map map = new HashMap<>(); + //获取用户名 + String userName = JwtUtil.getUserNameByToken(request); + //读取自建台站缓存 + Cache selfCache = selfStationCache.getSelfCache(); + //获取缓存的当前谱对应的数据 + SelfStationData selfStationData = selfCache.getIfPresent(sampleFileName + StringPool.DASH + userName); + if (Objects.isNull(selfStationData)) { + result.error500("Load basic file information first!"); + return result; + } + selfStationUtil.statisticsROIList(startChannel, endChannel, ROINum,selfStationData); + if (1 == ROINum) { + if ( CollectionUtils.isNotEmpty(selfStationData.getROIOneList()) && Objects.nonNull(selfStationData.getROIOneBetaStart()) + && Objects.nonNull(selfStationData.getROIOneBetaStop()) ) { + map.put("ROIOneList", selfStationData.getROIOneList()); + map.put("ROIOneStart", selfStationData.getROIOneBetaStart()); + map.put("ROIOneStop", selfStationData.getROIOneBetaStop()); + } + } else if (2 == ROINum) { + if ( CollectionUtils.isNotEmpty(selfStationData.getROITwoList()) && Objects.nonNull(selfStationData.getROITwoBetaStart()) + && Objects.nonNull(selfStationData.getROITwoBetaStop()) ) { + map.put("ROITwoList", selfStationData.getROITwoList()); + map.put("ROITwoStart", selfStationData.getROITwoBetaStart()); + map.put("ROITwoStop", selfStationData.getROITwoBetaStop()); + } + } else if (3 == ROINum) { + if ( CollectionUtils.isNotEmpty(selfStationData.getROIThreeList()) && Objects.nonNull(selfStationData.getROIThreeBetaStart()) + && Objects.nonNull(selfStationData.getROIThreeBetaStop()) ) { + map.put("ROIThreeList", selfStationData.getROIThreeList()); + map.put("ROIThreeStart", selfStationData.getROIThreeBetaStart()); + map.put("ROIThreeStop", selfStationData.getROIThreeBetaStop()); + } + } else if (4 == ROINum) { + if ( CollectionUtils.isNotEmpty(selfStationData.getROIFourList()) && Objects.nonNull(selfStationData.getROIFourBetaStart()) + && Objects.nonNull(selfStationData.getROIFourBetaStop()) ) { + map.put("ROIFourList", selfStationData.getROIFourList()); + map.put("ROIFourStart", selfStationData.getROIFourBetaStart()); + map.put("ROIFourStop", selfStationData.getROIFourBetaStop()); + } + } + result.setSuccess(true); + result.setResult(map); + return result; + } + + @Override + public Result energyCalibration(String fileName, String currentText, Double width, HttpServletRequest request) { + Result result = new Result(); + //获取用户名 + String userName = JwtUtil.getUserNameByToken(request); + Map map = new HashMap<>(); + //获取缓存 + Cache selfCache = selfStationCache.getSelfCache(); + SelfStationData selfStationData = selfCache.getIfPresent(fileName + StringPool.DASH + userName); + if (Objects.isNull(selfStationData)) { + result.error500("Please select the parse file first!"); + return result; + } + if (StringUtils.isBlank(currentText)) { + currentText = selfStationData.getUsedEner(); + } + List dataSourceList = selfStationData.getMapEnerKD().keySet().stream().collect(Collectors.toList()); + map.put("list_dataSource", dataSourceList); + if (StringUtils.isNotBlank(currentText)) { + map.put("currentText", currentText); + List m_vCurCentroid = selfStationData.getMapEnerKD().get(currentText).getCentroid_channel(); + List m_vCurEnergy = selfStationData.getMapEnerKD().get(currentText).getG_energy(); + List m_vCurUncert = selfStationData.getMapEnerKD().get(currentText).getUncertainty(); + map.put("uncert", m_vCurUncert); + ParameterInfo m_curParam = selfStationData.getMapEnerPara().get(currentText); + if (Objects.isNull(m_curParam)) { + m_curParam = new ParameterInfo(); + } + map.put("param", m_curParam); + int num = m_vCurEnergy.size(); + if (num < 1) { + return result; + } + List vFit = CalValuesHandler.calFcnEval(m_vCurCentroid, m_curParam.getP()).counts; + List energyDataList = new LinkedList<>(); + for (int i = 0; i < num; ++i) { + EnergyData energyData = new EnergyData(); + double delta = (m_vCurEnergy.get(i) - vFit.get(i)) / m_vCurEnergy.get(i) * 100; + energyData.setChannel(String.valueOf(m_vCurCentroid.get(i))); + energyData.setEnergy(String.valueOf(m_vCurEnergy.get(i))); + energyData.setFit(String.format("%.3f", vFit.get(i))); + energyData.setDelta(String.format("%.3f", delta)); + energyDataList.add(energyData); + } + map.put("table", energyDataList); + String equation = selfStationUtil.UpdateEquationEnergy(m_curParam); + map.put("equation", equation); + selfStationUtil.UpdateChartEnergy(m_vCurEnergy, m_curParam, m_vCurCentroid, selfStationData, width, map); + } + result.setSuccess(true); + result.setResult(map); + return result; + } + + @Override + public Result changeDataEnergy(List m_vCurCentroid, List m_vCurEnergy, List m_vCurUncert, ParameterInfo m_curParam, Integer sampleId, String fileName, Double width, HttpServletRequest request) { + Result result = new Result(); + //获取用户名 + String userName = JwtUtil.getUserNameByToken(request); + Map map = new HashMap<>(); + //加载缓存 + Cache selfCache = selfStationCache.getSelfCache(); + SelfStationData selfStationData = selfCache.getIfPresent(fileName + StringPool.DASH + userName); + if (Objects.isNull(selfCache)) { + result.error500("Please select the parse file first!"); + return result; + } + DataChangeEnergy(m_vCurCentroid, m_vCurEnergy, m_vCurUncert, m_curParam, selfStationData, width, map); + result.setSuccess(true); + result.setResult(map); + return result; + } + + private void DataChangeEnergy(List m_vCurCentroid, List m_vCurEnergy, List m_vCurUncert, ParameterInfo m_curParam, SelfStationData selfStationData, Double width, Map map) { + if (m_vCurEnergy.size() < 1) { + return; + } else if (m_vCurEnergy.size() == 1) { + for (int j = m_curParam.getP().size(); j < 2; j++) { + m_curParam.getP().add(2.0); + } + m_curParam.getP().set(1, (m_vCurEnergy.get(0) / m_vCurCentroid.get(0))); + for (int j = m_curParam.getPerr().size(); j < 2; j++) { + m_curParam.getPerr().add(0.0); + } + } else { + m_curParam.setP(CalValuesHandler.calFitPara("Cal_Energy", 2, m_vCurCentroid, m_vCurEnergy, m_vCurUncert)); + } + map.put("uncert", m_vCurUncert); + map.put("param", m_curParam); + List energyDataList = new LinkedList<>(); + if (CollectionUtils.isNotEmpty(m_curParam.getP())) { + List vFit = CalValuesHandler.calFcnEval(m_vCurCentroid, m_curParam.getP()).counts; + for (int j = 0; j < m_vCurEnergy.size(); j++) { + EnergyData energyData = new EnergyData(); + double delta = (m_vCurEnergy.get(j) - vFit.get(j)) / m_vCurEnergy.get(j) * 100; + energyData.setChannel(String.valueOf(m_vCurCentroid.get(j))); + energyData.setEnergy(String.valueOf(m_vCurEnergy.get(j))); + energyData.setFit(String.format("%.3f", vFit.get(j))); + energyData.setDelta(String.format("%.3f", delta)); + energyDataList.add(energyData); + } + } else { + for (int j = 0; j < m_vCurEnergy.size(); j++) { + EnergyData energyData = new EnergyData(); + energyData.setChannel(String.valueOf(m_vCurCentroid.get(j))); + energyData.setEnergy(String.valueOf(m_vCurEnergy.get(j))); + energyData.setFit(""); + energyData.setDelta(""); + energyDataList.add(energyData); + } + String warning = "Fit failed. Maybe:\nPolynomial isn't suitable for the datas."; + } + map.put("table", energyDataList); + String equation = selfStationUtil.UpdateEquationEnergy(m_curParam); + map.put("equation", equation); + selfStationUtil.UpdateChartEnergy(m_vCurEnergy, m_curParam, m_vCurCentroid, selfStationData, width, map); + } + + @Override + public Result applyDataEnergy(List m_vCurCentroid, List m_vCurEnergy, List m_vCurUncert, ParameterInfo m_curParam, String curCalName, Integer sampleId, String fileName, HttpServletRequest request) { + Result result = new Result(); + //获取用户名 + String userName = JwtUtil.getUserNameByToken(request); + //读取缓存 + Cache selfCache = selfStationCache.getSelfCache(); + SelfStationData selfStationData = selfCache.getIfPresent(fileName + StringPool.DASH + userName); + if (Objects.isNull(selfStationData)) { + result.error500("Please select the parse file first!"); + return result; + } + if (!curCalName.contains("Input")) { + List list_cal = selfStationData.getMapEnerKD().keySet().stream().collect(Collectors.toList()); + curCalName = "Input " + (list_cal.stream().filter(item -> item.contains("Input")).collect(Collectors.toList()).size() + 1); + list_cal.add(curCalName); + result.setSuccess(true); + result.setResult(list_cal); + } + GEnergyBlock gEnergyBlock = new GEnergyBlock(); + gEnergyBlock.setCentroid_channel(m_vCurCentroid); + gEnergyBlock.setG_energy(m_vCurEnergy); + gEnergyBlock.setUncertainty(m_vCurUncert); + gEnergyBlock.setRecord_count(m_vCurCentroid.size()); + selfStationData.getMapEnerKD().put(curCalName, gEnergyBlock); + selfStationData.getMapEnerPara().put(curCalName, m_curParam); + return result; + } + + @Override + public void saveDataEnergy(List m_vCurCentroid, List m_vCurEnergy, List m_vCurUncert, HttpServletResponse response) { + StringBuffer strBuffer = new StringBuffer(); + strBuffer.append("#g_Energy").append("\n"); + for (int i = 0; i < m_vCurCentroid.size(); i++) { + strBuffer.append(m_vCurEnergy.get(i)).append("\t\t").append(m_vCurCentroid.get(i)).append("\t\t").append(m_vCurUncert.get(i)).append("\n"); + } + OutputStream fos = null; + try { + // 设置响应类型 + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Expose-Headers", "Content-Disposition"); + // 解决中文不能生成文件 + response.setHeader("Content-Disposition", "attachment; fileName=" + URLEncoder.encode("EnergyCalibration.Ent", "UTF-8")); + fos = response.getOutputStream(); + fos.write(strBuffer.toString().getBytes()); + } catch (FileNotFoundException e) { + throw new RuntimeException(e); + } catch (IOException e) { + throw new RuntimeException(e); + } finally { + try { + fos.close(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } + + @Override + public Result callDataEnergy(MultipartFile file, String sampleFileName, Double width, String currentText, HttpServletRequest request) { + Result result = new Result(); + //获取用户名 + String userName = JwtUtil.getUserNameByToken(request); + //加载缓存 + Cache selfCache = selfStationCache.getSelfCache(); + SelfStationData selfStationData = selfCache.getIfPresent(sampleFileName + StringPool.DASH + userName); + if (Objects.isNull(selfStationData)) { + result.error500("Please select the parse file first"); + return result; + } + if (Objects.nonNull(file)) { + String fileName = file.getOriginalFilename(); + // 从最后一个。切割文件名称 获取文件名称后缀 + String fileSuffix = fileName.substring(fileName.lastIndexOf(StringPool.DOT)); + if (fileSuffix.equalsIgnoreCase(".ent")) { + Map map = new HashMap<>(); + List m_vCurCentroid = new LinkedList<>(); + List m_vCurEnergy = new LinkedList<>(); + List m_vCurUncert = new LinkedList<>(); + File tmpFile = null; + InputStream inputStream = null; + try { + // 创建临时文件 + tmpFile = File.createTempFile("betaGamma", null); + inputStream = file.getInputStream(); + // 复制上传文件的输入流到临时文件 + FileUtils.copyInputStreamToFile(inputStream, tmpFile); + // 读取文件所有行 + List readLines = FileUtils.readLines(tmpFile, "UTF-8"); + // 遍历文件行数据 + for (int i = 0; i < readLines.size(); i++) { + String line = readLines.get(i); + if (line.contains("#g_Energy") || line.contains("#Energy")) { + for (int j = i + 1; j < readLines.size(); j++) { + String content = readLines.get(j); + if (!content.contains("#")) { + List values = Arrays.asList(content.split("\t\t")); + if (Double.valueOf(values.get(1)) > 0) { + m_vCurEnergy.add(Double.valueOf(values.get(0))); + m_vCurCentroid.add(Double.valueOf(values.get(1))); + m_vCurUncert.add(Double.valueOf(values.get(2))); + } + } + } + } + } + map.put("uncert", m_vCurUncert); + ParameterInfo m_curParam = new ParameterInfo(); + if (StringUtils.isNotBlank(currentText)) { + m_curParam = selfStationData.getMapEnerPara().get(currentText); + } + map.put("param", m_curParam); + int num = m_vCurEnergy.size(); + if (num < 1) { + return result; + } + List vFit = CalValuesHandler.calFcnEval(m_vCurCentroid, m_curParam.getP()).counts; + List energyDataList = new LinkedList<>(); + for (int i = 0; i < num; ++i) { + EnergyData energyData = new EnergyData(); + double delta = (m_vCurEnergy.get(i) - vFit.get(i)) / m_vCurEnergy.get(i) * 100; + energyData.setChannel(String.valueOf(m_vCurCentroid.get(i))); + energyData.setEnergy(String.valueOf(m_vCurEnergy.get(i))); + energyData.setFit(String.format("%.3f", vFit.get(i))); + energyData.setDelta(String.format("%.3f", delta)); + energyDataList.add(energyData); + } + map.put("table", energyDataList); + String equation = selfStationUtil.UpdateEquationEnergy(m_curParam); + map.put("equation", equation); + selfStationUtil.UpdateChartEnergy(m_vCurEnergy, m_curParam, m_vCurCentroid, selfStationData, width, map); + result.setSuccess(true); + result.setResult(map); + } catch (IOException e) { + throw new RuntimeException(e); + } finally { + try { + if (Objects.nonNull(inputStream)) { + inputStream.close(); + } + if (Objects.nonNull(tmpFile)) { + tmpFile.delete(); + } + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } + } + return result; + } + + @Override + public Result setCurrentEnergy(String fileName, String currentName, HttpServletRequest request) { + Result result = new Result(); + //获取用户名 + String userName = JwtUtil.getUserNameByToken(request); + //加载缓存 + Cache selfCache = selfStationCache.getSelfCache(); + SelfStationData selfStationData = selfCache.getIfPresent(fileName + StringPool.DASH + userName); + if (Objects.isNull(selfStationData)) { + result.error500("Please select the parse file first!"); + return result; + } + if (StringUtils.isNotBlank(currentName)) { + selfStationData.setNewEner(currentName); + } + selfCache.put(fileName, selfStationData); + selfStationCache.setSelfCache(selfCache); + result.success("Modified successfully"); + return result; + } + + @Override + public Result resolutionCalibration(String fileName, String currentText, Double width, HttpServletRequest request) { + Result result = new Result(); + //获取用户名 + String userName = JwtUtil.getUserNameByToken(request); + Map map = new HashMap<>(); + //读取缓存 + Cache selfCache = selfStationCache.getSelfCache(); + SelfStationData selfStationData = selfCache.getIfPresent(fileName + StringPool.DASH + userName); + if (Objects.isNull(selfStationData)) { + result.error500("Please select the parse file first!"); + return result; + } + if (StringUtils.isBlank(currentText)) { + currentText = selfStationData.getUsedReso(); + } + List dataSourceList = selfStationData.getMapResoKD().keySet().stream().collect(Collectors.toList()); + map.put("list_dataSource", dataSourceList); + if (StringUtils.isNotBlank(currentText)) { + map.put("currentText", currentText); + List m_vCurReso = selfStationData.getMapResoKD().get(currentText).getFWHM(); + List m_vCurEnergy = selfStationData.getMapResoKD().get(currentText).getG_energy(); + List m_vCurUncert = selfStationData.getMapResoKD().get(currentText).getUncertainty(); + map.put("uncert", m_vCurUncert); + ParameterInfo m_curParam = selfStationData.getMapResoPara().get(currentText); + if (Objects.isNull(m_curParam)) { + m_curParam = new ParameterInfo(); + } + map.put("param", m_curParam); + int num = m_vCurEnergy.size(); + if (num < 1) { + return result; + } + List vFit = CalValuesHandler.calFcnEval(m_vCurEnergy, m_curParam.getP()).counts; + List resolutionDataList = new LinkedList<>(); + for (int i = 0; i < num; ++i) { + ResolutionData resolutionData = new ResolutionData(); + double delta = (m_vCurReso.get(i) - vFit.get(i)) / m_vCurReso.get(i) * 100; + resolutionData.setEnergy(String.valueOf(m_vCurEnergy.get(i))); + resolutionData.setFwhm(String.valueOf(m_vCurReso.get(i))); + resolutionData.setFit(String.format("%.3f", vFit.get(i))); + resolutionData.setDelta(String.format("%.3f", delta)); + resolutionDataList.add(resolutionData); + } + map.put("table", resolutionDataList); + String equation = selfStationUtil.UpdateEquationResolution(m_curParam); + map.put("equation", equation); + selfStationUtil.UpdateChartResolution(m_vCurEnergy, m_curParam, m_vCurReso, selfStationData, width, map); + } + result.setSuccess(true); + result.setResult(map); + return result; + } + + @Override + public Result changeDataResolution(List m_vCurReso, List m_vCurEnergy, List m_vCurUncert, ParameterInfo m_curParam, Integer sampleId, String fileName, Double width, HttpServletRequest request) { + Result result = new Result(); + //读取用户名 + String userName = JwtUtil.getUserNameByToken(request); + Map map = new HashMap<>(); + //读取缓存 + Cache selfCache = selfStationCache.getSelfCache(); + SelfStationData selfStationData = selfCache.getIfPresent(fileName + StringPool.DASH + userName); + if (Objects.isNull(selfStationData)) { + result.error500("Please select the parse file first!"); + return result; + } + DataChangeResolution(m_vCurReso, m_vCurEnergy, m_vCurUncert, m_curParam, selfStationData, width, map); + result.setSuccess(true); + result.setResult(map); + return result; + } + + public void DataChangeResolution(List m_vCurReso, List m_vCurEnergy, List m_vCurUncert, ParameterInfo m_curParam, SelfStationData selfStationData, Double width, Map map) { + m_curParam.setP(CalValuesHandler.calFitPara("Cal_Resolution", 4, m_vCurEnergy, m_vCurReso, m_vCurUncert)); + map.put("uncert", m_vCurUncert); + map.put("param", m_curParam); + + List resolutionDataList = new LinkedList<>(); + if (CollectionUtils.isNotEmpty(m_curParam.getP())) { + List vFit = CalValuesHandler.calFcnEval(m_vCurEnergy, m_curParam.getP()).counts; + for (int i = 0; i < m_vCurEnergy.size(); ++i) { + ResolutionData resolutionData = new ResolutionData(); + double delta = (m_vCurReso.get(i) - vFit.get(i)) / m_vCurReso.get(i) * 100; + resolutionData.setEnergy(String.valueOf(m_vCurEnergy.get(i))); + resolutionData.setFwhm(String.valueOf(m_vCurReso.get(i))); + resolutionData.setFit(String.format("%.3f", vFit.get(i))); + resolutionData.setDelta(String.format("%.3f", delta)); + resolutionDataList.add(resolutionData); + } + } else { + for (int i = 0; i < m_vCurEnergy.size(); ++i) { + ResolutionData resolutionData = new ResolutionData(); + resolutionData.setEnergy(String.valueOf(m_vCurEnergy.get(i))); + resolutionData.setFwhm(String.valueOf(m_vCurReso.get(i))); + resolutionData.setFit(""); + resolutionData.setDelta(""); + resolutionDataList.add(resolutionData); + } + String Warning = "Fit failed. Maybe\nSquare root of polynomial isn't suitable for the datas."; + } + map.put("table", resolutionDataList); + String equation = selfStationUtil.UpdateEquationResolution(m_curParam); + map.put("equation", equation); + selfStationUtil.UpdateChartResolution(m_vCurEnergy, m_curParam, m_vCurReso, selfStationData, width, map); + } + + @Override + public Result applyDataResolution(List m_vCurReso, List m_vCurEnergy, List m_vCurUncert, ParameterInfo m_curParam, String curCalName, Integer sampleId, String fileName, HttpServletRequest request) { + Result result = new Result(); + //获取用户名 + String userName = JwtUtil.getUserNameByToken(request); + //读取缓存 + Cache selfCache = selfStationCache.getSelfCache(); + SelfStationData selfStationData = selfCache.getIfPresent(fileName + StringPool.DASH + userName); + if (Objects.isNull(selfStationData)) { + result.error500("Please select the parse file first!"); + return result; + } + if (!curCalName.contains("Input")) { + List list_cal = selfStationData.getMapResoKD().keySet().stream().collect(Collectors.toList()); + curCalName = "Input " + (list_cal.stream().filter(item -> item.contains("Input")).collect(Collectors.toList()).size() + 1); + list_cal.add(curCalName); + result.setSuccess(true); + result.setResult(list_cal); + } + GResolutionBlock gResolutionBlock = new GResolutionBlock(); + gResolutionBlock.setFWHM(m_vCurReso); + gResolutionBlock.setG_energy(m_vCurEnergy); + gResolutionBlock.setUncertainty(m_vCurUncert); + gResolutionBlock.setRecord_count(m_vCurEnergy.size()); + selfStationData.getMapResoKD().put(curCalName, gResolutionBlock); + selfStationData.getMapResoPara().put(curCalName, m_curParam); + return result; + } + + @Override + public void saveDataResolution(List m_vCurReso, List m_vCurEnergy, List m_vCurUncert, HttpServletResponse response) { + StringBuffer strBuffer = new StringBuffer(); + strBuffer.append("#g_Resolution").append("\n"); + for (int i = 0; i < m_vCurReso.size(); i++) { + strBuffer.append(m_vCurEnergy.get(i)).append("\t\t").append(m_vCurReso.get(i)).append("\t\t").append(m_vCurUncert.get(i)).append("\n"); + } + OutputStream fos = null; + try { + // 设置响应类型 + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Expose-Headers", "Content-Disposition"); + // 解决中文不能生成文件 + response.setHeader("Content-Disposition", "attachment; fileName=" + URLEncoder.encode("ResolutionCalibration.Ent", "UTF-8")); + fos = response.getOutputStream(); + fos.write(strBuffer.toString().getBytes()); + } catch (FileNotFoundException e) { + throw new RuntimeException(e); + } catch (IOException e) { + throw new RuntimeException(e); + } finally { + try { + fos.close(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } + + @Override + public Result callDataResolution(MultipartFile file, String sampleFileName, Double width, String currentText, HttpServletRequest request) { + Result result = new Result(); + //获取用户名 + String userName = JwtUtil.getUserNameByToken(request); + //读取缓存 + Cache selfCache = selfStationCache.getSelfCache(); + SelfStationData selfStationData = selfCache.getIfPresent(sampleFileName + StringPool.DASH + userName); + if (Objects.isNull(selfStationData)) { + result.error500("Please select the parse file first"); + return result; + } + if (Objects.nonNull(file)) { + String fileName = file.getOriginalFilename(); + // 从最后一个。切割文件名称 获取文件名称后缀 + String fileSuffix = fileName.substring(fileName.lastIndexOf(StringPool.DOT)); + if (fileSuffix.equalsIgnoreCase(".ent")) { + Map map = new HashMap<>(); + List m_vCurReso = new LinkedList<>(); + List m_vCurEnergy = new LinkedList<>(); + List m_vCurUncert = new LinkedList<>(); + InputStream inputStream = null; + File tmpFile = null; + try { + // 创建临时文件 + tmpFile = File.createTempFile("betaGamma", null); + inputStream = file.getInputStream(); + // 复制上传文件的输入流到临时文件 + FileUtils.copyInputStreamToFile(inputStream, tmpFile); + // 读取文件所有行 + List readLines = FileUtils.readLines(tmpFile, "UTF-8"); + // 遍历文件行数据 + for (int i = 0; i < readLines.size(); i++) { + String line = readLines.get(i); + if (line.contains("#g_Resolution") || line.contains("#Resolution")) { + for (int j = i + 1; j < readLines.size(); j++) { + String content = readLines.get(j); + if (!content.contains("#")) { + List values = Arrays.asList(content.split("\t\t")); + if (Double.valueOf(values.get(0)) > 0) { + m_vCurEnergy.add(Double.valueOf(values.get(0))); + m_vCurReso.add(Double.valueOf(values.get(1))); + m_vCurUncert.add(Double.valueOf(values.get(2))); + } + } + } + } + } + map.put("uncert", m_vCurUncert); + ParameterInfo m_curParam = new ParameterInfo(); + if (StringUtils.isNotBlank(currentText)) { + m_curParam = selfStationData.getMapResoPara().get(currentText); + } + map.put("param", m_curParam); + int num = m_vCurEnergy.size(); + if (num < 1) { + return result; + } + List vFit = CalValuesHandler.calFcnEval(m_vCurEnergy, m_curParam.getP()).counts; + List resolutionDataList = new LinkedList<>(); + for (int i = 0; i < num; ++i) { + ResolutionData resolutionData = new ResolutionData(); + double delta = (m_vCurReso.get(i) - vFit.get(i)) / m_vCurReso.get(i) * 100; + resolutionData.setEnergy(String.valueOf(m_vCurEnergy.get(i))); + resolutionData.setFwhm(String.valueOf(m_vCurReso.get(i))); + resolutionData.setFit(String.format("%.3f", vFit.get(i))); + resolutionData.setDelta(String.format("%.3f", delta)); + resolutionDataList.add(resolutionData); + } + map.put("table", resolutionDataList); + String equation = selfStationUtil.UpdateEquationResolution(m_curParam); + map.put("equation", equation); + selfStationUtil.UpdateChartResolution(m_vCurEnergy, m_curParam, m_vCurReso, selfStationData, width, map); + result.setSuccess(true); + result.setResult(map); + } catch (IOException e) { + throw new RuntimeException(e); + } finally { + try { + if (Objects.nonNull(inputStream)) { + inputStream.close(); + } + if (Objects.nonNull(tmpFile)) { + tmpFile.delete(); + } + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } + } + return result; + } + + @Override + public Result setCurrentResolution(String fileName, String currentName, HttpServletRequest request) { + Result result = new Result(); + //获取用户名 + String userName = JwtUtil.getUserNameByToken(request); + //读取缓存 + Cache selfCache = selfStationCache.getSelfCache(); + SelfStationData selfStationData = selfCache.getIfPresent(fileName + StringPool.DASH + userName); + if (Objects.isNull(selfStationData)) { + result.error500("Please select the parse file first!"); + return result; + } + if (StringUtils.isNotBlank(currentName)) { + selfStationData.setNewReso(currentName); + } + selfCache.put(fileName, selfStationData); + selfStationCache.setSelfCache(selfCache); + result.success("Modified successfully"); + return result; + } + + @Override + public Result EfficiencyCalibration(String fileName, String currentText, Double width, HttpServletRequest request) { + Result result = new Result(); + //读取用户名 + String userName = JwtUtil.getUserNameByToken(request); + Map map = new HashMap<>(); + List m_vFuncName = new LinkedList<>(); + m_vFuncName.add("Interpolation"); // 1 + m_vFuncName.add("HT Efficiency"); // 5 + m_vFuncName.add("Log Polynomial"); // 6 + m_vFuncName.add("Invlog Polynomial"); // 8 + m_vFuncName.add("HAE Efficiency(1-3)"); // 93 + m_vFuncName.add("HAE Efficiency(1-2)"); // 94 + m_vFuncName.add("HAE Efficiency(1-2-3)"); // 95 + map.put("function", m_vFuncName); + Cache selfCache = selfStationCache.getSelfCache(); + SelfStationData selfStationData = selfCache.getIfPresent(fileName + StringPool.DASH + userName); + if (Objects.isNull(selfStationData)) { + result.error500("Please select the parse file first!"); + return result; + } + if (StringUtils.isBlank(currentText)) { + currentText = selfStationData.getUsedEffi(); + } + List dataSourceList = selfStationData.getMapEffiKD().keySet().stream().collect(Collectors.toList()); + map.put("list_dataSource", dataSourceList); + if (StringUtils.isNotBlank(currentText)) { + map.put("currentText", currentText); + List m_vCurEffi = selfStationData.getMapEffiKD().get(currentText).getEfficiency(); + List m_vCurEnergy = selfStationData.getMapEffiKD().get(currentText).getG_energy(); + List m_vCurUncert = selfStationData.getMapEffiKD().get(currentText).getUncertainty(); + map.put("uncert", m_vCurUncert); + ParameterInfo m_curParam = selfStationData.getMapEffiPara().get(currentText); + if (Objects.isNull(m_curParam)) { + m_curParam = new ParameterInfo(); + } + map.put("param", m_curParam); + int num = m_vCurEnergy.size(); + if (num < 1) { + return result; + } + List vFit = CalValuesHandler.calFcnEval(m_vCurEnergy, m_curParam.getP()).counts; + List efficiencyDataList = new LinkedList<>(); + for (int i = 0; i < num; ++i) { + double delta = (m_vCurEffi.get(i) - vFit.get(i)) / m_vCurEffi.get(i) * 100; + EfficiencyData efficiencyData = new EfficiencyData(); + efficiencyData.setEnergy(String.valueOf(m_vCurEnergy.get(i))); + efficiencyData.setEfficiency(String.valueOf(m_vCurEffi.get(i))); + efficiencyData.setFit(String.format("%.3f", vFit.get(i))); + efficiencyData.setDelta(String.format("%.3f", delta)); + efficiencyDataList.add(efficiencyData); + } + map.put("table", efficiencyDataList); + String equation = selfStationUtil.UpdateEquationEfficiency(m_vCurEnergy, m_curParam, 0, null); + map.put("equation", equation); + selfStationUtil.UpdateChartEfficiency(m_vCurEnergy, m_curParam, m_vCurEffi, selfStationData, width, map); + } + result.setSuccess(true); + result.setResult(map); + return result; + } + + @Override + public Result changeDataEfficiency(List m_vCurEffi, List m_vCurEnergy, List m_vCurUncert, ParameterInfo m_curParam, Integer funcId, Integer sampleId, String fileName, Double width, Integer curRow, HttpServletRequest request) { + Result result = new Result(); + //获取用户名 + String userName = JwtUtil.getUserNameByToken(request); + Map map = new HashMap<>(); + //读取缓存 + Cache selfCache = selfStationCache.getSelfCache(); + SelfStationData selfStationData = selfCache.getIfPresent(fileName + StringPool.DASH + userName); + if (Objects.isNull(selfStationData)) { + result.error500("Please select the parse file first!"); + return result; + } + DataChangeEfficiency(m_vCurEffi, m_vCurEnergy, m_vCurUncert, m_curParam, funcId, selfStationData, width, curRow, map); + result.setSuccess(true); + result.setResult(map); + return result; + } + + public void DataChangeEfficiency(List m_vCurEffi, List m_vCurEnergy, List m_vCurUncert, ParameterInfo m_curParam, Integer funcId, SelfStationData selfStationData, Double width, Integer curRow, Map map) { + m_curParam.setP(CalValuesHandler.calFitPara("Cal_Efficiency", funcId, m_vCurEnergy, m_vCurEffi, m_vCurUncert)); + map.put("uncert", m_vCurUncert); + map.put("param", m_curParam); + + List efficiencyDataList = new LinkedList<>(); + if (CollectionUtils.isNotEmpty(m_curParam.getP())) { + List vFit = CalValuesHandler.calFcnEval(m_vCurEnergy, m_curParam.getP()).counts; + for (int i = 0; i < m_vCurEnergy.size(); ++i) { + EfficiencyData efficiencyData = new EfficiencyData(); + double delta = (m_vCurEffi.get(i) - vFit.get(i)) / m_vCurEffi.get(i) * 100; + efficiencyData.setEnergy(String.valueOf(m_vCurEnergy.get(i))); + efficiencyData.setEfficiency(String.valueOf(m_vCurEffi.get(i))); + efficiencyData.setFit(String.format("%.3f", vFit.get(i))); + efficiencyData.setDelta(String.format("%.3f", delta)); + efficiencyDataList.add(efficiencyData); + } + } else { + for (int i = 0; i < m_vCurEnergy.size(); ++i) { + EfficiencyData efficiencyData = new EfficiencyData(); + efficiencyData.setEnergy(String.valueOf(m_vCurEnergy.get(i))); + efficiencyData.setEfficiency(String.valueOf(m_vCurEffi.get(i))); + efficiencyData.setFit(""); + efficiencyData.setDelta(""); + efficiencyDataList.add(efficiencyData); + } + String Warning = "Fit failed. Maybe:\n1. data's number are too little;\n2. %1 isn't suitable for the data."; + } + map.put("table", efficiencyDataList); + String equation = selfStationUtil.UpdateEquationEfficiency(m_vCurEnergy, m_curParam, curRow, funcId); + map.put("equation", equation); + selfStationUtil.UpdateChartEfficiency(m_vCurEnergy, m_curParam, m_vCurEffi, selfStationData, width, map); + } + + @Override + public Result applyDataEfficiency(List m_vCurEffi, List m_vCurEnergy, List m_vCurUncert, ParameterInfo m_curParam, String curCalName, Integer sampleId, String fileName, HttpServletRequest request) { + Result result = new Result(); + //获取用户名 + String userName = JwtUtil.getUserNameByToken(request); + //读取缓存 + Cache phdCache = selfStationCache.getSelfCache(); + SelfStationData selfStationData = phdCache.getIfPresent(fileName + StringPool.DASH + userName); + if (Objects.isNull(selfStationData)) { + result.error500("Please select the parse file first!"); + return result; + } + if (!curCalName.contains("Input")) { + List list_cal = selfStationData.getMapEffiKD().keySet().stream().collect(Collectors.toList()); + curCalName = "Input " + (list_cal.stream().filter(item -> item.contains("Input")).collect(Collectors.toList()).size() + 1); + list_cal.add(curCalName); + result.setSuccess(true); + result.setResult(list_cal); + } + GEfficiencyBlock gEfficiencyBlock = new GEfficiencyBlock(); + gEfficiencyBlock.setEfficiency(m_vCurEffi); + gEfficiencyBlock.setG_energy(m_vCurEnergy); + gEfficiencyBlock.setUncertainty(m_vCurUncert); + gEfficiencyBlock.setRecord_count(m_vCurEnergy.size()); + selfStationData.getMapEffiKD().put(curCalName, gEfficiencyBlock); + selfStationData.getMapEffiPara().put(curCalName, m_curParam); + return result; + } + + @Override + public void saveDataEfficiency(List m_vCurEffi, List m_vCurEnergy, List m_vCurUncert, Integer funId, HttpServletResponse response) { + StringBuffer strBuffer = new StringBuffer(); + strBuffer.append("#g_Efficiency").append("\n"); + for (int i = 0; i < m_vCurEffi.size(); i++) { + strBuffer.append(m_vCurEnergy.get(i)).append("\t\t").append(m_vCurEffi.get(i)).append("\t\t").append(m_vCurUncert.get(i)).append("\n"); + } + strBuffer.append("FitType = ").append(funId); + OutputStream fos = null; + try { + // 设置响应类型 + response.setContentType("application/octet-stream"); + response.setHeader("Access-Control-Expose-Headers", "Content-Disposition"); + // 解决中文不能生成文件 + response.setHeader("Content-Disposition", "attachment; fileName=" + URLEncoder.encode("EfficiencyCalibration.Eft", "UTF-8")); + fos = response.getOutputStream(); + fos.write(strBuffer.toString().getBytes()); + } catch (FileNotFoundException e) { + throw new RuntimeException(e); + } catch (IOException e) { + throw new RuntimeException(e); + } finally { + try { + fos.close(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } + + @Override + public Result callDataEfficiency(MultipartFile file, String sampleFileName, Double width, String currentText, HttpServletRequest request) { + Result result = new Result(); + //获取用户名 + String userName = JwtUtil.getUserNameByToken(request); + //读取缓存 + Cache selfCache = selfStationCache.getSelfCache(); + SelfStationData selfStationData = selfCache.getIfPresent(sampleFileName + StringPool.DASH + userName); + if (Objects.isNull(selfStationData)) { + result.error500("Please select the parse file first"); + return result; + } + if (Objects.nonNull(file)) { + String fileName = file.getOriginalFilename(); + // 从最后一个。切割文件名称 获取文件名称后缀 + String fileSuffix = fileName.substring(fileName.lastIndexOf(StringPool.DOT)); + if (fileSuffix.equalsIgnoreCase(".eft") || fileSuffix.equalsIgnoreCase(".ent")) { + Map map = new HashMap<>(); + List m_vCurEffi = new LinkedList<>(); + List m_vCurEnergy = new LinkedList<>(); + List m_vCurUncert = new LinkedList<>(); + Double m_nFunId = 1.0; + File tmpFile = null; + InputStream inputStream = null; + try { + // 创建临时文件 + tmpFile = File.createTempFile("betaGamma", null); + inputStream = file.getInputStream(); + // 复制上传文件的输入流到临时文件 + FileUtils.copyInputStreamToFile(inputStream, tmpFile); + // 读取文件所有行 + List readLines = FileUtils.readLines(tmpFile, "UTF-8"); + // 遍历文件行数据 + for (int i = 0; i < readLines.size(); i++) { + String line = readLines.get(i); + if (line.contains("#g_Efficiency") || line.contains("#Efficiency")) { + for (int j = i + 1; j < readLines.size(); j++) { + String content = readLines.get(j); + if (!content.contains("#") && !content.contains("FitType")) { + List values = Arrays.asList(content.split("\t\t")); + if (Double.valueOf(values.get(0)) > 0) { + m_vCurEnergy.add(Double.valueOf(values.get(0))); + m_vCurEffi.add(Double.valueOf(values.get(1))); + m_vCurUncert.add(Double.valueOf(values.get(2))); + } + } + if (content.contains("FitType")) { + List values = Arrays.asList(content.split("=")); + if (values.size() == 2) { + m_nFunId = Double.valueOf(values.get(1).trim()); + } + } + } + } + } + map.put("uncert", m_vCurUncert); + ParameterInfo m_curParam = new ParameterInfo(); + if (StringUtils.isNotBlank(currentText)) { + m_curParam = selfStationData.getMapEffiPara().get(currentText); + } + if (m_curParam.getP().size() > 0) { + m_curParam.getP().set(0, m_nFunId); + } else { + m_curParam.getP().add(m_nFunId); + } + map.put("param", m_curParam); + int num = m_vCurEnergy.size(); + if (num < 1) { + return result; + } + List vFit = CalValuesHandler.calFcnEval(m_vCurEnergy, m_curParam.getP()).counts; + List efficiencyDataList = new LinkedList<>(); + for (int i = 0; i < num; ++i) { + double delta = (m_vCurEffi.get(i) - vFit.get(i)) / m_vCurEffi.get(i) * 100; + EfficiencyData efficiencyData = new EfficiencyData(); + efficiencyData.setEnergy(String.valueOf(m_vCurEnergy.get(i))); + efficiencyData.setEfficiency(String.valueOf(m_vCurEffi.get(i))); + efficiencyData.setFit(String.format("%.3f", vFit.get(i))); + efficiencyData.setDelta(String.format("%.3f", delta)); + efficiencyDataList.add(efficiencyData); + } + map.put("table", efficiencyDataList); + String equation = selfStationUtil.UpdateEquationEfficiency(m_vCurEnergy, m_curParam, 0, null); + map.put("equation", equation); + selfStationUtil.UpdateChartEfficiency(m_vCurEnergy, m_curParam, m_vCurEffi, selfStationData, width, map); + result.setSuccess(true); + result.setResult(map); + } catch (IOException e) { + throw new RuntimeException(e); + } finally { + try { + if (Objects.nonNull(inputStream)) { + inputStream.close(); + } + if (Objects.nonNull(tmpFile)) { + tmpFile.delete(); + } + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } + } + return result; + } + + @Override + public Result setCurrentEfficiency(String fileName, String currentName, HttpServletRequest request) { + Result result = new Result(); + //获取用户名 + String userName = JwtUtil.getUserNameByToken(request); + Cache selfCache = selfStationCache.getSelfCache(); + SelfStationData selfStationData = selfCache.getIfPresent(fileName + StringPool.DASH + userName); + if (Objects.isNull(selfStationData)) { + result.error500("Please select the parse file first!"); + return result; + } + if (StringUtils.isNotBlank(currentName)) { + selfStationData.setNewEffi(currentName); + } + selfCache.put(fileName, selfStationData); + selfStationCache.setSelfCache(selfCache); + result.success("Modified successfully"); + return result; + } + +} diff --git a/jeecg-server-cloud/armd-spectrum-analysis-start/src/main/java/org/jeecg/JeecgSpectrumAnalysisApplication.java b/jeecg-server-cloud/armd-spectrum-analysis-start/src/main/java/org/jeecg/JeecgSpectrumAnalysisApplication.java index 09def5e3..9296d3f4 100644 --- a/jeecg-server-cloud/armd-spectrum-analysis-start/src/main/java/org/jeecg/JeecgSpectrumAnalysisApplication.java +++ b/jeecg-server-cloud/armd-spectrum-analysis-start/src/main/java/org/jeecg/JeecgSpectrumAnalysisApplication.java @@ -3,6 +3,7 @@ package org.jeecg; import lombok.extern.slf4j.Slf4j; import org.jeecg.common.cache.BetaCache; import org.jeecg.common.cache.LocalCache; +import org.jeecg.common.cache.SelfCache; import org.jeecg.common.util.oConvertUtils; import org.jeecg.modules.service.IDataService; import org.jeecg.modules.service.IGammaService; @@ -32,6 +33,8 @@ public class JeecgSpectrumAnalysisApplication extends SpringBootServletInitializ @Autowired private BetaCache betaCache; @Autowired + private SelfCache selfCache; + @Autowired private IGammaService gammaService; @Autowired private IGardsNuclCoincidenceSumSpectrumService nuclCoincidenceSumSpectrumService; @@ -71,6 +74,7 @@ public class JeecgSpectrumAnalysisApplication extends SpringBootServletInitializ //创建缓存 betaCache.initCache(); localCache.initCache(); + selfCache.initCache(); gammaService.readMDCParameter(); nuclIdedSpectrumService.getNuclideMap(); nuclCoincidenceSumSpectrumService.getNuclCoincidenceMap();