float类型数据换成double后精度问题导致计算错误修改
读取Spc文件方法实现
This commit is contained in:
parent
191bff95ab
commit
774dc70ab6
|
@ -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);
|
||||
// }
|
||||
//
|
||||
// // 写第11—13个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 "";
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user