修改读取Spc文件方法

修改Extrapolation分析接口中返回内容字母大小写问题
This commit is contained in:
qiaoqinzheng 2023-10-19 09:33:41 +08:00
parent 6a456f7b8f
commit 191bff95ab
7 changed files with 398 additions and 250 deletions

View File

@ -1,91 +0,0 @@
package org.jeecg.modules.base.entity;
import lombok.Data;
@Data
public class SpcHead1 {
public SpcHead1() {
// 需根据谱改变
EngPrNum = 3;
EffNum = 0;
SpcRecNum = 0;
SpcChnNum = 0;
// 重要指针
AcqInfRP = 2;
CalRP1 = 5;
CalRP2 = 7;
EffRP = 14;
EngPrRP = 11;
SpcFirstRP = 68;
Inftyp = 1;
Filtyp = 1;
Reserved1 = 1;
Reserved2 = 0;
SamDesRP = 3;
DetDesRP = 4;
EbrDesRP = 0;
AnaRP1 = 31;
AnaRP2 = 37;
AnaRP3 = 46;
AnaRP4 = 56;
SrpDesRP = 0;
IeqDesRP = 0;
GeoDesRP = 0;
MpcDesRP = 0;
CalDesRP = 10;
ROI1 = 65;
Reserved3 = 0;
DDP = 0;
ActUnit = 0;
LabPerRP = 55;
MaxNumE = 323;
MaxNumU = 323;
Abstch = 0;
AcqTime = 12631.7f;
AcqTime8 = 12631.7;
}
public short Inftyp; //1:整形SPC文件的标志 必须为1
public short Filtyp; //2:整形SPC文件的标志 必须为1
public short Reserved1; //3:Reserved
public short Reserved2; //4:Reserved
public short AcqInfRP; //5:Acquisition Information Record pointer
public short SamDesRP; //6:Sample Description Record pointer
public short DetDesRP; //7:Detector Description Record pointer
public short EbrDesRP; //8:EBAR Description Record
public short AnaRP1; //9:First Analysis Parameters Record pointer
public short AnaRP2; //10:Second Analysis Parameters Record pointer
public short AnaRP3; //11:Third Analysis Parameters Record pointer
public short AnaRP4; //12:Fourth Analysis Parameters Record pointer
public short SrpDesRP; //13:Absorption Correction Description Record pointer
public short IeqDesRP; //14:IEQ Description Record pointer
public short GeoDesRP; //15:Geometry Correction Description Record pointer
public short MpcDesRP; //16:MPC Description Record pointer
public short CalDesRP; //17:Calibration Description Record pointer
public short CalRP1; //18:First Calibration Data Record pointer
public short CalRP2; //19:Second Calibration Data Record pointer
public short EffRP; //20:Efficiency Pairs Record pointer(first record)
public short ROI1; //21:Record Number of the first of the two ROI records
public short EngPrRP; //22:Energe pairs record pointer
public short EngPrNum; //23:Number of energy pair records
public short Reserved3; //24:Reserved
public short DDP; //25:Disable deconvolution of unknown peaks
public short ActUnit; //26:True=microCuries,false=becquerels
public short LabPerRP; //27:Laboratory and operator name record pointer
public short MaxNumE; //28:Maximum Record Number Ever Used
public short MaxNumU; //29:Maximum Record Number In Use
public short EffNum; //30:Number of Efficiency Pairs Records(See public short 20)
public short SpcFirstRP; //31:Spectrum Record pointer (pointer to first record)
public short SpcRecNum; //32:Number of records in the spectrum
public short SpcChnNum; //33:Number of channels in spectrum
public short Abstch; //34:Physical start channel for data
public float AcqTime; //35,36:Date and Time of acquisition start in DECDAY format
public double AcqTime8; //37,40:Date and Time as double precision DECDAY
}

View File

