Merge remote-tracking branch 'origin/station' into station

This commit is contained in:
panbaolin 2023-10-19 20:39:16 +08:00
commit 8718aeed1c
9 changed files with 1243 additions and 695 deletions

View File

@ -1,14 +1,14 @@
package org.jeecg.common.util;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
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;
import org.jeecg.modules.entity.vo.SpcHead2;
import org.jeecg.modules.entity.vo.*;
import org.jeecg.modules.native_jni.CalValuesHandler;
import org.jeecg.modules.native_jni.EnergySpectrumHandler;
import org.jeecg.modules.native_jni.struct.EnergySpectrumStruct;
import org.springframework.stereotype.Component;
@ -166,7 +166,7 @@ public class FileFtransitUtil {
i1 = 0;
i2 = num - 1;
}
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_slope(Float.valueOf(String.valueOf(((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
@ -319,8 +319,8 @@ public class FileFtransitUtil {
i1 = 0;
i2 = num - 1;
}
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))));
datas.setEner_slope(Float.valueOf(String.valueOf(((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.valueOf(String.valueOf(((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"));
//换行
@ -546,8 +546,8 @@ public class FileFtransitUtil {
i1 = 0;
i2 = num - 1;
}
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))));
datas.setEner_slope( Float.valueOf(String.valueOf((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.valueOf(String.valueOf(((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)) {
@ -714,53 +714,53 @@ public class FileFtransitUtil {
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")));
head1.Inftyp = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 0, 2), "short"));
head1.Filtyp = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 2, 4), "short"));
head1.Reserved1 = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 4, 6), "short"));
head1.Reserved2 = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 6, 8), "short"));
head1.AcqInfRP = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 8, 10), "short"));
head1.SamDesRP = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 10, 12), "short"));
head1.DetDesRP = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 12, 14), "short"));
head1.EbrDesRP = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 14, 16), "short"));
head1.AnaRP1 = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 16, 18), "short"));
head1.AnaRP2 = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 18, 20), "short"));
head1.AnaRP3 = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 20, 22), "short"));
head1.AnaRP4 = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 22, 24), "short"));
head1.SrpDesRP = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 24, 26), "short"));
head1.IeqDesRP = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 26, 28), "short"));
head1.GeoDesRP = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 28, 30), "short"));
head1.MpcDesRP = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 30, 32), "short"));
head1.CalDesRP = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 32, 34), "short"));
head1.CalRP1 = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 34, 36), "short"));
head1.CalRP2 = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 36, 38), "short"));
head1.EffRP = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 38, 40), "short"));
head1.ROI1 = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 40, 42), "short"));
head1.EngPrRP = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 42, 44), "short"));
head1.EngPrNum = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 44, 46), "short"));
head1.Reserved3 = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 46, 48), "short"));
head1.DDP = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 48, 50), "short"));
head1.ActUnit = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 50, 52), "short"));
head1.LabPerRP = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 52, 54), "short"));
head1.MaxNumE = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 54, 56), "short"));
head1.MaxNumU = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 56, 58), "short"));
head1.EffNum = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 58, 60), "short"));
head1.SpcFirstRP = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 60, 62), "short"));
head1.SpcRecNum = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 62, 64), "short"));
head1.SpcChnNum = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 64, 66), "short"));
head1.Abstch = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 66, 68), "short"));
head1.AcqTime = Float.valueOf(convert(Arrays.copyOfRange(headByte1, 68, 72), "float"));
head1.AcqTime8 = 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")) );
head2.AddRAM = Short.valueOf(convert(Arrays.copyOfRange(headByte2, 0, 2), "short"));
head2.Seqnum = Short.valueOf(convert(Arrays.copyOfRange(headByte2, 2, 4), "short"));
head2.Mcanu = Short.valueOf(convert(Arrays.copyOfRange(headByte2, 4, 6), "short"));
head2.Segnum = Short.valueOf(convert(Arrays.copyOfRange(headByte2, 6, 8), "short"));
head2.Mcadvt = Short.valueOf(convert(Arrays.copyOfRange(headByte2, 8, 10), "short"));
head2.Chnsrt = Short.valueOf(convert(Arrays.copyOfRange(headByte2, 10, 12), "short"));
head2.RealTime = Float.valueOf(convert(Arrays.copyOfRange(headByte2, 12, 16), "float"));
head2.LiveTime = Float.valueOf(convert(Arrays.copyOfRange(headByte2, 16, 20), "float"));
// Acquisition
//从intspc能谱中读取能谱开测时间
@ -1016,7 +1016,7 @@ public class FileFtransitUtil {
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))));
datas.setEner_intercept(Float.valueOf(String.valueOf(((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++) {
@ -1112,148 +1112,256 @@ public class FileFtransitUtil {
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 void WriteSPC(File tmpFile, FileData datas) {
// r:只读 rw:读写
RandomAccessFile SpcFile = null;
try {
SpcFile = new RandomAccessFile(tmpFile.getAbsolutePath(), "rw");
//分析SPC文件并创建所需要的spc文件的基础内容
SpcHead1 m_head1 = new SpcHead1();
SpcHead2 m_head2 = new SpcHead2();
GermaniumCalib m_calibParam = new GermaniumCalib();
byte[] m_totalContents = AnalyseSPC(m_head1, m_head2, m_calibParam);
if(m_totalContents.length<=0) {
String Warning = "The file standard.spc isn't exist or it's format is invalid.";
}
//SpcFile写入内容
SpcFile.write(m_totalContents);
// 写第1个128字节头部指针信息
{
MakeSpcHead(datas, m_head1, m_head2);
SpcFile.seek(0);
byte[] head1 = new byte[80];
//使用系统的赋值数组 来源数组 开始下标 目标数组 开始下标 长度
System.arraycopy(writeShort(m_head1.Inftyp), 0, head1, 0, 2);
System.arraycopy(writeShort(m_head1.Filtyp), 0, head1, 2, 2);
System.arraycopy(writeShort(m_head1.Reserved1), 0, head1, 4, 2);
System.arraycopy(writeShort(m_head1.Reserved2), 0, head1, 6, 2);
System.arraycopy(writeShort(m_head1.AcqInfRP), 0, head1, 8, 2);
System.arraycopy(writeShort(m_head1.SamDesRP), 0, head1, 10, 2);
System.arraycopy(writeShort(m_head1.DetDesRP), 0, head1, 12, 2);
System.arraycopy(writeShort(m_head1.EbrDesRP), 0, head1, 14, 2);
System.arraycopy(writeShort(m_head1.AnaRP1), 0, head1, 16, 2);
System.arraycopy(writeShort(m_head1.AnaRP2), 0, head1, 18, 2);
System.arraycopy(writeShort(m_head1.AnaRP3), 0, head1, 20, 2);
System.arraycopy(writeShort(m_head1.AnaRP4), 0, head1, 22, 2);
System.arraycopy(writeShort(m_head1.SrpDesRP), 0, head1, 24, 2);
System.arraycopy(writeShort(m_head1.IeqDesRP), 0, head1, 26, 2);
System.arraycopy(writeShort(m_head1.GeoDesRP), 0, head1, 28, 2);
System.arraycopy(writeShort(m_head1.MpcDesRP), 0, head1, 30, 2);
System.arraycopy(writeShort(m_head1.CalDesRP), 0, head1, 32, 2);
System.arraycopy(writeShort(m_head1.CalRP1), 0, head1, 34, 2);
System.arraycopy(writeShort(m_head1.CalRP2), 0, head1, 36, 2);
System.arraycopy(writeShort(m_head1.EffRP), 0, head1, 38, 2);
System.arraycopy(writeShort(m_head1.ROI1), 0, head1, 40, 2);
System.arraycopy(writeShort(m_head1.EngPrRP), 0, head1, 42, 2);
System.arraycopy(writeShort(m_head1.EngPrNum), 0, head1, 44, 2);
System.arraycopy(writeShort(m_head1.Reserved3), 0, head1, 46, 2);
System.arraycopy(writeShort(m_head1.DDP), 0, head1, 48, 2);
System.arraycopy(writeShort(m_head1.ActUnit), 0, head1, 50, 2);
System.arraycopy(writeShort(m_head1.LabPerRP), 0, head1, 52, 2);
System.arraycopy(writeShort(m_head1.MaxNumE), 0, head1, 54, 2);
System.arraycopy(writeShort(m_head1.MaxNumU), 0, head1, 56, 2);
System.arraycopy(writeShort(m_head1.EffNum), 0, head1, 58, 2);
System.arraycopy(writeShort(m_head1.SpcFirstRP), 0, head1, 60, 2);
System.arraycopy(writeShort(m_head1.SpcRecNum), 0, head1, 62, 2);
System.arraycopy(writeShort(m_head1.SpcChnNum), 0, head1, 64, 2);
System.arraycopy(writeShort(m_head1.Abstch), 0, head1, 66, 2);
System.arraycopy(writeFloat(m_head1.AcqTime), 0, head1, 68, 4);
System.arraycopy(writeDouble(m_head1.AcqTime8), 0, head1, 72, 8);
SpcFile.write(head1);
SpcFile.seek(78);
byte[] head2 = new byte[20];
System.arraycopy(writeShort(m_head2.AddRAM), 0, head2, 0, 2);
System.arraycopy(writeShort(m_head2.Seqnum), 0, head2, 2, 2);
System.arraycopy(writeShort(m_head2.Mcanu), 0, head2, 4, 2);
System.arraycopy(writeShort(m_head2.Segnum), 0, head2, 6, 2);
System.arraycopy(writeShort(m_head2.Mcadvt), 0, head2, 8, 2);
System.arraycopy(writeShort(m_head2.Chnsrt), 0, head2, 10, 2);
System.arraycopy(writeFloat(m_head2.RealTime), 0, head2, 12, 4);
System.arraycopy(writeFloat(m_head2.LiveTime), 0, head2, 16, 4);
SpcFile.write(head2);
}
// 写第2个128字节Acquisition信息
{
char[] acq_info = new char[128];
acq_info[0] = ' ';
int offset = 16; // 16 Bytes Spectrum file name
String temp = GetDate(datas.getAcq_date());
for(int i=0; i<temp.length(); i++) {
acq_info[i+offset] = temp.charAt(i);
}
offset += 12; // 12 Bytes Acq_Date
temp = datas.getAcq_time().substring(0, 8); // HH:mm:ss
for(int i=0; i<temp.length(); i++) {
acq_info[i+offset] = temp.charAt(i);
}
offset += 10; // 10 Bytes Acq_Time
temp = String.format("%10.0f", datas.getAcq_live());
int size = temp.length() > 10 ? 10 : temp.length();
for(int i=0; i<size; i++) {
acq_info[offset+i] = temp.charAt(i);
}
offset += 10;
temp = String.format("%10.0f", datas.getAcq_real());
size = temp.length() > 10 ? 10 : temp.length();
for(int i=0; i<size; i++) {
acq_info[offset+i] = temp.charAt(i);
}
byte[] acqInfo = new byte[128];
for (int i=0; i<acq_info.length; i++) {
System.arraycopy(writeChar(acq_info[i]), 0, acqInfo, i, 1);
}
SpcFile.seek((m_head1.AcqInfRP - 1) * 128);
SpcFile.write(acqInfo);
}
// 写第5个128字节Germanium Calibration
{
MakeCalibParam(datas, m_calibParam);
SpcFile.seek((m_head1.CalRP1-1)*128);
byte[] calByte = new byte[128];
System.arraycopy(writeShort(m_calibParam.Afit), 0, calByte, 0, 2);
System.arraycopy(writeShort(m_calibParam.Bfit), 0, calByte, 2, 2);
System.arraycopy(writeShort(m_calibParam.EffPairs), 0, calByte, 4, 2);
System.arraycopy(writeShort(m_calibParam.NumOfChan), 0, calByte, 6, 2);
System.arraycopy(writeFloat(m_calibParam.Knee), 0, calByte, 8, 4);
System.arraycopy(writeFloat(m_calibParam.Asig), 0, calByte, 12, 4);
System.arraycopy(writeFloat(m_calibParam.Bsig), 0, calByte, 16, 4);
System.arraycopy(writeFloat(m_calibParam.EnerCoefA), 0, calByte, 20, 4);
System.arraycopy(writeFloat(m_calibParam.EnerCoefB), 0, calByte, 24, 4);
System.arraycopy(writeFloat(m_calibParam.EnerCoefC), 0, calByte, 28, 4);
System.arraycopy(writeFloat(m_calibParam.FwhmCoefA), 0, calByte, 32, 4);
System.arraycopy(writeFloat(m_calibParam.FwhmCoefB), 0, calByte, 36, 4);
System.arraycopy(writeFloat(m_calibParam.FwhmCoefC), 0, calByte, 40, 4);
System.arraycopy(writeFloat(m_calibParam.AboveEffiCoefA), 0, calByte, 44, 4);
System.arraycopy(writeFloat(m_calibParam.AboveEffiCoefB), 0, calByte, 48, 4);
System.arraycopy(writeFloat(m_calibParam.AboveEffiCoefC), 0, calByte, 52, 4);
System.arraycopy(writeFloat(m_calibParam.BelowEffiCoefA), 0, calByte, 56, 4);
System.arraycopy(writeFloat(m_calibParam.BelowEffiCoefB), 0, calByte, 60, 4);
System.arraycopy(writeFloat(m_calibParam.BelowEffiCoefC), 0, calByte, 64, 4);
System.arraycopy(writeShort(m_calibParam.FwhmTyp), 0, calByte, 68, 2);
System.arraycopy(writeShort(m_calibParam.PeType), 0, calByte, 70, 2);
System.arraycopy(writeShort(m_calibParam.MaestroPSS), 0 ,calByte, 72, 2);
System.arraycopy(writeShort(m_calibParam.EngPairs), 0, calByte, 74, 2);
System.arraycopy(writeShort(m_calibParam.DetectorNum), 0, calByte, 76, 2);
System.arraycopy(writeShort(m_calibParam.NumBelowKnee), 0, calByte, 78, 2);
System.arraycopy(writeFloat(m_calibParam.ENA2), 0, calByte, 80, 4);
System.arraycopy(writeFloat(m_calibParam.ENB2), 0, calByte, 84, 4);
System.arraycopy(writeFloat(m_calibParam.ENC2), 0, calByte, 88, 4);
System.arraycopy(writeFloat(m_calibParam.CalUncert), 0, calByte, 92, 4);
System.arraycopy(writeFloat(m_calibParam.CalDif), 0, calByte, 96, 4);
System.arraycopy(writeFloat(m_calibParam.PolyCoef7), 0, calByte, 100, 4);
System.arraycopy(writeFloat(m_calibParam.PolyCoef8), 0, calByte, 104, 4);
System.arraycopy(writeFloat(m_calibParam.PolyCoef9), 0, calByte, 108, 4);
System.arraycopy(writeFloat(m_calibParam.PolyCoef10), 0, calByte, 112, 4);
System.arraycopy(writeFloat(m_calibParam.LowChanFwhmErr), 0, calByte, 116, 4);
System.arraycopy(writeFloat(m_calibParam.HighChanFwhmErr), 0, calByte, 120, 4);
System.arraycopy(writeShort(m_calibParam.CalibLimit), 0, calByte, 124, 2);
System.arraycopy(writeShort(m_calibParam.STypeFlag), 0, calByte, 126, 2);
SpcFile.write(calByte);
}
// 写第7个128字节Calibration DateTime
{
char[] cal_info = new char[128];
cal_info[0] = '0';
int offset = 32; // 32 Bytes Calibration file name
String temp = GetDate(datas.getCalibra_time().substring(0, 10));
for(int i=0; i<temp.length(); ++i) {
cal_info[i+offset] = temp.charAt(i);
}
offset += 10; // 10 Bytes Cal_Date
String str = datas.getCalibra_time().substring(datas.getCalibra_time().length()-10).substring(0, 8);
for(int i=0; i<str.length(); ++i) {
cal_info[i+offset] = str.charAt(i);
}
byte[] calInfo = new byte[128];
for (int i=0; i<cal_info.length; i++) {
System.arraycopy(writeChar(cal_info[i]), 0, calInfo, i, 1);
}
SpcFile.seek((m_head1.CalRP2 - 1) * 128);
SpcFile.write(calInfo);
}
// 写第1113个128字节能量半高宽刻度数据
{
int pairs_num = 96*1;
float[] pairs = new float[pairs_num];
Arrays.fill(pairs, 0.0f);
int size = m_calibParam.EngPairs;
int adjust = 0;
for(int i=0; i<size; ++i) {
adjust = i / 32 * 96 + i % 32;
pairs[adjust] = Float.valueOf(String.valueOf(datas.getVvEner().get(1).get(i)));
pairs[adjust+32] = Float.valueOf(String.valueOf(datas.getVvEner().get(0).get(i)));
pairs[adjust+64] = Float.valueOf(String.valueOf(datas.getVvReso().get(1).get(i)/datas.getEner_slope()));
}
byte[] pairInfo = new byte[pairs_num*4];
int j=0;
for (int i=0; i<pairs.length; i++) {
System.arraycopy(writeFloat(pairs[i]), 0, pairInfo, j, 4);
j+=4;
}
SpcFile.seek((m_head1.EngPrRP-1)*128);
SpcFile.write(pairInfo);
}
// 写第14个128字节效率刻度数据
{
int size = m_calibParam.EffPairs;
float[] Efficiency = new float[4*size*2];
for(int i=0; i<size; ++i) {
Efficiency[i*2] = Float.valueOf(String.valueOf(datas.getVvEffi().get(0).get(i)));
Efficiency[i*2+1] = Float.valueOf(String.valueOf(datas.getVvEffi().get(1).get(i)));
}
byte[] effInfo = new byte[4*4*size*2];
int j=0;
for (int i=0; i<Efficiency.length; i++) {
System.arraycopy(writeFloat(Efficiency[i]), 0, effInfo, j, 4);
j+=4;
}
SpcFile.seek((m_head1.EffRP - 1) * 128);
SpcFile.write(effInfo);
}
//写第68个128字节Spectrum
{
int count_size = datas.getNum_count();
int[] SpcData = new int[count_size];
for(int i=0; i<count_size; ++i) {
SpcData[i] = Integer.valueOf(String.valueOf(datas.getVCounts().get(i)));
}
byte[] spcDataInfo = new byte[count_size*4];
int j=0;
for (int i=0; i<SpcData.length; i++) {
System.arraycopy(writeInt(SpcData[i]), 0, spcDataInfo, j, 4);
j+=4;
}
SpcFile.seek((m_head1.SpcFirstRP-1)*128);
SpcFile.write(spcDataInfo);
}
} catch (FileNotFoundException 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);
}
}
}
public static String convert(byte[] bytes, String type) {
List<String> values = new LinkedList<>();
@ -1291,4 +1399,276 @@ public class FileFtransitUtil {
return "";
}
public static byte[] AnalyseSPC(SpcHead1 m_head1, SpcHead2 m_head2, GermaniumCalib m_calibParam) {
String standard_spc = "D:\\ARMD\\材料\\spc-ims\\standard.SPC";
File standardSpc = new File(standard_spc);
if(!standardSpc.exists()) {
String Warning = standard_spc + " isn't exist.";
return new byte[0];
}
RandomAccessFile SpcFile = null;
try {
SpcFile = new RandomAccessFile(standard_spc, "r");
short Inftyp = 0;
short Filtyp = 0;
//读取第一个数据
byte[] first = new byte[2];
SpcFile.read(first);
Inftyp = Short.valueOf(convert(first, "short"));
//读取第二个数据
byte[] second = new byte[2];
SpcFile.read(second);
Filtyp = Short.valueOf(convert(second, "short"));
if(Inftyp != 1 || Filtyp != 1) {
String Warning = "The Format of "+standardSpc+" is Error!";
return new byte[0];
}
int length = (int) SpcFile.length();
byte[] m_totalContents = new byte[length];
SpcFile.seek(0);
SpcFile.read(m_totalContents);
// 读入整形spc文件的头记录第一个记录128字节
SpcFile.seek(0);
//头部信息需要读取的字节数
byte[] headByte1 = new byte[80];
SpcFile.read(headByte1);
//读取后赋值
m_head1.Inftyp = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 0, 2), "short"));
m_head1.Filtyp = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 2, 4), "short"));
m_head1.Reserved1 = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 4, 6), "short"));
m_head1.Reserved2 = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 6, 8), "short"));
m_head1.AcqInfRP = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 8, 10), "short"));
m_head1.SamDesRP = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 10, 12), "short"));
m_head1.DetDesRP = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 12, 14), "short"));
m_head1.EbrDesRP = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 14, 16), "short"));
m_head1.AnaRP1 = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 16, 18), "short"));
m_head1.AnaRP2 = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 18, 20), "short"));
m_head1.AnaRP3 = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 20, 22), "short"));
m_head1.AnaRP4 = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 22, 24), "short"));
m_head1.SrpDesRP = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 24, 26), "short"));
m_head1.IeqDesRP = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 26, 28), "short"));
m_head1.GeoDesRP = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 28, 30), "short"));
m_head1.MpcDesRP = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 30, 32), "short"));
m_head1.CalDesRP = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 32, 34), "short"));
m_head1.CalRP1 = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 34, 36), "short"));
m_head1.CalRP2 = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 36, 38), "short"));
m_head1.EffRP = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 38, 40), "short"));
m_head1.ROI1 = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 40, 42), "short"));
m_head1.EngPrRP = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 42, 44), "short"));
m_head1.EngPrNum = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 44, 46), "short"));
m_head1.Reserved3 = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 46, 48), "short"));
m_head1.DDP = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 48, 50), "short"));
m_head1.ActUnit = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 50, 52), "short"));
m_head1.LabPerRP = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 52, 54), "short"));
m_head1.MaxNumE = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 54, 56), "short"));
m_head1.MaxNumU = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 56, 58), "short"));
m_head1.EffNum = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 58, 60), "short"));
m_head1.SpcFirstRP = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 60, 62), "short"));
m_head1.SpcRecNum = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 62, 64), "short"));
m_head1.SpcChnNum = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 64, 66), "short"));
m_head1.Abstch = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 66, 68), "short"));
m_head1.AcqTime = Float.valueOf(convert(Arrays.copyOfRange(headByte1, 68, 72), "float"));
m_head1.AcqTime8 = Double.valueOf(convert(Arrays.copyOfRange(headByte1, 72, 80), "double"));
SpcFile.seek(78);
byte[] headByte2 = new byte[20];
SpcFile.read(headByte2);
m_head2.AddRAM = Short.valueOf(convert(Arrays.copyOfRange(headByte2, 0, 2), "short"));
m_head2.Seqnum = Short.valueOf(convert(Arrays.copyOfRange(headByte2, 2, 4), "short"));
m_head2.Mcanu = Short.valueOf(convert(Arrays.copyOfRange(headByte2, 4, 6), "short"));
m_head2.Segnum = Short.valueOf(convert(Arrays.copyOfRange(headByte2, 6, 8), "short"));
m_head2.Mcadvt = Short.valueOf(convert(Arrays.copyOfRange(headByte2, 8, 10), "short"));
m_head2.Chnsrt = Short.valueOf(convert(Arrays.copyOfRange(headByte2, 10, 12), "short"));
m_head2.RealTime = Float.valueOf(convert(Arrays.copyOfRange(headByte2, 12, 16), "float"));
m_head2.LiveTime = Float.valueOf(convert(Arrays.copyOfRange(headByte2, 16, 20), "float"));
// Germanium Calibration
SpcFile.seek((m_head1.CalRP1-1)*128);
byte[] charByte = new byte[128];
SpcFile.read(charByte);
m_calibParam.Afit = Short.valueOf(convert(Arrays.copyOfRange(charByte, 0, 2) , "short"));
m_calibParam.Bfit = Short.valueOf(convert(Arrays.copyOfRange(charByte, 2, 4), "short"));
m_calibParam.EffPairs = Short.valueOf(convert(Arrays.copyOfRange(charByte, 4, 6), "short"));
m_calibParam.NumOfChan = Short.valueOf(convert(Arrays.copyOfRange(charByte, 6, 8), "short"));
m_calibParam.Knee = Float.valueOf(convert(Arrays.copyOfRange(charByte, 8, 12), "float"));
m_calibParam.Asig = Float.valueOf(convert(Arrays.copyOfRange(charByte, 12, 16), "float"));
m_calibParam.Bsig = Float.valueOf(convert(Arrays.copyOfRange(charByte, 16, 20), "float"));
m_calibParam.EnerCoefA = Float.valueOf(convert(Arrays.copyOfRange(charByte, 20, 24), "float"));
m_calibParam.EnerCoefB = Float.valueOf(convert(Arrays.copyOfRange(charByte, 24, 28), "float"));
m_calibParam.EnerCoefC = Float.valueOf(convert(Arrays.copyOfRange(charByte, 28, 32), "float"));
m_calibParam.FwhmCoefA = Float.valueOf(convert(Arrays.copyOfRange(charByte, 32, 36), "float"));
m_calibParam.FwhmCoefB = Float.valueOf(convert(Arrays.copyOfRange(charByte, 36, 40), "float"));
m_calibParam.FwhmCoefC = Float.valueOf(convert(Arrays.copyOfRange(charByte, 40, 44), "float"));
m_calibParam.AboveEffiCoefA = Float.valueOf(convert(Arrays.copyOfRange(charByte, 44, 48), "float"));
m_calibParam.AboveEffiCoefB = Float.valueOf(convert(Arrays.copyOfRange(charByte, 48, 52), "float"));
m_calibParam.AboveEffiCoefC = Float.valueOf(convert(Arrays.copyOfRange(charByte, 52, 56), "float"));
m_calibParam.BelowEffiCoefA = Float.valueOf(convert(Arrays.copyOfRange(charByte, 56, 60), "float"));
m_calibParam.BelowEffiCoefB = Float.valueOf(convert(Arrays.copyOfRange(charByte, 60, 64), "float"));
m_calibParam.BelowEffiCoefC = Float.valueOf(convert(Arrays.copyOfRange(charByte, 64, 68), "float"));
m_calibParam.FwhmTyp = Short.valueOf(convert(Arrays.copyOfRange(charByte, 68, 70), "short"));
m_calibParam.PeType = Short.valueOf(convert(Arrays.copyOfRange(charByte, 70, 72), "short"));
m_calibParam.MaestroPSS = Short.valueOf(convert(Arrays.copyOfRange(charByte, 72, 74), "short"));
m_calibParam.EngPairs = Short.valueOf(convert(Arrays.copyOfRange(charByte, 74, 76), "short"));
m_calibParam.DetectorNum = Short.valueOf(convert(Arrays.copyOfRange(charByte, 76, 78), "short"));
m_calibParam.NumBelowKnee = Short.valueOf(convert(Arrays.copyOfRange(charByte, 78, 80), "short"));
m_calibParam.ENA2 = Float.valueOf(convert(Arrays.copyOfRange(charByte, 80, 84), "float"));
m_calibParam.ENB2 = Float.valueOf(convert(Arrays.copyOfRange(charByte, 84, 88), "float"));
m_calibParam.ENC2 = Float.valueOf(convert(Arrays.copyOfRange(charByte, 88, 92), "float"));
m_calibParam.CalUncert = Float.valueOf(convert(Arrays.copyOfRange(charByte, 92, 96), "float"));
m_calibParam.CalDif = Float.valueOf(convert(Arrays.copyOfRange(charByte, 96, 100), "float"));
m_calibParam.PolyCoef7 = Float.valueOf(convert(Arrays.copyOfRange(charByte, 100, 104), "float"));
m_calibParam.PolyCoef8 = Float.valueOf(convert(Arrays.copyOfRange(charByte, 104, 108), "float"));
m_calibParam.PolyCoef9 = Float.valueOf(convert(Arrays.copyOfRange(charByte, 108, 112), "float"));
m_calibParam.PolyCoef10 = Float.valueOf(convert(Arrays.copyOfRange(charByte, 112, 116), "float"));
m_calibParam.LowChanFwhmErr = Float.valueOf(convert(Arrays.copyOfRange(charByte, 116, 120), "float"));
m_calibParam.HighChanFwhmErr = Float.valueOf(convert(Arrays.copyOfRange(charByte, 120, 124), "float"));
m_calibParam.CalibLimit = Short.valueOf(convert(Arrays.copyOfRange(charByte, 124, 126), "short"));
m_calibParam.STypeFlag = Short.valueOf(convert(Arrays.copyOfRange(charByte, 126, 128), "short"));
SpcFile.close();
return m_totalContents;
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public static void MakeSpcHead(FileData datas, SpcHead1 m_head1, SpcHead2 m_head2) {
m_head1.Inftyp = 1;
m_head1.Filtyp = 1;
if(datas.getVvEner().size() > 0 && datas.getVvReso().size() > 0) {
int size = Math.min(datas.getVvEner().get(0).size(), datas.getVvReso().get(0).size());
if(size > 32*1) {
size = 32*1;
}
m_head1.EngPrNum = (short) size;
}
if(datas.getVvEffi().size() > 0) {
m_head1.EffNum = (short) datas.getVvEffi().get(0).size();
}
m_head1.SpcRecNum = (short) (datas.getNum_count()/32);
m_head1.SpcChnNum = (short) datas.getNum_count();
m_head1.AcqTime = 12631.7f;
m_head1.AcqTime8 = 12631.7;
m_head2.Chnsrt = (short) datas.getStart_chan();
m_head2.RealTime = datas.getAcq_real();
m_head2.LiveTime = datas.getAcq_live();
}
public static void MakeCalibParam(FileData datas, GermaniumCalib m_calibParam) {
if(datas.getVvEffi().size() < 3 || datas.getVvEner().size() < 3 || datas.getVvReso().size() < 3) {
return;
}
m_calibParam.NumOfChan = (short) datas.getNum_count();
if(datas.getVvEner().size() > 0 && datas.getVvReso().size() > 0) {
int size = Math.min(datas.getVvEner().get(0).size(), datas.getVvReso().get(0).size());
if(size > 32*1) {
size = 32*1;
}
m_calibParam.EngPairs = (short) size;
}
if(datas.getVvEffi().size() > 0) {
m_calibParam.EffPairs = (short) datas.getVvEffi().get(0).size();
}
ParameterInfo ener_para = new ParameterInfo();
ener_para.setP(CalValuesHandler.calFitPara("Cal_Energy", 2, datas.getVvEner().get(1), datas.getVvEner().get(0), datas.getVvEner().get(2)));
ParameterInfo reso_para = new ParameterInfo();
reso_para.setP(CalValuesHandler.calFitPara("Cal_Resolution", 2, datas.getVvReso().get(0), datas.getVvReso().get(1), datas.getVvReso().get(2)));
if(ener_para.getP().size() < 3) {
return;
} else if(ener_para.getP().size() == 3) {
ener_para.getP().add(0.0);
}
if(reso_para.getP().size() < 3) {
return;
} else if(reso_para.getP().size() == 3) {
reso_para.getP().add(0.0);
}
m_calibParam.EnerCoefA = Float.valueOf(String.valueOf(ener_para.getP().get(1)));
m_calibParam.EnerCoefB = Float.valueOf(String.valueOf(ener_para.getP().get(2)));
m_calibParam.EnerCoefC = Float.valueOf(String.valueOf(ener_para.getP().get(3)));
m_calibParam.FwhmCoefA = Float.valueOf(String.valueOf(reso_para.getP().get(1)));
m_calibParam.FwhmCoefB = Float.valueOf(String.valueOf(reso_para.getP().get(2)));
m_calibParam.FwhmCoefC = Float.valueOf(String.valueOf(reso_para.getP().get(3)));
}
public static String GetDate(String str) {
str = str.substring(0, 10); // YYYY/MM/DD
String temp = str.substring(str.length()-2)+ StringPool.DASH; // DD-
int month = Integer.valueOf(str.substring(5, 7));
switch(month) { // DD-MMM
case 1: temp+="Jan"; break;
case 2: temp+="Feb"; break;
case 3: temp+="Mar"; break;
case 4: temp+="Apr"; break;
case 5: temp+="May"; break;
case 6: temp+="Jun"; break;
case 7: temp+="Jul"; break;
case 8: temp+="Aug"; break;
case 9: temp+="Sep"; break;
case 10: temp+="Oct"; break;
case 11: temp+="Nov"; break;
case 12: temp+="Dec"; break;
default: temp+="Jan"; break;
}
temp+=String.format("-%s", str.substring(2, 4)); // DD-MMM-YY
if(str.substring(0, 2) == "20") { // DD-MMM-YY*
temp+="1";
} else {
temp+="0";
}
return temp;
}
public static byte[] writeShort(int v) {
byte[] byteArr = new byte[2];
byteArr[0] = (byte) ((v >>> 0) & 0xFF);
byteArr[1] = (byte) ((v >>> 8) & 0xFF);
return byteArr;
}
public static byte[] writeChar(int v) {
byte[] byteArr = new byte[2];
byteArr[0] = (byte) ((v >>> 0) & 0xFF);
byteArr[1] = (byte) ((v >>> 8) & 0xFF);
return byteArr;
}
public static byte[] writeInt(int v) {
byte[] byteArr = new byte[4];
byteArr[0] = (byte) ((v >>> 0) & 0xFF);
byteArr[1] = (byte) ((v >>> 8) & 0xFF);
byteArr[2] = (byte) ((v >>> 16) & 0xFF);
byteArr[3] = (byte) ((v >>> 24) & 0xFF);
return byteArr;
}
public static byte[] writeLong(long v) {
byte[] byteArr = new byte[8];
byteArr[0] = (byte) ((v >>> 0) & 0xFF);
byteArr[1] = (byte) ((v >>> 8) & 0xFF);
byteArr[2] = (byte) ((v >>> 16) & 0xFF);
byteArr[3] = (byte) ((v >>> 24) & 0xFF);
byteArr[4] = (byte) ((v >>> 32) & 0xFF);
byteArr[5] = (byte) ((v >>> 40) & 0xFF);
byteArr[6] = (byte) ((v >>> 48) & 0xFF);
byteArr[7] = (byte) ((v >>> 56) & 0xFF);
return byteArr;
}
public static byte[] writeFloat(float v) {
byte[] byteArr = writeInt(Float.floatToIntBits(v));
return byteArr;
}
public static byte[] writeDouble(double v) {
byte[] byteArr = writeLong(Double.doubleToLongBits(v));
return byteArr;
}
}

