float类型数据换成double后精度问题导致计算错误修改

读取Spc文件方法实现
This commit is contained in:
qiaoqinzheng 2023-10-19 10:13:56 +08:00
parent 191bff95ab
commit 774dc70ab6
4 changed files with 644 additions and 36 deletions

View File

@ -1,7 +1,10 @@
package org.jeecg.common.util;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.lang3.StringUtils;
import org.jeecg.common.constant.DateConstant;
import org.jeecg.common.enums.FtransitEnum;
import org.jeecg.modules.entity.vo.FileData;
import org.jeecg.modules.entity.vo.SpcHead1;
@ -11,6 +14,11 @@ import org.jeecg.modules.native_jni.struct.EnergySpectrumStruct;
import org.springframework.stereotype.Component;
import java.io.*;
import java.math.BigInteger;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
@ -47,8 +55,8 @@ public class FileFtransitUtil {
List<String> line2Str = Arrays.asList(line.split("\\s+"));
//读取出行标 存活时间 实时时间 总道数
temp = line2Str.get(0);
datas.setAcq_live(Double.valueOf(line2Str.get(1)));
datas.setAcq_real(Double.valueOf(line2Str.get(2)));
datas.setAcq_live(Float.parseFloat(line2Str.get(1)));
datas.setAcq_real(Float.parseFloat(line2Str.get(2)));
datas.setNum_count(Integer.valueOf(line2Str.get(3)));
//读取第三行
line = in.readLine();
@ -82,8 +90,8 @@ public class FileFtransitUtil {
List<String> line4Str = Arrays.asList(line.split("\\s+"));
//获取行标 能量刻度截距 能量刻度斜率 0 0
temp = line4Str.get(0);
datas.setEner_intercept(Double.valueOf(line4Str.get(1)));
datas.setEner_slope(Double.valueOf(line4Str.get(2)));
datas.setEner_intercept(Float.parseFloat(line4Str.get(1)));
datas.setEner_slope(Float.parseFloat(line4Str.get(2)));
temp = line4Str.get(3);
temp = line4Str.get(4);
//读取第五行
@ -158,7 +166,7 @@ public class FileFtransitUtil {
i1 = 0;
i2 = num - 1;
}
datas.setEner_slope((datas.getVvEner().get(0).get(i2) - datas.getVvEner().get(0).get(i1)) / (datas.getVvEner().get(1).get(i2) - datas.getVvEner().get(1).get(i1)));
datas.setEner_slope((float) ((datas.getVvEner().get(0).get(i2) - datas.getVvEner().get(0).get(i1)) / (datas.getVvEner().get(1).get(i2) - datas.getVvEner().get(1).get(i1))));
}
// Read Resolution Calibration
@ -311,8 +319,8 @@ public class FileFtransitUtil {
i1 = 0;
i2 = num - 1;
}
datas.setEner_slope((datas.getVvEner().get(0).get(i2) - datas.getVvEner().get(0).get(i1)) / (datas.getVvEner().get(1).get(i2) - datas.getVvEner().get(1).get(i1)));
datas.setEner_intercept((datas.getVvEner().get(0).get(i1) * datas.getVvEner().get(1).get(i2) - datas.getVvEner().get(0).get(i2) * datas.getVvEner().get(1).get(i1)) / (datas.getVvEner().get(1).get(i2) - datas.getVvEner().get(1).get(i1)));
datas.setEner_slope((float) ((datas.getVvEner().get(0).get(i2) - datas.getVvEner().get(0).get(i1)) / (datas.getVvEner().get(1).get(i2) - datas.getVvEner().get(1).get(i1))));
datas.setEner_intercept((float) ((datas.getVvEner().get(0).get(i1) * datas.getVvEner().get(1).get(i2) - datas.getVvEner().get(0).get(i2) * datas.getVvEner().get(1).get(i1)) / (datas.getVvEner().get(1).get(i2) - datas.getVvEner().get(1).get(i1))));
}
out.append(String.format("%-10s %-13s %-13s %-13s %-13s", FtransitEnum.IecLineNo.getCode(), String.format("%.6f", datas.getEner_intercept()), String.format("%.6f", datas.getEner_slope()), "0", "0"));
//换行
@ -497,15 +505,15 @@ public class FileFtransitUtil {
if (StringUtils.isNotBlank(struct.collection_stop_date) && StringUtils.isNotBlank(struct.collection_stop_time)) {
datas.setCollect_stop(struct.collection_stop_date + " " + struct.collection_stop_time);
}
datas.setAir_volume(struct.air_volume);
datas.setAir_volume((float) struct.air_volume);
if (StringUtils.isNotBlank(struct.acquisition_start_date)) {
datas.setAcq_date(struct.acquisition_start_date);
}
if (StringUtils.isNotBlank(struct.acquisition_start_time)) {
datas.setAcq_time(struct.acquisition_start_time);
}
datas.setAcq_live(struct.acquisition_live_time);
datas.setAcq_real(struct.acquisition_real_time);
datas.setAcq_live((float) struct.acquisition_live_time);
datas.setAcq_real((float) struct.acquisition_real_time);
if (StringUtils.isNotBlank(struct.date_calibration) && StringUtils.isNotBlank(struct.time_calibration)) {
datas.setCalibra_time(struct.date_calibration + " " + struct.time_calibration);
}
@ -538,8 +546,8 @@ public class FileFtransitUtil {
i1 = 0;
i2 = num - 1;
}
datas.setEner_slope((datas.getVvEner().get(0).get(i2) - datas.getVvEner().get(0).get(i1)) / (datas.getVvEner().get(1).get(i2) - datas.getVvEner().get(1).get(i1)));
datas.setEner_intercept((datas.getVvEner().get(0).get(i1) * datas.getVvEner().get(1).get(i2) - datas.getVvEner().get(0).get(i2) * datas.getVvEner().get(1).get(i1)) / (datas.getVvEner().get(1).get(i2) - datas.getVvEner().get(1).get(i1)));
datas.setEner_slope((float) ((datas.getVvEner().get(0).get(i2) - datas.getVvEner().get(0).get(i1)) / (datas.getVvEner().get(1).get(i2) - datas.getVvEner().get(1).get(i1))));
datas.setEner_intercept((float) ((datas.getVvEner().get(0).get(i1) * datas.getVvEner().get(1).get(i2) - datas.getVvEner().get(0).get(i2) * datas.getVvEner().get(1).get(i1)) / (datas.getVvEner().get(1).get(i2) - datas.getVvEner().get(1).get(i1))));
}
if (CollectionUtils.isNotEmpty(struct.g_r_energy)) {
@ -682,5 +690,605 @@ public class FileFtransitUtil {
return out.toString();
}
public static boolean ReadSPC(File spcFile, FileData datas) {
// r:只读 rw:读写
RandomAccessFile SpcFile = null;
try {
SpcFile = new RandomAccessFile(spcFile.getAbsolutePath(), "r");
//读取第一个数据
byte[] first = new byte[2];
SpcFile.read(first);
short Inftyp = Short.valueOf(convert(first, "short"));
//读取第二个数据
byte[] second = new byte[2];
SpcFile.read(second);
short Filtyp = Short.valueOf(convert(second, "short"));
if (Inftyp != 1 || Filtyp != 1) {
return false;
}
// 读入整形spc文件的头记录(第一个记录)128字节
SpcHead1 head1 = new SpcHead1();
SpcHead2 head2 = new SpcHead2();
SpcFile.seek(0);
//头部信息需要读取的字节数
byte[] headByte1 = new byte[80];
SpcFile.read(headByte1);
//读取后赋值
head1.setInftyp(Short.valueOf(convert(Arrays.copyOfRange(headByte1, 0, 2), "short")));
head1.setFiltyp(Short.valueOf(convert(Arrays.copyOfRange(headByte1, 2, 4), "short")));
head1.setReserved1(Short.valueOf(convert(Arrays.copyOfRange(headByte1, 4, 6), "short")));
head1.setReserved2( Short.valueOf(convert(Arrays.copyOfRange(headByte1, 6, 8), "short")) );
head1.setAcqInfRP( Short.valueOf(convert(Arrays.copyOfRange(headByte1, 8, 10), "short")) );
head1.setSamDesRP( Short.valueOf(convert(Arrays.copyOfRange(headByte1, 10, 12), "short")) );
head1.setDetDesRP( Short.valueOf(convert(Arrays.copyOfRange(headByte1, 12, 14), "short")) );
head1.setEbrDesRP( Short.valueOf(convert(Arrays.copyOfRange(headByte1, 14, 16), "short")) );
head1.setAnaRP1( Short.valueOf(convert(Arrays.copyOfRange(headByte1, 16, 18), "short")) );
head1.setAnaRP2( Short.valueOf(convert(Arrays.copyOfRange(headByte1, 18, 20), "short")) );
head1.setAnaRP3( Short.valueOf(convert(Arrays.copyOfRange(headByte1, 20, 22), "short")) );
head1.setAnaRP4( Short.valueOf(convert(Arrays.copyOfRange(headByte1, 22, 24), "short")) );
head1.setSrpDesRP( Short.valueOf(convert(Arrays.copyOfRange(headByte1, 24, 26), "short")) );
head1.setIeqDesRP( Short.valueOf(convert(Arrays.copyOfRange(headByte1, 26, 28), "short")) );
head1.setGeoDesRP( Short.valueOf(convert(Arrays.copyOfRange(headByte1, 28, 30), "short")) );
head1.setMpcDesRP( Short.valueOf(convert(Arrays.copyOfRange(headByte1, 30, 32), "short")) );
head1.setCalDesRP( Short.valueOf(convert(Arrays.copyOfRange(headByte1, 32, 34), "short")) );
head1.setCalRP1( Short.valueOf(convert(Arrays.copyOfRange(headByte1, 34, 36), "short")) );
head1.setCalRP2( Short.valueOf(convert(Arrays.copyOfRange(headByte1, 36, 38), "short")) );
head1.setEffRP( Short.valueOf(convert(Arrays.copyOfRange(headByte1, 38, 40), "short")) );
head1.setROI1( Short.valueOf(convert(Arrays.copyOfRange(headByte1, 40, 42), "short")) );
head1.setEngPrRP( Short.valueOf(convert(Arrays.copyOfRange(headByte1, 42, 44), "short")) );
head1.setEngPrNum( Short.valueOf(convert(Arrays.copyOfRange(headByte1, 44, 46), "short")) );
head1.setReserved3( Short.valueOf(convert(Arrays.copyOfRange(headByte1, 46, 48), "short")) );
head1.setDDP( Short.valueOf(convert(Arrays.copyOfRange(headByte1, 48, 50), "short")) );
head1.setActUnit( Short.valueOf(convert(Arrays.copyOfRange(headByte1, 50, 52), "short")) );
head1.setLabPerRP( Short.valueOf(convert(Arrays.copyOfRange(headByte1, 52, 54), "short")) );
head1.setMaxNumE( Short.valueOf(convert(Arrays.copyOfRange(headByte1, 54, 56), "short")) );
head1.setMaxNumU( Short.valueOf(convert(Arrays.copyOfRange(headByte1, 56, 58), "short")) );
head1.setEffNum( Short.valueOf(convert(Arrays.copyOfRange(headByte1, 58, 60), "short")) );
head1.setSpcFirstRP( Short.valueOf(convert(Arrays.copyOfRange(headByte1, 60, 62), "short")) );
head1.setSpcRecNum( Short.valueOf(convert(Arrays.copyOfRange(headByte1, 62, 64), "short")) );
head1.setSpcChnNum( Short.valueOf(convert(Arrays.copyOfRange(headByte1, 64, 66), "short")) );
head1.setAbstch( Short.valueOf(convert(Arrays.copyOfRange(headByte1, 66, 68), "short")) );
head1.setAcqTime( Float.valueOf(convert(Arrays.copyOfRange(headByte1, 68, 72), "float")));
head1.setAcqTime8( Double.valueOf(convert(Arrays.copyOfRange(headByte1, 72, 80), "double")));
SpcFile.seek(78);
byte[] headByte2 = new byte[20];
SpcFile.read(headByte2);
head2.setAddRAM( Short.valueOf(convert(Arrays.copyOfRange(headByte2, 0, 2), "short")) );
head2.setSeqnum( Short.valueOf(convert(Arrays.copyOfRange(headByte2, 2, 4), "short")) );
head2.setMcanu( Short.valueOf(convert(Arrays.copyOfRange(headByte2, 4, 6), "short")) );
head2.setSegnum( Short.valueOf(convert(Arrays.copyOfRange(headByte2, 6, 8), "short")) );
head2.setMcadvt( Short.valueOf(convert(Arrays.copyOfRange(headByte2, 8, 10), "short")) );
head2.setChnsrt( Short.valueOf( convert(Arrays.copyOfRange(headByte2, 10, 12), "short")) );
head2.setRealTime( Float.valueOf(convert(Arrays.copyOfRange(headByte2, 12, 16), "float") ) );
head2.setLiveTime( Float.valueOf(convert(Arrays.copyOfRange(headByte2, 16, 20), "float")) );
// Acquisition
//从intspc能谱中读取能谱开测时间
int AcqY,AcqM,AcqD,AcqH,AcqMin;
float AcqS,AcqRT,AcqLT;
char[] temchar = new char[200];
int lOffset;
lOffset=(head1.AcqInfRP-1)*128;
SpcFile.seek(lOffset+16);
byte[] charByte1 = new byte[12];
SpcFile.read(charByte1);
for (int i=0; i<charByte1.length; i++) {
char charAt = convert(Arrays.copyOfRange(charByte1, i, i + 1), "char").charAt(0);
temchar[i] = charAt;
}
char char1,char2;
char1=temchar[7];
char2=temchar[8];
if('0'==temchar[9]) {
temchar[7]='1'; //19xx<EFBFBD><EFBFBD>
temchar[8]='9';
} else {
temchar[7]='2'; //20xx<EFBFBD><EFBFBD>
temchar[8]='0';
}
temchar[9]=char1;
temchar[10]=char2;
temchar[11]='\0';
AcqY=0;
for(int i=7;i<11;i++) {
temchar[i]= (char) (temchar[i]-48);
AcqY= (int) (AcqY+temchar[i]*Math.pow(10,10-i));
}
AcqM = 0;
if (temchar[3] == 'J' && temchar[4] == 'a' && temchar[5] == 'n') AcqM = 1;
if (temchar[3] == 'F' && temchar[4] == 'e' && temchar[5] == 'b') AcqM = 2;
if (temchar[3] == 'M' && temchar[4] == 'a' && temchar[5] == 'r') AcqM = 3;
if (temchar[3] == 'A' && temchar[4] == 'p' && temchar[5] == 'r') AcqM = 4;
if (temchar[3] == 'M' && temchar[4] == 'a' && temchar[5] == 'y') AcqM = 5;
if (temchar[3] == 'J' && temchar[4] == 'u' && temchar[5] == 'n') AcqM = 6;
if (temchar[3] == 'J' && temchar[4] == 'u' && temchar[5] == 'l') AcqM = 7;
if (temchar[3] == 'A' && temchar[4] == 'u' && temchar[5] == 'g') AcqM = 8;
if (temchar[3] == 'S' && temchar[4] == 'e' && temchar[5] == 'p') AcqM = 9;
if (temchar[3] == 'O' && temchar[4] == 'c' && temchar[5] == 't') AcqM = 10;
if (temchar[3] == 'N' && temchar[4] == 'o' && temchar[5] == 'v') AcqM = 11;
if (temchar[3] == 'D' && temchar[4] == 'e' && temchar[5] == 'c') AcqM = 12;
AcqD = 0;
for (int i = 0; i < 2; i++) {
temchar[i] = (char) (temchar[i] - 48);
AcqD = (int) (AcqD + temchar[i] * Math.pow(10, 1 - i));
}
byte[] charByte2 = new byte[10];
SpcFile.read(charByte2);
for (int i=0; i<charByte2.length; i++) {
char charAt = convert(Arrays.copyOfRange(charByte2, i, i + 1), "char").charAt(0);
temchar[i] = charAt;
}
temchar[9] = '\0';
AcqH = 0;
for (int i = 0; i < 2; i++) {
temchar[i] = (char) (temchar[i] - 48);
AcqH = (int) (AcqH + temchar[i] * Math.pow(10, 1 - i));
}
AcqMin = 0;
for (int i = 3; i < 5; i++) {
temchar[i] = (char) (temchar[i] - 48);
AcqMin = (int) (AcqMin + temchar[i] * Math.pow(10, 4 - i));
}
AcqS = 0;
for (int i = 6; i < 8; i++) {
temchar[i] = (char) (temchar[i] - 48);
AcqS = (float) (AcqS + temchar[i] * Math.pow(10, 7 - i));
}
AcqLT = 0;
byte[] charByte3 = new byte[10];
SpcFile.read(charByte3);
for (int i=0; i<charByte3.length; i++) {
char charAt = convert(Arrays.copyOfRange(charByte3, i, i + 1), "char").charAt(0);
temchar[i] = charAt;
}
for (int i = 0; i < 10; i++) {
if (temchar[i] == 32) {
temchar[i] = 0;
} else {
temchar[i] = (char) (temchar[i] - 48);
}
AcqLT = (float) (AcqLT + temchar[i] * Math.pow(10, 9 - i));
}
AcqRT = 0;
byte[] charByte4 = new byte[10];
SpcFile.read(charByte4);
for (int i=0; i<charByte4.length; i++) {
char charAt = convert(Arrays.copyOfRange(charByte4, i, i + 1), "char").charAt(0);
temchar[i] = charAt;
}
for (int i = 0; i < 10; i++) {
if (temchar[i] == 32) {
temchar[i] = 0;
} else {
temchar[i] = (char) (temchar[i] - 48);
}
AcqRT = (float) (AcqRT + temchar[i] * Math.pow(10, 9 - i));
}
int seconds = (int) AcqS;
int ms = (int) ((AcqS - seconds) * 10);
String acq_date = LocalDate.of(AcqY, AcqM, AcqD).format(DateTimeFormatter.ofPattern(DateConstant.DATE_BIAS));
datas.setAcq_date(acq_date);
String acq_time = LocalTime.of(AcqH, AcqMin, seconds, ms).format(DateTimeFormatter.ofPattern(DateConstant.TIME_MS));
datas.setAcq_time(acq_time);
datas.setAcq_real(head2.RealTime);
datas.setAcq_live(head2.LiveTime);
// Calibration
// 从intspc能谱中读取能谱刻度时间
int CalY, CalM, CalD, CalH, CalMin;
float CalS;
lOffset = (head1.CalRP2 - 1) * 128;
SpcFile.seek(lOffset + 32);
byte[] charByte5 = new byte[10];
SpcFile.read(charByte5);
for (int i=0; i<charByte5.length; i++) {
char charAt = convert(Arrays.copyOfRange(charByte5, i, i + 1), "char").charAt(0);
temchar[i] = charAt;
}
char1 = temchar[7];
char2 = temchar[8];
if (temchar[9] == '0') {
temchar[7] = '1';
temchar[8] = '9';
} else {
temchar[7] = '2';
temchar[8] = '0';
}
temchar[9] = char1;
temchar[10] = char2;
temchar[11] = '\0';
CalY = 0;
for (int i = 7; i < 11; i++) {
temchar[i] = (char) (temchar[i] - 48);
CalY = (int) (CalY + temchar[i] * Math.pow(10, 10 - i));
}
CalM = 0;
if (temchar[3] == 'J' && temchar[4] == 'a' && temchar[5] == 'n') CalM = 1;
if (temchar[3] == 'F' && temchar[4] == 'e' && temchar[5] == 'b') CalM = 2;
if (temchar[3] == 'M' && temchar[4] == 'a' && temchar[5] == 'r') CalM = 3;
if (temchar[3] == 'A' && temchar[4] == 'p' && temchar[5] == 'r') CalM = 4;
if (temchar[3] == 'M' && temchar[4] == 'a' && temchar[5] == 'y') CalM = 5;
if (temchar[3] == 'J' && temchar[4] == 'u' && temchar[5] == 'n') CalM = 6;
if (temchar[3] == 'J' && temchar[4] == 'u' && temchar[5] == 'l') CalM = 7;
if (temchar[3] == 'A' && temchar[4] == 'u' && temchar[5] == 'g') CalM = 8;
if (temchar[3] == 'S' && temchar[4] == 'e' && temchar[5] == 'p') CalM = 9;
if (temchar[3] == 'O' && temchar[4] == 'c' && temchar[5] == 't') CalM = 10;
if (temchar[3] == 'N' && temchar[4] == 'o' && temchar[5] == 'v') CalM = 11;
if (temchar[3] == 'D' && temchar[4] == 'e' && temchar[5] == 'c') CalM = 12;
CalD = 0;
for (int i = 0; i < 2; i++) {
temchar[i] = (char) (temchar[i] - 48);
CalD = (int) (CalD + temchar[i] * Math.pow(10, 1 - i));
}
byte[] charByte6 = new byte[10];
SpcFile.read(charByte6);
for (int i=0; i<charByte6.length; i++) {
char charAt = convert(Arrays.copyOfRange(charByte6, i, i + 1), "char").charAt(0);
temchar[i] = charAt;
}
temchar[9] = '\0';
CalH = 0;
for (int i = 0; i < 2; i++) {
temchar[i] = (char) (temchar[i] - 48);
CalH = (int) (CalH + temchar[i] * Math.pow(10, 1 - i));
}
CalMin = 0;
for (int i = 3; i < 5; i++) {
temchar[i] = (char) (temchar[i] - 48);
CalMin = (int) (CalMin + temchar[i] * Math.pow(10, 4 - i));
}
CalS = 0;
for (int i = 6; i < 8; i++) {
temchar[i] = (char) (temchar[i] - 48);
CalS = (float) (CalS + temchar[i] * Math.pow(10, 7 - i));
}
int cal_s = (int) CalS;
int cal_ms = (int) ((CalS - cal_s) * 10);
String calibra_time = LocalDateTime.of(CalY, CalM, CalD, CalH, CalMin, cal_s, cal_ms)
.format(DateTimeFormatter.ofPattern(DateConstant.DATE_BIAS_TIME_MS));
datas.setCalibra_time(calibra_time);
// g_Energy g_Resolution
if (head1.EngPrRP > 0) { // 存在能量刻度
//从intspc能谱中读取能谱刻度信息
float[] Eng = new float[32];
float[] Cer = new float[32];
float[] FWHM = new float[32];
lOffset=(head1.EngPrRP-1)*128;
SpcFile.seek(lOffset);
byte[] cerByte = new byte[128];
byte[] engByte = new byte[128];
byte[] fwhmByte = new byte[128];
SpcFile.read(cerByte);
int j = 0;
for (int i=0; i<cerByte.length; i+=4) {
Float value = Float.valueOf(convert(Arrays.copyOfRange(cerByte, i, i+4), "float"));
Cer[j] = value;
j++;
}
SpcFile.read(engByte);
j = 0;
for (int i=0; i<engByte.length; i+=4) {
Float value = Float.valueOf(convert(Arrays.copyOfRange(engByte, i, i+4), "float"));
Eng[j] = value;
j++;
}
SpcFile.read(fwhmByte);
j = 0;
for (int i=0; i<fwhmByte.length; i+=4) {
Float value = Float.valueOf(convert(Arrays.copyOfRange(fwhmByte, i, i+4), "float"));
FWHM[j] = value;
j++;
}
short EngNum;
lOffset=(head1.CalRP1-1)*128;
SpcFile.seek( lOffset+74 );
byte[] engNumByte = new byte[2];
SpcFile.read(engNumByte);
EngNum = Short.valueOf(convert(engNumByte, "short"));
float CerUnc= 0.5f;
for(int i=0; i<EngNum; i++) {
datas.getVvEner().get(0).add(Double.valueOf(Eng[i]));
datas.getVvEner().get(1).add(Double.valueOf(Cer[i]));
datas.getVvEner().get(2).add(Double.valueOf(CerUnc));
}
if(EngNum > 1) {
int i1 = 1;
int i2 = EngNum - 2;
if(EngNum < 4) {
i1 = 0;
i2 = EngNum - 1;
}
datas.setEner_slope(Float.valueOf(Eng[i2]-Eng[i1])/(Cer[i2]-Cer[i1]));
datas.setEner_intercept((float) ((datas.getVvEner().get(0).get(i1) * datas.getVvEner().get(1).get(i2) - datas.getVvEner().get(0).get(i2) * datas.getVvEner().get(1).get(i1)) / (datas.getVvEner().get(1).get(i2) - datas.getVvEner().get(1).get(i1))));
}
for(int i=0; i<EngNum; i++) {
datas.getVvReso().get(0).add(Double.valueOf(Eng[i]));
datas.getVvReso().get(1).add(Double.valueOf(FWHM[i]*datas.getEner_slope()));
datas.getVvReso().get(2).add(Double.valueOf(CerUnc));
}
}
// g_Efficiency
if(head1.EffRP>0) { //存在效率刻度
short EffNum = 0;
lOffset=(head1.CalRP1-1)*128;
SpcFile.seek( lOffset+4 );
byte[] effByte = new byte[2];
SpcFile.read(effByte);
EffNum = Short.valueOf(convert(effByte, "short"));
float[] Eff = new float[32];//0,2,4等偶数存放能量1,3,5等奇数存放效率
float EffUnc=0.5f;
lOffset=(head1.EffRP-1)*128;
SpcFile.seek( lOffset );
byte[] effByte2 = new byte[128];
SpcFile.read(effByte2);
int j=0;
for (int i=0; i<effByte2.length; i+=4) {
Float value = Float.valueOf(convert(Arrays.copyOfRange(effByte2, i, i+4), "float"));
Eff[j] = value;
j++;
}
for(int i=0; i<EffNum; i++) {
datas.getVvEffi().get(0).add(Double.valueOf(Eff[i*2]));
datas.getVvEffi().get(1).add(Double.valueOf(Eff[i*2+1]));
datas.getVvEffi().get(2).add(Double.valueOf(EffUnc));
}
}
// Spectrum
int[] SpcData = new int[100000];
datas.setNum_count(head1.SpcChnNum);
datas.setStart_chan(head2.Chnsrt);
float EngA,EngB,EngC;
lOffset=(head1.CalRP1-1)*128;
SpcFile.seek( lOffset+20 );
byte[] engAByte = new byte[4];
SpcFile.read(engAByte);
EngA = Float.valueOf(convert(engAByte, "float"));
byte[] engBByte = new byte[4];
SpcFile.read(engBByte);
EngB = Float.valueOf(convert(engBByte, "float"));
byte[] engCByte = new byte[4];
SpcFile.read(engCByte);
EngC = Float.valueOf(convert(engCByte, "float"));
datas.setMax_energy((int) (EngA + EngB * datas.getNum_count() + EngC * Math.pow(datas.getNum_count(), 2)));
lOffset=(head1.SpcFirstRP-1)*128;
SpcFile.seek( lOffset );
byte[] spcDataByte = new byte[datas.getNum_count()*4];
SpcFile.read(spcDataByte);
int j=0;
for (int i=0; i<spcDataByte.length; i+=4) {
Integer value = Integer.valueOf(convert(Arrays.copyOfRange(spcDataByte, i, i + 4), "int"));
SpcData[j] = value;
j++;
}
for(int i=0; i<datas.getNum_count(); i++) {
datas.getVCounts().add(Long.valueOf(SpcData[i]));
}
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
try {
if (Objects.nonNull(SpcFile)) {
SpcFile.close();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
return true;
}
// bool Ftranslt::WriteSPC(QString name, FileData datas)
// {
// if(m_totalContents.isEmpty() && !AnalyseSPC())
// {
// MyMessageBox::Warning("The file standard.spc isn't exist or it's format is invalid.", this);
// return false;
// }
//
// QFile SpcFile(name);
// if(!SpcFile.open(QIODevice::WriteOnly))
// {
// qDebug() << QString("Open %1 failed when reading!").arg(name);
// return false;
// }
//
// SpcFile.write(m_totalContents);
//
// // 写第1个128字节头部指针信息
// {
// MakeSpcHead(datas);
// SpcFile.seek(0);
// SpcFile.write((char*)&m_head1, sizeof(SpcHead1));
// SpcFile.seek(Seek_SPCHead2);
// SpcFile.write((char*)&m_head2, sizeof(SpcHead2));
// }
//
// // 写第2个128字节Acquisition信息
// {
// char acq_info[128] = {' '};
//
// int offset = 16; // 16 Bytes Spectrum file name
// QString temp = GetDate(datas.acq_date);
// for(int i=0; i<temp.size(); ++i)
// {
// acq_info[i+offset] = temp.toStdString().at(i);
// }
//
// offset += 12; // 12 Bytes Acq_Date
// temp = datas.acq_time.left(8); // HH:mm:ss
// for(int i=0; i<temp.length(); ++i)
// {
// acq_info[i+offset] = temp.toStdString().at(i);
// }
//
// offset += 10; // 10 Bytes Acq_Time
// temp = QString("%1").arg(datas.acq_live, 10, 'f', 0);
// int size = temp.length() > 10 ? 10 : temp.length();
// for(int i=0; i<size; ++i)
// {
// acq_info[offset+i] = temp.toStdString().at(i);
// }
//
// offset += 10;
// temp = QString("%1").arg(datas.acq_real, 10, 'f', 0);
// size = temp.length() > 10 ? 10 : temp.length();
// for(int i=0; i<size; ++i)
// {
// acq_info[offset+i] = temp.toStdString().at(i);
// }
// SpcFile.seek((m_head1.AcqInfRP - 1) * 128);
// qDebug() << "第2个128字节: " << SpcFile.write(acq_info, 128);
// }
//
// // 写第5个128字节Germanium Calibration
// {
// MakeCalibParam(datas);
// SpcFile.seek((m_head1.CalRP1-1)*128);
// SpcFile.write((char*)&m_calibParam, sizeof(GermaniumCalib));
// }
//
// // 写第7个128字节Calibration DateTime
// {
// char cal_info[128] = {'0'};
//
// int offset = 32; // 32 Bytes Calibration file name
// QString temp = GetDate(datas.calibra_time.left(10));
// for(int i=0; i<temp.size(); ++i)
// {
// cal_info[i+offset] = temp.toStdString().at(i);
// }
//
// offset += 10; // 10 Bytes Cal_Date
// QString str = datas.calibra_time.right(10).left(8);
// for(int i=0; i<str.length(); ++i)
// {
// cal_info[i+offset] = str.toStdString().at(i);
// }
// SpcFile.seek((m_head1.CalRP2 - 1) * 128);
// qDebug() << "第7个128字节: " << SpcFile.write(cal_info, 128);
// }
//
// // 写第1113个128字节能量半高宽刻度数据
// {
// const int pairs_num = 96*CalibPairs_Byte128;
// float pairs[pairs_num];
// memset(pairs, 0.0, pairs_num);
//
// int size = m_calibParam.EngPairs, adjust;
// qDebug() << "Slope:" << datas.ener_slope;
// for(int i=0; i<size; ++i)
// {
// adjust = i / 32 * 96 + i % 32;
// pairs[adjust] = datas.vvEner.at(1).at(i);
// pairs[adjust+32] = datas.vvEner.at(0).at(i);
// //pairs[adjust+64] = datas.vvReso.at(1).at(i);
// pairs[adjust+64] = datas.vvReso.at(1).at(i)/datas.ener_slope;
// }
// SpcFile.seek((m_head1.EngPrRP-1)*128);
// SpcFile.write((char*)pairs, pairs_num*sizeof(float));
// }
//
// // 写第14个128字节效率刻度数据
// {
// int size = m_calibParam.EffPairs;
// float *Efficiency = (float *)malloc(sizeof(float)*size*2);
// for(int i=0; i<size; ++i)
// {
// Efficiency[i*2] = datas.vvEffi.at(0).at(i);
// Efficiency[i*2+1] = datas.vvEffi.at(1).at(i);
// }
// SpcFile.seek((m_head1.EffRP - 1) * 128);
// qDebug() << "第14个128字节: " << SpcFile.write((char*)Efficiency, sizeof(float)*size*2);
// free(Efficiency);
// }
//
// // 写第68个128字节Spectrum
// {
// int count_size = datas.num_count;
// DWORD *SpcData = (DWORD*)malloc(count_size*sizeof(DWORD));
// for(int i=0; i<count_size; ++i)
// {
// SpcData[i] = datas.vCounts[i];
// }
// SpcFile.seek((m_head1.SpcFirstRP-1)*128);
// SpcFile.write((char*)SpcData, count_size*sizeof(DWORD));
// free(SpcData);
// }
//
// SpcFile.close();
//
// return true;
// }
public static String convert(byte[] bytes, String type) {
List<String> values = new LinkedList<>();
for (int i=0; i<bytes.length; i++) {
byte b = bytes[i];
int decimalValue = Byte.toUnsignedInt(b); // 将byte转换为十进制
String hexString = Integer.toHexString(decimalValue);// 十进制转十六进制
values.add(hexString);
}
String index = "";
for (int i=values.size()-1; i>=0; i--) {
if (values.get(i).length() == 1) {
index+="0"+values.get(i);
} else {
index+=values.get(i);
}
}
if (type.equalsIgnoreCase("short")) {
short shortValue = new BigInteger(index, 16).shortValue();
return String.valueOf(shortValue);
} else if (type.equalsIgnoreCase("int")) {
int intValue = new BigInteger(index, 16).intValue();
return String.valueOf(intValue);
} else if (type.equalsIgnoreCase("char")) {
int decimal = Integer.parseInt(index, 16);
char charValue = (char) decimal;
return String.valueOf(charValue);
} else if (type.equalsIgnoreCase("float")){
float floatValue = Float.intBitsToFloat(new BigInteger(index, 16).intValue());
return String.valueOf(floatValue);
} else if (type.equalsIgnoreCase("double")) {
double doubleValue = Double.longBitsToDouble(Long.parseLong(index, 16));
return String.valueOf(doubleValue);
}
return "";
}
}

View File

@ -24,14 +24,14 @@ public class FileData implements Serializable {
private String transmit; // transmit time (yyyy/mm/dd hh:mm:ss.s)
private String collect_start; // collection start time (yyyy/mm/dd hh:mm:ss.s)
private String collect_stop; // collection stop time (yyyy/mm/dd hh:mm:ss.s)
private Double air_volume; // total air volume sampled (standard cubic meters [scm])
private float air_volume; // total air volume sampled (standard cubic meters [scm])
private String acq_date; // acquisition start date (yyyy/mm/dd)
private String acq_time; // acquisition start time (hh:mm:ss.s)
private Double acq_real; // acquisition real time (s)
private Double acq_live; // acquisition live time (s)
private float acq_real; // acquisition real time (s)
private float acq_live; // acquisition live time (s)
private String calibra_time; // time of last calibration (yyyy/mm/dd hh:mm:ss.s)
private Double ener_slope; // slope of energy calibration
private Double ener_intercept; // intercept of energy calibration
private float ener_slope; // slope of energy calibration
private float ener_intercept; // intercept of energy calibration
private int start_chan; // begin of channels
private int num_count; // number of channels
private int max_energy; // energy span
@ -56,14 +56,14 @@ public class FileData implements Serializable {
transmit = "";
collect_start = "";
collect_stop = "";
air_volume = 0.0;
air_volume = 0.0f;
acq_date = "";
acq_time = "";
acq_real = 0.0;
acq_live = 0.0;
acq_real = 0.0f;
acq_live = 0.0f;
calibra_time = "";
ener_slope = 1.0;
ener_intercept = 0.0;
ener_slope = 1.0f;
ener_intercept = 0.0f;
start_chan = 0;
num_count = 0;
max_energy = 0;

View File

@ -17,14 +17,14 @@ public class SpcHead2 {
Mcadvt = 0;
}
public short AddRAM; //40:用于补足内存
public short Seqnum; //41:Sequence number
public short Mcanu; //42:MCA number as two ASCII characters(old) or Detector
public short AddRAM; //40:用于补足内存
public short Seqnum; //41:Sequence number
public short Mcanu; //42:MCA number as two ASCII characters(old) or Detector
// number as integer for systems with Connections
public short Segnum; //43:Segment number as two ASCII characters(old)
public short Segnum; //43:Segment number as two ASCII characters(old)
// or as integer value 1 for systems with Connections
public short Mcadvt; //44:MCA device type
public short Chnsrt; //45:Start channel number
public float RealTime; //46,47:Real Time in seconds
public float LiveTime; //48,49:Live time in seconds
public short Mcadvt; //44:MCA device type
public short Chnsrt; //45:Start channel number
public float RealTime; //46,47:Real Time in seconds
public float LiveTime; //48,49:Live time in seconds
}

View File

@ -213,8 +213,8 @@ public class Demo {
String acq_time = LocalTime.of(AcqH, AcqMin, seconds, ms)
.format(DateTimeFormatter.ofPattern(DateConstant.TIME_MS));
fileData.setAcq_time(acq_time);
fileData.setAcq_real((double) head2.RealTime);
fileData.setAcq_live((double) head2.LiveTime);
fileData.setAcq_real(head2.RealTime);
fileData.setAcq_live(head2.LiveTime);
// Calibration
// 从intspc能谱中读取能谱刻度时间
@ -350,8 +350,8 @@ public class Demo {
i1 = 0;
i2 = EngNum - 1;
}
fileData.setEner_slope(Double.valueOf(Eng[i2]-Eng[i1])/(Cer[i2]-Cer[i1]));
fileData.setEner_intercept(Double.valueOf(fileData.getVvEner().get(0).get(i1) * fileData.getVvEner().get(1).get(i2) - fileData.getVvEner().get(0).get(i2) * fileData.getVvEner().get(1).get(i1)) / (fileData.getVvEner().get(1).get(i2) - fileData.getVvEner().get(1).get(i1)));
fileData.setEner_slope(Float.valueOf(Eng[i2]-Eng[i1])/(Cer[i2]-Cer[i1]));
fileData.setEner_intercept((float) ((fileData.getVvEner().get(0).get(i1) * fileData.getVvEner().get(1).get(i2) - fileData.getVvEner().get(0).get(i2) * fileData.getVvEner().get(1).get(i1)) / (fileData.getVvEner().get(1).get(i2) - fileData.getVvEner().get(1).get(i1))));
}
for(int i=0; i<EngNum; i++) {
@ -445,8 +445,8 @@ public class Demo {
}
String index = "";
for (int i=values.size()-1; i>=0; i--) {
if (values.get(i).equals("0")) {
index+="00";
if (values.get(i).length() == 1) {
index+="0"+values.get(i);
} else {
index+=values.get(i);
}