@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.jeecg.common.enums.FtransitEnum; import org.jeecg.common.enums.FtransitEnum;
import org.jeecg.modules.entity.vo.FileData; import org.jeecg.modules.entity.vo.FileData;
import org.jeecg.modules.entity.vo.SpcHead1;
import org.jeecg.modules.entity.vo.SpcHead2;
import org.jeecg.modules.native_jni.EnergySpectrumHandler; import org.jeecg.modules.native_jni.EnergySpectrumHandler;
import org.jeecg.modules.native_jni.struct.EnergySpectrumStruct; import org.jeecg.modules.native_jni.struct.EnergySpectrumStruct;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;

View File

@ -54,9 +54,9 @@ public class GammaFileUtil extends AbstractLogOrReport {
private SpectrumPathProperties spectrumPathProperties; private SpectrumPathProperties spectrumPathProperties;
@Autowired @Autowired
private NameStandUtil nameStandUtil; private NameStandUtil nameStandUtil;
@Autowired @Autowired
private AnalysisProcess analysisProcess; private AnalysisProcess analysisProcess;
public boolean loadFile(String pathName, String fileName, PHDFile phd, Result result) { public boolean loadFile(String pathName, String fileName, PHDFile phd, Result result) {
phd.setFilepath(pathName); phd.setFilepath(pathName);
phd.setFilename(fileName); phd.setFilename(fileName);
@ -1366,7 +1366,7 @@ public class GammaFileUtil extends AbstractLogOrReport {
try { try {
String phdStr = mapper.writeValueAsString(phd); String phdStr = mapper.writeValueAsString(phd);
String nuclideLinesMap = mapper.writeValueAsString(mapLines); String nuclideLinesMap = mapper.writeValueAsString(mapLines);
String strValue = CalValuesHandler.analyseSpectrum(phdStr, nuclideLinesMap, tmpFile.getAbsolutePath(), null); String strValue = CalValuesHandler.analyseSpectrum(phdStr, nuclideLinesMap, tmpFile.getAbsolutePath(), analysisProcess);
Map<String, Object> parseMap = JSON.parseObject(strValue, Map.class); Map<String, Object> parseMap = JSON.parseObject(strValue, Map.class);
for (Map.Entry<String, Object> entry:parseMap.entrySet()) { for (Map.Entry<String, Object> entry:parseMap.entrySet()) {
if (entry.getKey().equalsIgnoreCase("bAnalyed")) { if (entry.getKey().equalsIgnoreCase("bAnalyed")) {

View File

@ -0,0 +1,92 @@
package org.jeecg.modules.entity.vo;
import lombok.Data;
@Data
public class SpcHead1 {
public SpcHead1() {
// 需根据谱改变
EngPrNum = 3;
EffNum = 0;
SpcRecNum = 0;
SpcChnNum = 0;
// 重要指针
AcqInfRP = 2;
CalRP1 = 5;
CalRP2 = 7;
EffRP = 14;
EngPrRP = 11;
SpcFirstRP = 68;
Inftyp = 1;
Filtyp = 1;
Reserved1 = 1;
Reserved2 = 0;
SamDesRP = 3;
DetDesRP = 4;
EbrDesRP = 0;
AnaRP1 = 31;
AnaRP2 = 37;
AnaRP3 = 46;
AnaRP4 = 56;
SrpDesRP = 0;
IeqDesRP = 0;
GeoDesRP = 0;
MpcDesRP = 0;
CalDesRP = 10;
ROI1 = 65;
Reserved3 = 0;
DDP = 0;
ActUnit = 0;
LabPerRP = 55;
MaxNumE = 323;
MaxNumU = 323;
Abstch = 0;
AcqTime = 12631.7f;
AcqTime8 = 12631.7;
}
public short Inftyp; //1:整形SPC文件的标志 必须为1
public short Filtyp; //2:整形SPC文件的标志 必须为1
public short Reserved1; //3:Reserved
public short Reserved2; //4:Reserved
public short AcqInfRP; //5:Acquisition Information Record pointer
public short SamDesRP; //6:Sample Description Record pointer
public short DetDesRP; //7:Detector Description Record pointer
public short EbrDesRP; //8:EBAR Description Record
public short AnaRP1; //9:First Analysis Parameters Record pointer
public short AnaRP2; //10:Second Analysis Parameters Record pointer
public short AnaRP3; //11:Third Analysis Parameters Record pointer
public short AnaRP4; //12:Fourth Analysis Parameters Record pointer
public short SrpDesRP; //13:Absorption Correction Description Record pointer
public short IeqDesRP; //14:IEQ Description Record pointer
public short GeoDesRP; //15:Geometry Correction Description Record pointer
public short MpcDesRP; //16:MPC Description Record pointer
public short CalDesRP; //17:Calibration Description Record pointer
public short CalRP1; //18:First Calibration Data Record pointer
public short CalRP2; //19:Second Calibration Data Record pointer
public short EffRP; //20:Efficiency Pairs Record pointer(first record)
public short ROI1; //21:Record Number of the first of the two ROI records
public short EngPrRP; //22:Energe pairs record pointer
public short EngPrNum; //23:Number of energy pair records
public short Reserved3; //24:Reserved
public short DDP; //25:Disable deconvolution of unknown peaks
public short ActUnit; //26:True=microCuries,false=becquerels
public short LabPerRP; //27:Laboratory and operator name record pointer
public short MaxNumE; //28:Maximum Record Number Ever Used
public short MaxNumU; //29:Maximum Record Number In Use
public short EffNum; //30:Number of Efficiency Pairs Records(See public short 20)
public short SpcFirstRP; //31:Spectrum Record pointer (pointer to first record)
public short SpcRecNum; //32:Number of records in the spectrum
public short SpcChnNum; //33:Number of channels in spectrum
public short Abstch; //34:Physical start channel for data
public float AcqTime; //35,36:Date and Time of acquisition start in DECDAY format
public double AcqTime8; //37,40:Date and Time as double precision DECDAY
}

View File

@ -1,4 +1,4 @@
package org.jeecg.modules.base.entity; package org.jeecg.modules.entity.vo;
import lombok.Data; import lombok.Data;

View File

@ -1,73 +1,133 @@
package org.jeecg.modules.controller; package org.jeecg.modules.controller;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.jeecg.common.constant.DateConstant; import org.jeecg.common.constant.DateConstant;
import org.jeecg.modules.base.entity.SpcHead1; import org.jeecg.modules.entity.vo.SpcHead1;
import org.jeecg.modules.base.entity.SpcHead2; import org.jeecg.modules.entity.vo.SpcHead2;
import org.jeecg.modules.entity.vo.FileData; import org.jeecg.modules.entity.vo.FileData;
import java.io.IOException; import java.io.*;
import java.io.RandomAccessFile; import java.lang.reflect.Array;
import java.math.BigInteger;
import java.nio.*; import java.nio.*;
import java.nio.charset.CharacterCodingException; import java.nio.charset.CharacterCodingException;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.LocalTime; import java.time.LocalTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.ArrayList; import java.util.Arrays;
import java.util.LinkedList;
import static java.lang.Math.pow; import java.util.List;
public class Demo { public class Demo {
public static void main(String[] args) throws IOException { public static void main(String[] args) throws IOException {
FileData fileData = new FileData(); FileData fileData = new FileData();
String filePath = "C:\\Users\\a\\Desktop\\shift\\standard.SPC"; String filePath = "D:\\ARMD\\材料\\201809160001P.SPC";
// r:只读 rw:读写 // r:只读 rw:读写
RandomAccessFile SpcFile = new RandomAccessFile(filePath, "r"); RandomAccessFile SpcFile = new RandomAccessFile(filePath, "r");
short Inftyp; //读取第一个数据
short Filtyp; byte[] first = new byte[2];
byte[] buffer = new byte[2]; SpcFile.read(first);
SpcFile.read(buffer); short Inftyp = Short.valueOf(convert(first, "short"));
Inftyp = byteToShort(buffer); //读取第二个数据
SpcFile.read(buffer); byte[] second = new byte[2];
Filtyp = byteToShort(buffer); SpcFile.read(second);
if (Inftyp != 1 || Filtyp != 1) return; short Filtyp = Short.valueOf(convert(second, "short"));
if (Inftyp != 1 || Filtyp != 1) {
return;
}
// 读入整形spc文件的头记录(第一个记录)128字节 // 读入整形spc文件的头记录(第一个记录)128字节
SpcHead1 head1 = new SpcHead1(); SpcHead1 head1 = new SpcHead1();
SpcHead2 head2 = new SpcHead2(); SpcHead2 head2 = new SpcHead2();
SpcFile.seek(0); 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 // Acquisition
// 从intspc能谱中读取能谱开测时间 //从intspc能谱中读取能谱开测时间
int AcqY, AcqM, AcqD, AcqH, AcqMin; int AcqY,AcqM,AcqD,AcqH,AcqMin;
float AcqS, AcqRT, AcqLT; float AcqS,AcqRT,AcqLT;
byte[] temByte = new byte[200 * 2]; char[] temchar = new char[200];
int lOffset; int lOffset;
lOffset = (head1.AcqInfRP - 1) * 128;
SpcFile.seek((lOffset + 16) * 2);
SpcFile.read(temByte, 0, 12 * 2);
char[] temchar = byteToChar(temByte);
char char1, char2;
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';
AcqY = 0; lOffset=(head1.AcqInfRP-1)*128;
for (int i = 7; i < 11; i++) { SpcFile.seek(lOffset+16);
temchar[i] = (char) (temchar[i] - 48); byte[] charByte1 = new byte[12];
AcqY = (int) (AcqY + temchar[i] * pow(10, 10 - i)); 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; AcqM = 0;
@ -87,49 +147,62 @@ public class Demo {
AcqD = 0; AcqD = 0;
for (int i = 0; i < 2; i++) { for (int i = 0; i < 2; i++) {
temchar[i] = (char) (temchar[i] - 48); temchar[i] = (char) (temchar[i] - 48);
AcqD = (int) (AcqD + temchar[i] * pow(10, 1 - i)); AcqD = (int) (AcqD + temchar[i] * Math.pow(10, 1 - i));
} }
SpcFile.read(temByte, 0 ,10 * 2); byte[] charByte2 = new byte[10];
temchar = byteToChar(temByte); 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'; temchar[9] = '\0';
AcqH = 0; AcqH = 0;
for (int i = 0; i < 2; i++) { for (int i = 0; i < 2; i++) {
temchar[i] = (char) (temchar[i] - 48); temchar[i] = (char) (temchar[i] - 48);
AcqH = (int) (AcqH + temchar[i] * pow(10, 1 - i)); AcqH = (int) (AcqH + temchar[i] * Math.pow(10, 1 - i));
} }
AcqMin = 0; AcqMin = 0;
for (int i = 3; i < 5; i++) { for (int i = 3; i < 5; i++) {
temchar[i] = (char) (temchar[i] - 48); temchar[i] = (char) (temchar[i] - 48);
AcqMin = (int) (AcqMin + temchar[i] * pow(10, 4 - i)); AcqMin = (int) (AcqMin + temchar[i] * Math.pow(10, 4 - i));
} }
AcqS = 0; AcqS = 0;
for (int i = 6; i < 8; i++) { for (int i = 6; i < 8; i++) {
temchar[i] = (char) (temchar[i] - 48); temchar[i] = (char) (temchar[i] - 48);
AcqS = (float) (AcqS + temchar[i] * pow(10, 7 - i)); AcqS = (float) (AcqS + temchar[i] * Math.pow(10, 7 - i));
} }
AcqLT = 0; AcqLT = 0;
SpcFile.read(temByte, 0, 10 * 2); byte[] charByte3 = new byte[10];
temchar = byteToChar(temByte); 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++) { for (int i = 0; i < 10; i++) {
if (temchar[i] == 32) { if (temchar[i] == 32) {
temchar[i] = 0; temchar[i] = 0;
} else { } else {
temchar[i] = (char) (temchar[i] - 48); temchar[i] = (char) (temchar[i] - 48);
} }
AcqLT = (float) (AcqLT + temchar[i] * pow(10, 9 - i)); AcqLT = (float) (AcqLT + temchar[i] * Math.pow(10, 9 - i));
} }
AcqRT = 0; AcqRT = 0;
SpcFile.read(temByte, 0, 10 * 2); byte[] charByte4 = new byte[10];
temchar = byteToChar(temByte); 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++) { for (int i = 0; i < 10; i++) {
if (temchar[i] == 32) if (temchar[i] == 32) {
temchar[i] = 0; temchar[i] = 0;
else } else {
temchar[i] = (char) (temchar[i] - 48); temchar[i] = (char) (temchar[i] - 48);
AcqRT = (float) (AcqRT + temchar[i] * pow(10, 9 - i)); }
AcqRT = (float) (AcqRT + temchar[i] * Math.pow(10, 9 - i));
} }
int seconds = (int) AcqS; int seconds = (int) AcqS;
@ -147,11 +220,14 @@ public class Demo {
// 从intspc能谱中读取能谱刻度时间 // 从intspc能谱中读取能谱刻度时间
int CalY, CalM, CalD, CalH, CalMin; int CalY, CalM, CalD, CalH, CalMin;
float CalS; float CalS;
lOffset = (head1.CalRP2 - 1) * 128; lOffset = (head1.CalRP2 - 1) * 128;
SpcFile.seek((lOffset + 32) * 2); SpcFile.seek(lOffset + 32);
SpcFile.read(temByte, 0, 10 * 2); byte[] charByte5 = new byte[10];
temchar = byteToChar(temByte); 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]; char1 = temchar[7];
char2 = temchar[8]; char2 = temchar[8];
if (temchar[9] == '0') { if (temchar[9] == '0') {
@ -168,9 +244,10 @@ public class Demo {
CalY = 0; CalY = 0;
for (int i = 7; i < 11; i++) { for (int i = 7; i < 11; i++) {
temchar[i] = (char) (temchar[i] - 48); temchar[i] = (char) (temchar[i] - 48);
CalY = (int) (CalY + temchar[i] * pow(10, 10 - i)); 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] == 'J' && temchar[4] == 'a' && temchar[5] == 'n') CalM = 1;
if (temchar[3] == 'F' && temchar[4] == 'e' && temchar[5] == 'b') CalM = 2; 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] == 'M' && temchar[4] == 'a' && temchar[5] == 'r') CalM = 3;
@ -187,28 +264,31 @@ public class Demo {
CalD = 0; CalD = 0;
for (int i = 0; i < 2; i++) { for (int i = 0; i < 2; i++) {
temchar[i] = (char) (temchar[i] - 48); temchar[i] = (char) (temchar[i] - 48);
CalD = (int) (CalD + temchar[i] * pow(10, 1 - i)); CalD = (int) (CalD + temchar[i] * Math.pow(10, 1 - i));
} }
CalM = 0; byte[] charByte6 = new byte[10];
SpcFile.read(temByte, 0, 10 * 2); SpcFile.read(charByte6);
temchar = byteToChar(temByte); 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'; temchar[9] = '\0';
CalH = 0; CalH = 0;
for (int i = 0; i < 2; i++) { for (int i = 0; i < 2; i++) {
temchar[i] = (char) (temchar[i] - 48); temchar[i] = (char) (temchar[i] - 48);
CalH = (int) (CalH + temchar[i] * pow(10, 1 - i)); CalH = (int) (CalH + temchar[i] * Math.pow(10, 1 - i));
} }
CalMin = 0; CalMin = 0;
for (int i = 3; i < 5; i++) { for (int i = 3; i < 5; i++) {
temchar[i] = (char) (temchar[i] - 48); temchar[i] = (char) (temchar[i] - 48);
CalMin = (int) (CalMin + temchar[i] * pow(10, 4 - i)); CalMin = (int) (CalMin + temchar[i] * Math.pow(10, 4 - i));
} }
CalS = 0; CalS = 0;
for (int i = 6; i < 8; i++) { for (int i = 6; i < 8; i++) {
temchar[i] = (char) (temchar[i] - 48); temchar[i] = (char) (temchar[i] - 48);
CalS = (float) (CalS + temchar[i] * pow(10, 7 - i)); CalS = (float) (CalS + temchar[i] * Math.pow(10, 7 - i));
} }
int cal_s = (int) CalS; int cal_s = (int) CalS;
@ -218,114 +298,178 @@ public class Demo {
fileData.setCalibra_time(calibra_time); fileData.setCalibra_time(calibra_time);
// g_Energy g_Resolution // g_Energy g_Resolution
if (head1.EngPrRP > 0) // 存在能量刻度 if (head1.EngPrRP > 0) { // 存在能量刻度
{ //从intspc能谱中读取能谱刻度信息
// 从intspc能谱中读取能谱刻度信息 float[] Eng = new float[32];
byte[] cerByte = new byte[32 * 4]; float[] Cer = new float[32];
byte[] engByte = new byte[32 * 4]; float[] FWHM = new float[32];
byte[] fWHMByte = new byte[32 * 4];
lOffset = (head1.EngPrRP - 1) * 128; lOffset=(head1.EngPrRP-1)*128;
SpcFile.seek(lOffset * 2L); SpcFile.seek(lOffset);
SpcFile.read(cerByte, 0, 128 * 2); byte[] cerByte = new byte[128];
float[] Cer = byteToFloats(cerByte); byte[] engByte = new byte[128];
SpcFile.read(engByte, 0, 128 * 2); byte[] fwhmByte = new byte[128];
float[] Eng = byteToFloats(engByte); SpcFile.read(cerByte);
SpcFile.read(fWHMByte, 0, 128 * 2); int j = 0;
float[] FWHM = byteToFloats(fWHMByte); for (int i=0; i<cerByte.length; i+=4) {
Float value = Float.valueOf(convert(Arrays.copyOfRange(cerByte, i, i+4), "float"));
short EngNum; Cer[j] = value;
byte[] engNumByte = new byte[4]; j++;
lOffset = (head1.CalRP1 - 1) * 128;
SpcFile.seek((lOffset + 74) * 2L);
SpcFile.read(engNumByte, 0, 2 * 2);
EngNum = byteToShort(engNumByte);
float CerUnc = 0.5F;
for (int i = 0; i < EngNum; i++) {
fileData.getVvEner().get(0).add((double) Eng[i]);
fileData.getVvEner().get(1).add((double) Cer[i]);
fileData.getVvEner().get(2).add((double) CerUnc);
} }
if (EngNum > 1) { SpcFile.read(engByte);
int i1 = 1, i2 = EngNum - 2; j = 0;
if (EngNum < 4) { 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++) {
fileData.getVvEner().get(0).add(Double.valueOf(Eng[i]));
fileData.getVvEner().get(1).add(Double.valueOf(Cer[i]));
fileData.getVvEner().get(2).add(Double.valueOf(CerUnc));
}
if(EngNum > 1) {
int i1 = 1;
int i2 = EngNum - 2;
if(EngNum < 4) {
i1 = 0; i1 = 0;
i2 = EngNum - 1; i2 = EngNum - 1;
} }
fileData.setEner_slope((double) ((Eng[i2] - Eng[i1]) / (Cer[i2] - Cer[i1]))); fileData.setEner_slope(Double.valueOf(Eng[i2]-Eng[i1])/(Cer[i2]-Cer[i1]));
double v1 = fileData.getVvEner().get(0).get(i1) * fileData.getVvEner().get(1).get(i2); 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)));
double v2 = fileData.getVvEner().get(0).get(i2) * fileData.getVvEner().get(1).get(i1);
double v3 = fileData.getVvEner().get(1).get(i2) - fileData.getVvEner().get(1).get(i1);
fileData.setEner_intercept((v1 - v2) / v3);
} }
for (int i = 0; i < EngNum; i++) { for(int i=0; i<EngNum; i++) {
fileData.getVvReso().get(0).add((double) Eng[i]); fileData.getVvReso().get(0).add(Double.valueOf(Eng[i]));
fileData.getVvReso().get(1).add(FWHM[i] * fileData.getEner_slope()); fileData.getVvReso().get(1).add(Double.valueOf(FWHM[i]*fileData.getEner_slope()));
fileData.getVvReso().get(2).add((double) CerUnc); fileData.getVvReso().get(2).add(Double.valueOf(CerUnc));
} }
} }
// g_Efficiency // g_Efficiency
if (head1.EffRP > 0) { // 存在效率刻度 if(head1.EffRP>0) { //存在效率刻度
byte[] effNumByte = new byte[4]; short EffNum = 0;
lOffset = (head1.CalRP1 - 1) * 128; lOffset=(head1.CalRP1-1)*128;
SpcFile.seek((lOffset + 4) * 2L); SpcFile.seek( lOffset+4 );
SpcFile.read(effNumByte,0,2); byte[] effByte = new byte[2];
short EffNum = byteToShort(effNumByte); SpcFile.read(effByte);
EffNum = Short.valueOf(convert(effByte, "short"));
// 0,2,4等偶数存放能量1,3,5等奇数存放效率 float[] Eff = new float[32];//0,2,4等偶数存放能量1,3,5等奇数存放效率
byte[] effByte = new byte[32 * 4]; float EffUnc=0.5f;
float EffUnc = 0.5F;
lOffset = (head1.EffRP - 1) * 128; lOffset=(head1.EffRP-1)*128;
SpcFile.seek(lOffset * 2L); SpcFile.seek( lOffset );
SpcFile.read(effByte, 0, 128 * 2); byte[] effByte2 = new byte[128];
float[] Eff = byteToFloats(effByte); 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++) { for(int i=0; i<EffNum; i++) {
fileData.getVvEffi().get(0).add((double) Eff[i * 2]); fileData.getVvEffi().get(0).add(Double.valueOf(Eff[i*2]));
fileData.getVvEffi().get(1).add((double) Eff[i * 2 + 1]); fileData.getVvEffi().get(1).add(Double.valueOf(Eff[i*2+1]));
fileData.getVvEffi().get(2).add((double) EffUnc); fileData.getVvEffi().get(2).add(Double.valueOf(EffUnc));
} }
} }
// Spectrum // Spectrum
byte[] SpcDataByte = new byte[100000]; int[] SpcData = new int[100000];
fileData.setNum_count(head1.SpcChnNum); fileData.setNum_count(head1.SpcChnNum);
fileData.setStart_chan(head2.Chnsrt); fileData.setStart_chan(head2.Chnsrt);
float EngA, EngB, EngC; float EngA,EngB,EngC;
byte[] engAByte = new byte[8]; lOffset=(head1.CalRP1-1)*128;
byte[] engBByte = new byte[8]; SpcFile.seek( lOffset+20 );
byte[] engCByte = new byte[8];
lOffset = (head1.CalRP1 - 1) * 128;
SpcFile.seek((lOffset + 20) * 2L);
SpcFile.read(engAByte,0, 4 * 2);
SpcFile.read(engBByte,0, 4 * 2);
SpcFile.read(engCByte,0, 4 * 2);
EngA = byteToFloat(engAByte);
EngB = byteToFloat(engBByte);
EngC = byteToFloat(engCByte);
int numCount = fileData.getNum_count();
int max_energy = (int) (EngA + EngB * numCount +
EngC * pow(numCount, 2));
fileData.setMax_energy(max_energy);
lOffset = (head1.SpcFirstRP - 1) * 128; byte[] engAByte = new byte[4];
SpcFile.seek(lOffset * 2L); SpcFile.read(engAByte);
SpcFile.read(SpcDataByte, 0, numCount * 4 * 2); EngA = Float.valueOf(convert(engAByte, "float"));
int[] SpcData = byteToInts(SpcDataByte);
for (int i = 0; i < numCount; i++) { byte[] engBByte = new byte[4];
fileData.getVCounts().add((long) SpcData[i]); SpcFile.read(engBByte);
EngB = Float.valueOf(convert(engBByte, "float"));
byte[] engCByte = new byte[4];
SpcFile.read(engCByte);
EngC = Float.valueOf(convert(engCByte, "float"));
fileData.setMax_energy((int) (EngA + EngB * fileData.getNum_count() + EngC * Math.pow(fileData.getNum_count(), 2)));
lOffset=(head1.SpcFirstRP-1)*128;
SpcFile.seek( lOffset );
byte[] spcDataByte = new byte[fileData.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<fileData.getNum_count(); i++) {
fileData.getVCounts().add(Long.valueOf(SpcData[i]));
}
ObjectMapper mapper = new ObjectMapper();
String writeValueAsString = mapper.writeValueAsString(fileData);
System.out.println(writeValueAsString);
SpcFile.close(); SpcFile.close();
} }
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).equals("0")) {
index+="00";
} 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 "";
}
public static char[] byteToChar(byte[] data) throws CharacterCodingException { public static char[] byteToChar(byte[] data) throws CharacterCodingException {
/*return new String(data, StandardCharsets.UTF_16).toCharArray();*/ /*return new String(data, StandardCharsets.UTF_16).toCharArray();*/
@ -377,4 +521,5 @@ public class Demo {
buffer.order(ByteOrder.LITTLE_ENDIAN); buffer.order(ByteOrder.LITTLE_ENDIAN);
return buffer.getShort(); return buffer.getShort();
} }
} }

View File

@ -2290,9 +2290,9 @@ public class SpectrumAnalysisServiceImpl implements ISpectrumAnalysisService {
right.setY(rData.get(0)); right.setY(rData.get(0));
line_serise_data.add(left); line_serise_data.add(left);
line_serise_data.add(right); line_serise_data.add(right);
functionFit = "Y = A*X + B "; functionFit = "y = a*x + b ";
if (scatter_serise_data.size()>1) { if (scatter_serise_data.size()>1) {
functionFit = String.format("Y = %f*X + %f ", fittingPara.get(0), fittingPara.get(1)); functionFit = String.format("y = %f*x + %f ", fittingPara.get(0), fittingPara.get(1));
} }
} else if(fittype.equals("poly2")) { } else if(fittype.equals("poly2")) {
for(int i=1;i<51;i++) { for(int i=1;i<51;i++) {
@ -2305,12 +2305,12 @@ public class SpectrumAnalysisServiceImpl implements ISpectrumAnalysisService {
temp.setY(rData.get(0)); temp.setY(rData.get(0));
line_serise_data.add(temp); line_serise_data.add(temp);
} }
functionFit = "Y = A+ B*X + C*X^2 "; functionFit = "y = a+ b*x + c*x^2 ";
if (scatter_serise_data.size()>1) { if (scatter_serise_data.size()>1) {
functionFit = String.format("Y = %f+ %f*X + C*%f^2 ",fittingPara.get(0),fittingPara.get(1),fittingPara.get(2)); functionFit = String.format("y = %f+ %f*x + %f*x^2 ",fittingPara.get(0),fittingPara.get(1),fittingPara.get(2));
} }
} else if(fittype.equals("poly3")) { } else if(fittype.equals("poly3")) {
functionFit = "Y = A+ B*X + C*X^2 +D*X^3 "; functionFit = "y = a+ b*x + c*x^2 +d*x^3 ";
} }
List<TableExtData> extDataList = new LinkedList<>(); List<TableExtData> extDataList = new LinkedList<>();
for(int i=0;i<Nx.size()&&i<Ny.size()&&i<Eb.size();i++) { for(int i=0;i<Nx.size()&&i<Ny.size()&&i<Eb.size();i++) {
@ -2321,11 +2321,11 @@ public class SpectrumAnalysisServiceImpl implements ISpectrumAnalysisService {
extData.setNy( Double.valueOf(NumberFormatUtil.numberFormat(String.valueOf(Ny.get(i)))) ); extData.setNy( Double.valueOf(NumberFormatUtil.numberFormat(String.valueOf(Ny.get(i)))) );
extDataList.add(extData); extDataList.add(extData);
} }
String refTime = "Reference Time: "; String refTime = "";
String xeAct = "Xe Activity (Bq): "; String xeAct = "";
if (scatter_serise_data.size()>1) { if (scatter_serise_data.size()>1) {
refTime = String.format("Reference Time: %s ",sampleTmp.acquisition_start_date+" "+sampleTmp.acquisition_start_time); refTime = sampleTmp.acquisition_start_date+" "+sampleTmp.acquisition_start_time;
xeAct = String.format("Xe Activity (Bq): %f", Xe_activity); xeAct = String.valueOf(Xe_activity);
} }
map.put("tableData", extDataList); map.put("tableData", extDataList);
map.put("functionFit", functionFit); map.put("functionFit", functionFit);