View File

@ -0,0 +1,88 @@
package org.jeecg.modules.entity.vo;
import java.io.Serializable;
public class GermaniumCalib implements Serializable {
public short Afit;
public short Bfit;
public short EffPairs;
public short NumOfChan;
public float Knee;
public float Asig;
public float Bsig;
public float EnerCoefA;
public float EnerCoefB;
public float EnerCoefC;
public float FwhmCoefA;
public float FwhmCoefB;
public float FwhmCoefC;
public float AboveEffiCoefA;
public float AboveEffiCoefB;
public float AboveEffiCoefC;
public float BelowEffiCoefA;
public float BelowEffiCoefB;
public float BelowEffiCoefC;
public short FwhmTyp;
public short PeType;
public short MaestroPSS;
public short EngPairs;
public short DetectorNum;
public short NumBelowKnee;
public float ENA2;
public float ENB2;
public float ENC2;
public float CalUncert;
public float CalDif;
public float PolyCoef7;
public float PolyCoef8;
public float PolyCoef9;
public float PolyCoef10;
public float LowChanFwhmErr;
public float HighChanFwhmErr;
public short CalibLimit;
public short STypeFlag;
public GermaniumCalib() {
Afit = 0;
Bfit = 0;
EffPairs = 0; // Number of efficiency pairs
NumOfChan = 0; // Number of channels in spectrum
Knee = 0.0f;
Asig = 0.0f;
Bsig = 0.0f;
EnerCoefA = 0.0f;
EnerCoefB = 0.0f;
EnerCoefC = 0.0f;
FwhmCoefA = 0.0f;
FwhmCoefB = 0.0f;
FwhmCoefC = 0.0f;
AboveEffiCoefA = 0.0f;
AboveEffiCoefB = 0.0f;
AboveEffiCoefC = 0.0f;
BelowEffiCoefA = 0.0f;
BelowEffiCoefB = 0.0f;
BelowEffiCoefC = 0.0f;
FwhmTyp = 0;
PeType = 0;
MaestroPSS = 0;
EngPairs = 0; // Number of energy pairs
DetectorNum = 0;
NumBelowKnee = 0;
ENA2 = 0.0f;
ENB2 = 0.0f;
ENC2 = 0.0f;
CalUncert = 0.0f;
CalDif = 0.0f;
PolyCoef7 = 0.0f;
PolyCoef8 = 0.0f;
PolyCoef9 = 0.0f;
PolyCoef10 = 0.0f;
LowChanFwhmErr = 0.0f;
HighChanFwhmErr = 0.0f;
CalibLimit = 0;
STypeFlag = 1;
}
}

View File

@ -5,6 +5,47 @@ import lombok.Data;
@Data
public class SpcHead1 {
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
public SpcHead1() {
// 需根据谱改变
EngPrNum = 3;
@ -48,45 +89,4 @@ public class SpcHead1 {
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

@ -5,6 +5,17 @@ import lombok.Data;
@Data
public class SpcHead2 {
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)
// 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 SpcHead2() {
// 需根据谱改变
Chnsrt = 0;
@ -17,14 +28,4 @@ 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
// number as integer for systems with Connections
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
}

View File

@ -5,6 +5,7 @@ import com.google.common.cache.CacheBuilder;
import org.jeecg.modules.entity.vo.PHDFile;
import org.springframework.stereotype.Component;
import java.util.Map;
import java.util.concurrent.TimeUnit;
@Component
@ -30,4 +31,7 @@ public class LocalCache {
this.phdCache = phdCache;
}
public void deletePHDCache(String key){
this.phdCache.invalidate(key);
}
}

View File

@ -1,10 +1,11 @@
package org.jeecg.modules.controller;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.jeecg.common.constant.DateConstant;
import org.jeecg.modules.entity.vo.SpcHead1;
import org.jeecg.modules.entity.vo.SpcHead2;
import org.jeecg.modules.entity.vo.FileData;
import org.jeecg.common.util.FileFtransitUtil;
import org.jeecg.modules.entity.vo.*;
import org.jeecg.modules.native_jni.CalValuesHandler;
import java.io.*;
import java.lang.reflect.Array;
@ -17,422 +18,478 @@ 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;
import java.util.*;
public class Demo {
public static void main(String[] args) throws IOException {
FileData fileData = new FileData();
String filePath = "D:\\ARMD\\材料\\201809160001P.SPC";
System.loadLibrary("ReadPHDFile");
System.loadLibrary("GammaAnaly");
FileData datas = new FileData();
File imsFile = new File("D:\\ARMD\\材料\\spc-ims\\201809160001P.Ims");
FileFtransitUtil.ReadIMS(imsFile, datas);
File spcFile = new File("D:\\ARMD\\材料\\spc-ims\\test.SPC");
// r:只读 rw:读写
RandomAccessFile SpcFile = new RandomAccessFile(filePath, "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) {
RandomAccessFile SpcFile = new RandomAccessFile(spcFile.getAbsolutePath(), "rw");
//分析SPC文件并创建所需要的spc文件的基础内容
SpcHead1 m_head1 = new SpcHead1();
SpcHead2 m_head2 = new SpcHead2();
GermaniumCalib m_calibParam = new GermaniumCalib();
byte[] m_totalContents = AnalyseSPC(m_head1, m_head2, m_calibParam);
if(m_totalContents.length<=0) {
String Warning = "The file standard.spc isn't exist or it's format is invalid.";
}
//SpcFile写入内容
SpcFile.write(m_totalContents);
// 写第1个128字节头部指针信息
{
MakeSpcHead(datas, m_head1, m_head2);
SpcFile.seek(0);
byte[] head1 = new byte[80];
//使用系统的赋值数组 来源数组 开始下标 目标数组 开始下标 长度
System.arraycopy(writeShort(m_head1.Inftyp), 0, head1, 0, 2);
System.arraycopy(writeShort(m_head1.Filtyp), 0, head1, 2, 2);
System.arraycopy(writeShort(m_head1.Reserved1), 0, head1, 4, 2);
System.arraycopy(writeShort(m_head1.Reserved2), 0, head1, 6, 2);
System.arraycopy(writeShort(m_head1.AcqInfRP), 0, head1, 8, 2);
System.arraycopy(writeShort(m_head1.SamDesRP), 0, head1, 10, 2);
System.arraycopy(writeShort(m_head1.DetDesRP), 0, head1, 12, 2);
System.arraycopy(writeShort(m_head1.EbrDesRP), 0, head1, 14, 2);
System.arraycopy(writeShort(m_head1.AnaRP1), 0, head1, 16, 2);
System.arraycopy(writeShort(m_head1.AnaRP2), 0, head1, 18, 2);
System.arraycopy(writeShort(m_head1.AnaRP3), 0, head1, 20, 2);
System.arraycopy(writeShort(m_head1.AnaRP4), 0, head1, 22, 2);
System.arraycopy(writeShort(m_head1.SrpDesRP), 0, head1, 24, 2);
System.arraycopy(writeShort(m_head1.IeqDesRP), 0, head1, 26, 2);
System.arraycopy(writeShort(m_head1.GeoDesRP), 0, head1, 28, 2);
System.arraycopy(writeShort(m_head1.MpcDesRP), 0, head1, 30, 2);
System.arraycopy(writeShort(m_head1.CalDesRP), 0, head1, 32, 2);
System.arraycopy(writeShort(m_head1.CalRP1), 0, head1, 34, 2);
System.arraycopy(writeShort(m_head1.CalRP2), 0, head1, 36, 2);
System.arraycopy(writeShort(m_head1.EffRP), 0, head1, 38, 2);
System.arraycopy(writeShort(m_head1.ROI1), 0, head1, 40, 2);
System.arraycopy(writeShort(m_head1.EngPrRP), 0, head1, 42, 2);
System.arraycopy(writeShort(m_head1.EngPrNum), 0, head1, 44, 2);
System.arraycopy(writeShort(m_head1.Reserved3), 0, head1, 46, 2);
System.arraycopy(writeShort(m_head1.DDP), 0, head1, 48, 2);
System.arraycopy(writeShort(m_head1.ActUnit), 0, head1, 50, 2);
System.arraycopy(writeShort(m_head1.LabPerRP), 0, head1, 52, 2);
System.arraycopy(writeShort(m_head1.MaxNumE), 0, head1, 54, 2);
System.arraycopy(writeShort(m_head1.MaxNumU), 0, head1, 56, 2);
System.arraycopy(writeShort(m_head1.EffNum), 0, head1, 58, 2);
System.arraycopy(writeShort(m_head1.SpcFirstRP), 0, head1, 60, 2);
System.arraycopy(writeShort(m_head1.SpcRecNum), 0, head1, 62, 2);
System.arraycopy(writeShort(m_head1.SpcChnNum), 0, head1, 64, 2);
System.arraycopy(writeShort(m_head1.Abstch), 0, head1, 66, 2);
System.arraycopy(writeFloat(m_head1.AcqTime), 0, head1, 68, 4);
System.arraycopy(writeDouble(m_head1.AcqTime8), 0, head1, 72, 8);
SpcFile.write(head1);
SpcFile.seek(78);
byte[] head2 = new byte[20];
System.arraycopy(writeShort(m_head2.AddRAM), 0, head2, 0, 2);
System.arraycopy(writeShort(m_head2.Seqnum), 0, head2, 2, 2);
System.arraycopy(writeShort(m_head2.Mcanu), 0, head2, 4, 2);
System.arraycopy(writeShort(m_head2.Segnum), 0, head2, 6, 2);
System.arraycopy(writeShort(m_head2.Mcadvt), 0, head2, 8, 2);
System.arraycopy(writeShort(m_head2.Chnsrt), 0, head2, 10, 2);
System.arraycopy(writeFloat(m_head2.RealTime), 0, head2, 12, 4);
System.arraycopy(writeFloat(m_head2.LiveTime), 0, head2, 16, 4);
SpcFile.write(head2);
}
// 写第2个128字节Acquisition信息
{
char[] acq_info = new char[128];
acq_info[0] = ' ';
int offset = 16; // 16 Bytes Spectrum file name
String temp = GetDate(datas.getAcq_date());
for(int i=0; i<temp.length(); i++) {
acq_info[i+offset] = temp.charAt(i);
}
offset += 12; // 12 Bytes Acq_Date
temp = datas.getAcq_time().substring(0, 8); // HH:mm:ss
for(int i=0; i<temp.length(); i++) {
acq_info[i+offset] = temp.charAt(i);
}
offset += 10; // 10 Bytes Acq_Time
temp = String.format("%10.0f", datas.getAcq_live());
int size = temp.length() > 10 ? 10 : temp.length();
for(int i=0; i<size; i++) {
acq_info[offset+i] = temp.charAt(i);
}
offset += 10;
temp = String.format("%10.0f", datas.getAcq_real());
size = temp.length() > 10 ? 10 : temp.length();
for(int i=0; i<size; i++) {
acq_info[offset+i] = temp.charAt(i);
}
byte[] acqInfo = new byte[128];
for (int i=0; i<acq_info.length; i++) {
System.arraycopy(writeChar(acq_info[i]), 0, acqInfo, i, 1);
}
SpcFile.seek((m_head1.AcqInfRP - 1) * 128);
SpcFile.write(acqInfo);
}
// 写第5个128字节Germanium Calibration
{
MakeCalibParam(datas, m_calibParam);
SpcFile.seek((m_head1.CalRP1-1)*128);
byte[] calByte = new byte[128];
System.arraycopy(writeShort(m_calibParam.Afit), 0, calByte, 0, 2);
System.arraycopy(writeShort(m_calibParam.Bfit), 0, calByte, 2, 2);
System.arraycopy(writeShort(m_calibParam.EffPairs), 0, calByte, 4, 2);
System.arraycopy(writeShort(m_calibParam.NumOfChan), 0, calByte, 6, 2);
System.arraycopy(writeFloat(m_calibParam.Knee), 0, calByte, 8, 4);
System.arraycopy(writeFloat(m_calibParam.Asig), 0, calByte, 12, 4);
System.arraycopy(writeFloat(m_calibParam.Bsig), 0, calByte, 16, 4);
System.arraycopy(writeFloat(m_calibParam.EnerCoefA), 0, calByte, 20, 4);
System.arraycopy(writeFloat(m_calibParam.EnerCoefB), 0, calByte, 24, 4);
System.arraycopy(writeFloat(m_calibParam.EnerCoefC), 0, calByte, 28, 4);
System.arraycopy(writeFloat(m_calibParam.FwhmCoefA), 0, calByte, 32, 4);
System.arraycopy(writeFloat(m_calibParam.FwhmCoefB), 0, calByte, 36, 4);
System.arraycopy(writeFloat(m_calibParam.FwhmCoefC), 0, calByte, 40, 4);
System.arraycopy(writeFloat(m_calibParam.AboveEffiCoefA), 0, calByte, 44, 4);
System.arraycopy(writeFloat(m_calibParam.AboveEffiCoefB), 0, calByte, 48, 4);
System.arraycopy(writeFloat(m_calibParam.AboveEffiCoefC), 0, calByte, 52, 4);
System.arraycopy(writeFloat(m_calibParam.BelowEffiCoefA), 0, calByte, 56, 4);
System.arraycopy(writeFloat(m_calibParam.BelowEffiCoefB), 0, calByte, 60, 4);
System.arraycopy(writeFloat(m_calibParam.BelowEffiCoefC), 0, calByte, 64, 4);
System.arraycopy(writeShort(m_calibParam.FwhmTyp), 0, calByte, 68, 2);
System.arraycopy(writeShort(m_calibParam.PeType), 0, calByte, 70, 2);
System.arraycopy(writeShort(m_calibParam.MaestroPSS), 0 ,calByte, 72, 2);
System.arraycopy(writeShort(m_calibParam.EngPairs), 0, calByte, 74, 2);
System.arraycopy(writeShort(m_calibParam.DetectorNum), 0, calByte, 76, 2);
System.arraycopy(writeShort(m_calibParam.NumBelowKnee), 0, calByte, 78, 2);
System.arraycopy(writeFloat(m_calibParam.ENA2), 0, calByte, 80, 4);
System.arraycopy(writeFloat(m_calibParam.ENB2), 0, calByte, 84, 4);
System.arraycopy(writeFloat(m_calibParam.ENC2), 0, calByte, 88, 4);
System.arraycopy(writeFloat(m_calibParam.CalUncert), 0, calByte, 92, 4);
System.arraycopy(writeFloat(m_calibParam.CalDif), 0, calByte, 96, 4);
System.arraycopy(writeFloat(m_calibParam.PolyCoef7), 0, calByte, 100, 4);
System.arraycopy(writeFloat(m_calibParam.PolyCoef8), 0, calByte, 104, 4);
System.arraycopy(writeFloat(m_calibParam.PolyCoef9), 0, calByte, 108, 4);
System.arraycopy(writeFloat(m_calibParam.PolyCoef10), 0, calByte, 112, 4);
System.arraycopy(writeFloat(m_calibParam.LowChanFwhmErr), 0, calByte, 116, 4);
System.arraycopy(writeFloat(m_calibParam.HighChanFwhmErr), 0, calByte, 120, 4);
System.arraycopy(writeShort(m_calibParam.CalibLimit), 0, calByte, 124, 2);
System.arraycopy(writeShort(m_calibParam.STypeFlag), 0, calByte, 126, 2);
SpcFile.write(calByte);
}
// 写第7个128字节Calibration DateTime
{
char[] cal_info = new char[128];
cal_info[0] = '0';
int offset = 32; // 32 Bytes Calibration file name
String temp = GetDate(datas.getCalibra_time().substring(0, 10));
for(int i=0; i<temp.length(); ++i) {
cal_info[i+offset] = temp.charAt(i);
}
offset += 10; // 10 Bytes Cal_Date
String str = datas.getCalibra_time().substring(datas.getCalibra_time().length()-10).substring(0, 8);
for(int i=0; i<str.length(); ++i) {
cal_info[i+offset] = str.charAt(i);
}
byte[] calInfo = new byte[128];
for (int i=0; i<cal_info.length; i++) {
System.arraycopy(writeChar(cal_info[i]), 0, calInfo, i, 1);
}
SpcFile.seek((m_head1.CalRP2 - 1) * 128);
SpcFile.write(calInfo);
}
// 写第1113个128字节能量半高宽刻度数据
{
int pairs_num = 96*1;
float[] pairs = new float[pairs_num];
Arrays.fill(pairs, 0.0f);
int size = m_calibParam.EngPairs;
int adjust = 0;
for(int i=0; i<size; ++i) {
adjust = i / 32 * 96 + i % 32;
pairs[adjust] = Float.valueOf(String.valueOf(datas.getVvEner().get(1).get(i)));
pairs[adjust+32] = Float.valueOf(String.valueOf(datas.getVvEner().get(0).get(i)));
pairs[adjust+64] = Float.valueOf(String.valueOf(datas.getVvReso().get(1).get(i)/datas.getEner_slope()));
}
byte[] pairInfo = new byte[pairs_num*4];
int j=0;
for (int i=0; i<pairs.length; i++) {
System.arraycopy(writeFloat(pairs[i]), 0, pairInfo, j, 4);
j+=4;
}
SpcFile.seek((m_head1.EngPrRP-1)*128);
SpcFile.write(pairInfo);
}
// 写第14个128字节效率刻度数据
{
int size = m_calibParam.EffPairs;
float[] Efficiency = new float[4*size*2];
for(int i=0; i<size; ++i) {
Efficiency[i*2] = Float.valueOf(String.valueOf(datas.getVvEffi().get(0).get(i)));
Efficiency[i*2+1] = Float.valueOf(String.valueOf(datas.getVvEffi().get(1).get(i)));
}
byte[] effInfo = new byte[4*4*size*2];
int j=0;
for (int i=0; i<Efficiency.length; i++) {
System.arraycopy(writeFloat(Efficiency[i]), 0, effInfo, j, 4);
j+=4;
}
SpcFile.seek((m_head1.EffRP - 1) * 128);
SpcFile.write(effInfo);
}
//写第68个128字节Spectrum
{
int count_size = datas.getNum_count();
int[] SpcData = new int[count_size];
for(int i=0; i<count_size; ++i) {
SpcData[i] = Integer.valueOf(String.valueOf(datas.getVCounts().get(i)));
}
byte[] spcDataInfo = new byte[count_size*4];
int j=0;
for (int i=0; i<SpcData.length; i++) {
System.arraycopy(writeInt(SpcData[i]), 0, spcDataInfo, j, 4);
j+=4;
}
SpcFile.seek((m_head1.SpcFirstRP-1)*128);
SpcFile.write(spcDataInfo);
}
SpcFile.close();
}
public static byte[] AnalyseSPC(SpcHead1 m_head1, SpcHead2 m_head2, GermaniumCalib m_calibParam) {
String standard_spc = "D:\\ARMD\\材料\\spc-ims\\standard.SPC";
File standardSpc = new File(standard_spc);
if(!standardSpc.exists()) {
String Warning = standard_spc + " isn't exist.";
return new byte[0];
}
RandomAccessFile SpcFile = null;
try {
SpcFile = new RandomAccessFile(standard_spc, "r");
short Inftyp = 0;
short Filtyp = 0;
//读取第一个数据
byte[] first = new byte[2];
SpcFile.read(first);
Inftyp = Short.valueOf(convert(first, "short"));
//读取第二个数据
byte[] second = new byte[2];
SpcFile.read(second);
Filtyp = Short.valueOf(convert(second, "short"));
if(Inftyp != 1 || Filtyp != 1) {
String Warning = "The Format of "+standardSpc+" is Error!";
return new byte[0];
}
int length = (int) SpcFile.length();
byte[] m_totalContents = new byte[length];
SpcFile.seek(0);
SpcFile.read(m_totalContents);
// 读入整形spc文件的头记录第一个记录128字节
SpcFile.seek(0);
//头部信息需要读取的字节数
byte[] headByte1 = new byte[80];
SpcFile.read(headByte1);
//读取后赋值
m_head1.Inftyp = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 0, 2), "short"));
m_head1.Filtyp = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 2, 4), "short"));
m_head1.Reserved1 = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 4, 6), "short"));
m_head1.Reserved2 = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 6, 8), "short"));
m_head1.AcqInfRP = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 8, 10), "short"));
m_head1.SamDesRP = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 10, 12), "short"));
m_head1.DetDesRP = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 12, 14), "short"));
m_head1.EbrDesRP = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 14, 16), "short"));
m_head1.AnaRP1 = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 16, 18), "short"));
m_head1.AnaRP2 = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 18, 20), "short"));
m_head1.AnaRP3 = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 20, 22), "short"));
m_head1.AnaRP4 = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 22, 24), "short"));
m_head1.SrpDesRP = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 24, 26), "short"));
m_head1.IeqDesRP = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 26, 28), "short"));
m_head1.GeoDesRP = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 28, 30), "short"));
m_head1.MpcDesRP = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 30, 32), "short"));
m_head1.CalDesRP = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 32, 34), "short"));
m_head1.CalRP1 = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 34, 36), "short"));
m_head1.CalRP2 = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 36, 38), "short"));
m_head1.EffRP = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 38, 40), "short"));
m_head1.ROI1 = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 40, 42), "short"));
m_head1.EngPrRP = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 42, 44), "short"));
m_head1.EngPrNum = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 44, 46), "short"));
m_head1.Reserved3 = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 46, 48), "short"));
m_head1.DDP = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 48, 50), "short"));
m_head1.ActUnit = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 50, 52), "short"));
m_head1.LabPerRP = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 52, 54), "short"));
m_head1.MaxNumE = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 54, 56), "short"));
m_head1.MaxNumU = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 56, 58), "short"));
m_head1.EffNum = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 58, 60), "short"));
m_head1.SpcFirstRP = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 60, 62), "short"));
m_head1.SpcRecNum = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 62, 64), "short"));
m_head1.SpcChnNum = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 64, 66), "short"));
m_head1.Abstch = Short.valueOf(convert(Arrays.copyOfRange(headByte1, 66, 68), "short"));
m_head1.AcqTime = Float.valueOf(convert(Arrays.copyOfRange(headByte1, 68, 72), "float"));
m_head1.AcqTime8 = Double.valueOf(convert(Arrays.copyOfRange(headByte1, 72, 80), "double"));
SpcFile.seek(78);
byte[] headByte2 = new byte[20];
SpcFile.read(headByte2);
m_head2.AddRAM = Short.valueOf(convert(Arrays.copyOfRange(headByte2, 0, 2), "short"));
m_head2.Seqnum = Short.valueOf(convert(Arrays.copyOfRange(headByte2, 2, 4), "short"));
m_head2.Mcanu = Short.valueOf(convert(Arrays.copyOfRange(headByte2, 4, 6), "short"));
m_head2.Segnum = Short.valueOf(convert(Arrays.copyOfRange(headByte2, 6, 8), "short"));
m_head2.Mcadvt = Short.valueOf(convert(Arrays.copyOfRange(headByte2, 8, 10), "short"));
m_head2.Chnsrt = Short.valueOf(convert(Arrays.copyOfRange(headByte2, 10, 12), "short"));
m_head2.RealTime = Float.valueOf(convert(Arrays.copyOfRange(headByte2, 12, 16), "float"));
m_head2.LiveTime = Float.valueOf(convert(Arrays.copyOfRange(headByte2, 16, 20), "float"));
// Germanium Calibration
SpcFile.seek((m_head1.CalRP1-1)*128);
byte[] charByte = new byte[128];
SpcFile.read(charByte);
m_calibParam.Afit = Short.valueOf(convert(Arrays.copyOfRange(charByte, 0, 2) , "short"));
m_calibParam.Bfit = Short.valueOf(convert(Arrays.copyOfRange(charByte, 2, 4), "short"));
m_calibParam.EffPairs = Short.valueOf(convert(Arrays.copyOfRange(charByte, 4, 6), "short"));
m_calibParam.NumOfChan = Short.valueOf(convert(Arrays.copyOfRange(charByte, 6, 8), "short"));
m_calibParam.Knee = Float.valueOf(convert(Arrays.copyOfRange(charByte, 8, 12), "float"));
m_calibParam.Asig = Float.valueOf(convert(Arrays.copyOfRange(charByte, 12, 16), "float"));
m_calibParam.Bsig = Float.valueOf(convert(Arrays.copyOfRange(charByte, 16, 20), "float"));
m_calibParam.EnerCoefA = Float.valueOf(convert(Arrays.copyOfRange(charByte, 20, 24), "float"));
m_calibParam.EnerCoefB = Float.valueOf(convert(Arrays.copyOfRange(charByte, 24, 28), "float"));
m_calibParam.EnerCoefC = Float.valueOf(convert(Arrays.copyOfRange(charByte, 28, 32), "float"));
m_calibParam.FwhmCoefA = Float.valueOf(convert(Arrays.copyOfRange(charByte, 32, 36), "float"));
m_calibParam.FwhmCoefB = Float.valueOf(convert(Arrays.copyOfRange(charByte, 36, 40), "float"));
m_calibParam.FwhmCoefC = Float.valueOf(convert(Arrays.copyOfRange(charByte, 40, 44), "float"));
m_calibParam.AboveEffiCoefA = Float.valueOf(convert(Arrays.copyOfRange(charByte, 44, 48), "float"));
m_calibParam.AboveEffiCoefB = Float.valueOf(convert(Arrays.copyOfRange(charByte, 48, 52), "float"));
m_calibParam.AboveEffiCoefC = Float.valueOf(convert(Arrays.copyOfRange(charByte, 52, 56), "float"));
m_calibParam.BelowEffiCoefA = Float.valueOf(convert(Arrays.copyOfRange(charByte, 56, 60), "float"));
m_calibParam.BelowEffiCoefB = Float.valueOf(convert(Arrays.copyOfRange(charByte, 60, 64), "float"));
m_calibParam.BelowEffiCoefC = Float.valueOf(convert(Arrays.copyOfRange(charByte, 64, 68), "float"));
m_calibParam.FwhmTyp = Short.valueOf(convert(Arrays.copyOfRange(charByte, 68, 70), "short"));
m_calibParam.PeType = Short.valueOf(convert(Arrays.copyOfRange(charByte, 70, 72), "short"));
m_calibParam.MaestroPSS = Short.valueOf(convert(Arrays.copyOfRange(charByte, 72, 74), "short"));
m_calibParam.EngPairs = Short.valueOf(convert(Arrays.copyOfRange(charByte, 74, 76), "short"));
m_calibParam.DetectorNum = Short.valueOf(convert(Arrays.copyOfRange(charByte, 76, 78), "short"));
m_calibParam.NumBelowKnee = Short.valueOf(convert(Arrays.copyOfRange(charByte, 78, 80), "short"));
m_calibParam.ENA2 = Float.valueOf(convert(Arrays.copyOfRange(charByte, 80, 84), "float"));
m_calibParam.ENB2 = Float.valueOf(convert(Arrays.copyOfRange(charByte, 84, 88), "float"));
m_calibParam.ENC2 = Float.valueOf(convert(Arrays.copyOfRange(charByte, 88, 92), "float"));
m_calibParam.CalUncert = Float.valueOf(convert(Arrays.copyOfRange(charByte, 92, 96), "float"));
m_calibParam.CalDif = Float.valueOf(convert(Arrays.copyOfRange(charByte, 96, 100), "float"));
m_calibParam.PolyCoef7 = Float.valueOf(convert(Arrays.copyOfRange(charByte, 100, 104), "float"));
m_calibParam.PolyCoef8 = Float.valueOf(convert(Arrays.copyOfRange(charByte, 104, 108), "float"));
m_calibParam.PolyCoef9 = Float.valueOf(convert(Arrays.copyOfRange(charByte, 108, 112), "float"));
m_calibParam.PolyCoef10 = Float.valueOf(convert(Arrays.copyOfRange(charByte, 112, 116), "float"));
m_calibParam.LowChanFwhmErr = Float.valueOf(convert(Arrays.copyOfRange(charByte, 116, 120), "float"));
m_calibParam.HighChanFwhmErr = Float.valueOf(convert(Arrays.copyOfRange(charByte, 120, 124), "float"));
m_calibParam.CalibLimit = Short.valueOf(convert(Arrays.copyOfRange(charByte, 124, 126), "short"));
m_calibParam.STypeFlag = Short.valueOf(convert(Arrays.copyOfRange(charByte, 126, 128), "short"));
SpcFile.close();
return m_totalContents;
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public static void MakeSpcHead(FileData datas, SpcHead1 m_head1, SpcHead2 m_head2) {
m_head1.Inftyp = 1;
m_head1.Filtyp = 1;
if(datas.getVvEner().size() > 0 && datas.getVvReso().size() > 0) {
int size = Math.min(datas.getVvEner().get(0).size(), datas.getVvReso().get(0).size());
if(size > 32*1) {
size = 32*1;
}
m_head1.EngPrNum = (short) size;
}
if(datas.getVvEffi().size() > 0) {
m_head1.EffNum = (short) datas.getVvEffi().get(0).size();
}
m_head1.SpcRecNum = (short) (datas.getNum_count()/32);
m_head1.SpcChnNum = (short) datas.getNum_count();
m_head1.AcqTime = 12631.7f;
m_head1.AcqTime8 = 12631.7;
m_head2.Chnsrt = (short) datas.getStart_chan();
m_head2.RealTime = datas.getAcq_real();
m_head2.LiveTime = datas.getAcq_live();
}
public static void MakeCalibParam(FileData datas, GermaniumCalib m_calibParam) {
if(datas.getVvEffi().size() < 3 || datas.getVvEner().size() < 3 || datas.getVvReso().size() < 3) {
return;
}
// 读入整形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;
m_calibParam.NumOfChan = (short) datas.getNum_count();
if(datas.getVvEner().size() > 0 && datas.getVvReso().size() > 0) {
int size = Math.min(datas.getVvEner().get(0).size(), datas.getVvReso().get(0).size());
if(size > 32*1) {
size = 32*1;
}
m_calibParam.EngPairs = (short) size;
}
char char1,char2;
char1=temchar[7];
char2=temchar[8];
if('0'==temchar[9]) {
temchar[7]='1'; //19xx<EFBFBD><EFBFBD>
temchar[8]='9';
if(datas.getVvEffi().size() > 0) {
m_calibParam.EffPairs = (short) datas.getVvEffi().get(0).size();
}
ParameterInfo ener_para = new ParameterInfo();
ener_para.setP(CalValuesHandler.calFitPara("Cal_Energy", 2, datas.getVvEner().get(1), datas.getVvEner().get(0), datas.getVvEner().get(2)));
ParameterInfo reso_para = new ParameterInfo();
reso_para.setP(CalValuesHandler.calFitPara("Cal_Resolution", 2, datas.getVvReso().get(0), datas.getVvReso().get(1), datas.getVvReso().get(2)));
if(ener_para.getP().size() < 3) {
return;
} else if(ener_para.getP().size() == 3) {
ener_para.getP().add(0.0);
}
if(reso_para.getP().size() < 3) {
return;
} else if(reso_para.getP().size() == 3) {
reso_para.getP().add(0.0);
}
m_calibParam.EnerCoefA = Float.valueOf(String.valueOf(ener_para.getP().get(1)));
m_calibParam.EnerCoefB = Float.valueOf(String.valueOf(ener_para.getP().get(2)));
m_calibParam.EnerCoefC = Float.valueOf(String.valueOf(ener_para.getP().get(3)));
m_calibParam.FwhmCoefA = Float.valueOf(String.valueOf(reso_para.getP().get(1)));
m_calibParam.FwhmCoefB = Float.valueOf(String.valueOf(reso_para.getP().get(2)));
m_calibParam.FwhmCoefC = Float.valueOf(String.valueOf(reso_para.getP().get(3)));
}
public static String GetDate(String str) {
str = str.substring(0, 10); // YYYY/MM/DD
String temp = str.substring(str.length()-2)+ StringPool.DASH; // DD-
int month = Integer.valueOf(str.substring(5, 7));
switch(month) { // DD-MMM
case 1: temp+="Jan"; break;
case 2: temp+="Feb"; break;
case 3: temp+="Mar"; break;
case 4: temp+="Apr"; break;
case 5: temp+="May"; break;
case 6: temp+="Jun"; break;
case 7: temp+="Jul"; break;
case 8: temp+="Aug"; break;
case 9: temp+="Sep"; break;
case 10: temp+="Oct"; break;
case 11: temp+="Nov"; break;
case 12: temp+="Dec"; break;
default: temp+="Jan"; break;
}
temp+=String.format("-%s", str.substring(2, 4)); // DD-MMM-YY
if(str.substring(0, 2) == "20") { // DD-MMM-YY*
temp+="1";
} else {
temchar[7]='2'; //20xx<EFBFBD><EFBFBD>
temchar[8]='0';
temp+="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));
fileData.setAcq_date(acq_date);
String acq_time = LocalTime.of(AcqH, AcqMin, seconds, ms)
.format(DateTimeFormatter.ofPattern(DateConstant.TIME_MS));
fileData.setAcq_time(acq_time);
fileData.setAcq_real(head2.RealTime);
fileData.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));
fileData.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++) {
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;
i2 = EngNum - 1;
}
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++) {
fileData.getVvReso().get(0).add(Double.valueOf(Eng[i]));
fileData.getVvReso().get(1).add(Double.valueOf(FWHM[i]*fileData.getEner_slope()));
fileData.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++) {
fileData.getVvEffi().get(0).add(Double.valueOf(Eff[i*2]));
fileData.getVvEffi().get(1).add(Double.valueOf(Eff[i*2+1]));
fileData.getVvEffi().get(2).add(Double.valueOf(EffUnc));
}
}
// Spectrum
int[] SpcData = new int[100000];
fileData.setNum_count(head1.SpcChnNum);
fileData.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"));
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();
return temp;
}
public static String convert(byte[] bytes, String type) {
@ -471,55 +528,52 @@ public class Demo {
return "";
}
public static char[] byteToChar(byte[] data) throws CharacterCodingException {
/*return new String(data, StandardCharsets.UTF_16).toCharArray();*/
/*CharsetDecoder decoder = StandardCharsets.UTF_8.newDecoder();
String str = decoder.decode(ByteBuffer.wrap(data)).toString();
return str.toCharArray();*/
ByteBuffer bb = ByteBuffer.allocate (data.length);
bb.put (data);
bb.flip ();
Charset cs = StandardCharsets.UTF_8;
CharBuffer cb = cs.decode (bb);
return cb.array();
public static byte[] writeShort(int v) {
byte[] byteArr = new byte[2];
byteArr[0] = (byte) ((v >>> 0) & 0xFF);
byteArr[1] = (byte) ((v >>> 8) & 0xFF);
return byteArr;
}
public static float[] byteToFloats(byte[] data) {
// 每个浮点数占用4个字节
int floatCount = data.length / 4;
float[] floatArray = new float[floatCount];
ByteBuffer buffer = ByteBuffer.wrap(data);
for (int i = 0; i < floatCount; i++) {
floatArray[i] = buffer.getFloat();
}
return floatArray;
public static byte[] writeChar(int v) {
byte[] byteArr = new byte[2];
byteArr[0] = (byte) ((v >>> 0) & 0xFF);
byteArr[1] = (byte) ((v >>> 8) & 0xFF);
return byteArr;
}
public static float byteToFloat(byte[] data) {
ByteBuffer buffer = ByteBuffer.wrap(data);
// 设置字节顺序为小端序
buffer.order(ByteOrder.LITTLE_ENDIAN);
FloatBuffer floatBuffer = buffer.asFloatBuffer();
return floatBuffer.get();
public static byte[] writeInt(int v) {
byte[] byteArr = new byte[4];
byteArr[0] = (byte) ((v >>> 0) & 0xFF);
byteArr[1] = (byte) ((v >>> 8) & 0xFF);
byteArr[2] = (byte) ((v >>> 16) & 0xFF);
byteArr[3] = (byte) ((v >>> 24) & 0xFF);
return byteArr;
}
public static int[] byteToInts(byte[] data) {
ByteBuffer buffer = ByteBuffer.wrap(data);
// 设置字节顺序为小端序
buffer.order(ByteOrder.LITTLE_ENDIAN);
IntBuffer intBuffer = buffer.asIntBuffer();
int[] intArray = new int[intBuffer.remaining()];
intBuffer.get(intArray);
return intArray;
public static byte[] writeLong(long v) {
byte[] byteArr = new byte[8];
byteArr[0] = (byte) ((v >>> 0) & 0xFF);
byteArr[1] = (byte) ((v >>> 8) & 0xFF);
byteArr[2] = (byte) ((v >>> 16) & 0xFF);
byteArr[3] = (byte) ((v >>> 24) & 0xFF);
byteArr[4] = (byte) ((v >>> 32) & 0xFF);
byteArr[5] = (byte) ((v >>> 40) & 0xFF);
byteArr[6] = (byte) ((v >>> 48) & 0xFF);
byteArr[7] = (byte) ((v >>> 56) & 0xFF);
return byteArr;
}
public static short byteToShort(byte[] data) {
ByteBuffer buffer = ByteBuffer.wrap(data);
// 设置字节顺序为小端序
buffer.order(ByteOrder.LITTLE_ENDIAN);
return buffer.getShort();
public static byte[] writeFloat(float v) {
byte[] byteArr = writeInt(Float.floatToIntBits(v));
return byteArr;
}
public static byte[] writeDouble(double v) {
byte[] byteArr = writeLong(Double.doubleToLongBits(v));
return byteArr;
}
}

View File

@ -1,8 +1,10 @@
package org.jeecg.modules.controller;
import com.google.common.cache.Cache;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.cache.LocalCache;
import org.jeecg.modules.base.bizVo.GammaRLR;
import org.jeecg.modules.entity.vo.*;
import org.jeecg.modules.feignclient.SystemClient;
@ -15,6 +17,7 @@ import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.concurrent.ConcurrentMap;
@RestController
@RequestMapping("gamma")
@ -52,6 +55,13 @@ public class GammaController {
public Result gammaByFile(String fileName, HttpServletRequest request) {
return gammaService.gammaByFile(fileName, request);
}
@DeleteMapping("delPHDCache")
@ApiOperation(value = "删除PHD文件缓存", notes = "删除PHD文件缓存")
public void delPHDCache(@RequestParam String fileName) {
gammaService.delPHDCache(fileName);
}
@GetMapping("Compare")
public Result Compare(String fileName, String compareFileName, HttpServletRequest request) {
return gammaService.Compare(fileName, compareFileName, request);

View File

@ -20,6 +20,8 @@ public interface IGammaService{
Result gammaByFile(String fileName, HttpServletRequest request);
void delPHDCache(String fileName);
Result Compare(String fileName, String compareFileName, HttpServletRequest request);
Result Strip(String fileName, String stripFileName, Double ratioRate, HttpServletRequest request);

View File

@ -807,6 +807,15 @@ public class GammaServiceImpl extends AbstractLogOrReport implements IGammaServi
return result;
}
@Override
public void delPHDCache(String fileName) {
LoginUser loginUser = (LoginUser)SecurityUtils.getSubject().getPrincipal();
String username = loginUser.getUsername();
String key = fileName + StrUtil.DASHED + username;
// 删除指定key的Cache
localCache.deletePHDCache(key);
}
@Override
public Result Compare(String fileName, String compareFileName, HttpServletRequest request) {
Result result = new Result();