Compare commits

..

No commits in common. "3a09022a293cec8570f928cc93de5a331a6606b6" and "c0c1ee39e38791c8c3c534334dbdd4d379190742" have entirely different histories.

11 changed files with 367 additions and 431 deletions

View File

@ -1,4 +1,4 @@
#include <iostream>
#include <iostream>
#include <QDebug>
#include "CoincidenceSpectrumProcess.h"
@ -175,18 +175,21 @@ void SortDataByTimestamp(std::vector<SpectrumData>& data)
}
// 2-9次能谱符合处理
bool ProcessCoincidence(
std::vector<SpectrumData>& data,
std::vector<CoincidenceEvent>& events,
std::vector<CoincidenceEvent> ProcessCoincidence(
const std::vector<SpectrumData>& data,
unsigned int time_window,
int min_order,
int max_order
)
{
std::vector<CoincidenceEvent> results;
int n = data.size();
if (n < min_order) {
return false;
std::cerr << "错误:数据量不足,无法进行" << min_order << "次符合处理" << std::endl;
return results;
}
std::cout << "开始进行" << min_order << "-" << max_order << "次能谱符合处理,时间窗口:"
<< time_window << "ns" << std::endl;
// 使用滑动窗口寻找符合事件
for (int i = 0; i < n; ++i) {
std::vector<SpectrumData> current_coincidence;
@ -210,10 +213,11 @@ bool ProcessCoincidence(
result.coincidence_order = coincidence_order;
result.events = current_coincidence;
result.time_window = time_window;
events.push_back(result);
results.push_back(result);
}
}
return true;
qDebug() << "符合处理完成,共找到 " << results.size() << " 个符合事件" ;
return results;
}
// 统计符合事件结果

View File

@ -1,4 +1,4 @@
#ifndef COINCIDENCESPECTRUMPROCESS_H
#ifndef COINCIDENCESPECTRUMPROCESS_H
#define COINCIDENCESPECTRUMPROCESS_H
#include <armadillo>
@ -36,9 +36,8 @@ namespace F2t9Order {
void SortDataByTimestamp(std::vector<SpectrumData>& data);
// 2-9次能谱符合处理
bool ProcessCoincidence(
std::vector<SpectrumData> &data,
std::vector<CoincidenceEvent> &events,
std::vector<CoincidenceEvent> ProcessCoincidence(
const std::vector<SpectrumData>& data,
unsigned int time_window, // 时间窗口(纳秒)
int min_order = 2, // 最小符合次数
int max_order = 9 // 最大符合次数

View File

@ -21,7 +21,6 @@
#include "DataCalcProcess/GaussPolyCoe.h"
#include "DataCalcProcess/NolinearLeastSquaresCurveFit.h"
#include "EnergyScaleDataModel.h"
#include "DataCalcProcess/CoincidenceSpectrumProcess.h"
#include <QDebug>
using namespace DataProcessWorkPool;
@ -103,6 +102,97 @@ bool ParticleDataTask::processTask()
return processEveryChannelParticleData();
}
void EveryChannelParticleDataSeparateTask::SetResultDataDir(const QString& result_data_dir)
{
this->_result_data_dir = result_data_dir;
}
const QString& EveryChannelParticleDataSeparateTask::GetResultDataDir() const
{
return this->_result_data_dir;
}
bool EveryChannelParticleDataSeparateTask::IsValidSetWorkParameters() const
{
return (!GetResultDataDir().isEmpty()) && ParticleDataTask::IsValidSetWorkParameters();
}
bool EveryChannelParticleDataSeparateTask::processEveryChannelParticleData()
{
bool ret_ok = true;
const QString& result_data_output_dir_path = GetResultDataDir();
QDir result_data_output_dir(result_data_output_dir_path);
result_data_output_dir.mkpath(result_data_output_dir_path);
const QString& all_channel_particle_data_filename = GetAllChannelParticleDataFilename();
QMap<uint, QString> particle_data_filename_list;
try {
QMap<uint, std::shared_ptr<std::ofstream>> ch_particle_data_of_list;
std::string board_id_str = QString(QStringLiteral(u"板卡号")).toStdString();
std::string channel_id_str = QString(QStringLiteral(u"通道号")).toStdString();
std::string address_str = QString(QStringLiteral(u"道址")).toStdString();
std::string time_str = QString(QStringLiteral(u"时间计数")).toStdString();
// 使用更灵活的方式处理CSV文件忽略额外列
io::CSVReader<
4,
io::trim_chars<' ', '\t'>,
io::double_quote_escape<',', '"'>,
io::throw_on_overflow,
io::empty_line_comment>
reader(QStrToSysPath(all_channel_particle_data_filename));
reader.read_header(io::ignore_extra_column, board_id_str, channel_id_str, address_str, time_str);
uint board_id;
uint channel_id;
uint address;
unsigned long long time;
while (reader.read_row(board_id, channel_id, address, time)) {
// 板卡和通道号计算,通道号 = 板卡号 * 4 + 通道号
int channel_num = (board_id) * 4 + (channel_id + 1);
QString particle_data_filename = result_data_output_dir.filePath(QStringLiteral(u"通道%1粒子数据.csv").arg(channel_num));
if (!particle_data_filename_list.contains(channel_num)) {
particle_data_filename_list.insert(channel_num, particle_data_filename);
}
if (!ch_particle_data_of_list.contains(channel_num)) {
std::shared_ptr<std::ofstream> out(
new std::ofstream(QStrToSysPath(particle_data_filename), std::ios::out | std::ios::app),
[](std::ofstream* p) { p->close(); });
*out << QString(QStringLiteral(u"板卡号,通道号,道址,时间计数")).toStdString() << std::endl;
ch_particle_data_of_list.insert(channel_num, out);
}
auto ch_particle_data_of = ch_particle_data_of_list.value(channel_num);
*ch_particle_data_of << board_id << "," << channel_id << "," << address << "," << time << std::endl;
}
} catch (const std::runtime_error& e) {
const QString& e_what = QString::fromLatin1(e.what());
QString error = QString(QStringLiteral(u"处理%1发生运行时异常:%2")).arg(all_channel_particle_data_filename).arg(e_what);
LOG_ERROR(error)
ret_ok = false;
} catch (const std::exception& e) {
const QString& e_what = QString::fromLatin1(e.what());
QString error = QString(QStringLiteral(u"处理%1异常:%2")).arg(all_channel_particle_data_filename).arg(e_what);
LOG_ERROR(error)
ret_ok = false;
} catch (...) {
QString error = QString(QStringLiteral(u"处理%1未知异常.")).arg(all_channel_particle_data_filename);
LOG_ERROR(error)
ret_ok = false;
}
const QString& project_name = GetProjectName();
MeasureAnalysisProjectModel* project_model = ProjectList::Instance()->GetProjectModel(project_name);
if (project_model == nullptr) {
ret_ok = false;
}
for (auto it = particle_data_filename_list.begin(); it != particle_data_filename_list.end(); ++it) {
// project_model->SetChannelParticleDataFilename(it.key(), it.value());
}
return ret_ok;
}
void EveryChannelParticleCountDataTask::SetAllChannelCountResultDir(const QString& dir_path)
{
this->_all_ch_count_dir = dir_path;
@ -133,20 +223,29 @@ bool EveryChannelParticleCountDataTask::processEveryChannelParticleData()
bool ret_ok = true;
const QString& all_ch_count_dir = GetAllChannelCountResultDir();
const QString& every_ch_count_dir = GetEveryChannelCountResultDir();
QDir all_ch_count_output_dir(all_ch_count_dir);
all_ch_count_output_dir.mkpath(all_ch_count_dir);
QDir every_ch_count_output_dir(every_ch_count_dir);
every_ch_count_output_dir.mkpath(every_ch_count_dir);
const QString& all_channel_particle_data_filename = GetAllChannelParticleDataFilename();
QMap<uint, QString> particle_count_filename_list;
// QString all_channel_total_count_filename;
try {
// 统计每个通道的粒子计数(相同板卡号通道号相同道址)
QMap<uint, QMap<uint, unsigned long long>> channel_address_counts; // 通道号 -> 地址 -> 计数
// 统计所有通道的粒子计数(不同板卡号通道号相同道址)
// QMap<uint, uint> all_channel_address_counts; // 地址 -> 计数
std::string board_id_str = QString(QStringLiteral(u"板卡号")).toStdString();
std::string channel_id_str = QString(QStringLiteral(u"通道号")).toStdString();
std::string address_str = QString(QStringLiteral(u"道址")).toStdString();
std::string time_str = QString(QStringLiteral(u"时间计数")).toStdString();
// 使用更灵活的方式处理CSV文件忽略额外列
io::CSVReader<
4,
@ -163,36 +262,60 @@ bool EveryChannelParticleCountDataTask::processEveryChannelParticleData()
while (reader.read_row(board_id, channel_id, address, time)) {
// 板卡和通道号计算,通道号 = 板卡号 * 4 + 通道号
int channel_num = (board_id) * 4 + (channel_id + 1);
// 统计每个通道的粒子计数
if (!channel_address_counts.contains(channel_num)) {
channel_address_counts[channel_num] = QMap<uint, unsigned long long>();
}
channel_address_counts[channel_num][address]++;
// 统计所有通道的粒子计数
// all_channel_address_counts[address]++;
}
// 写入每个通道的粒子计数数据(优化:使用一次打开文件,批量写入)
QMap<uint, std::shared_ptr<std::ofstream>> channel_file_streams;
// 预创建所有通道的文件流
for (auto channel_it = channel_address_counts.begin(); channel_it != channel_address_counts.end(); ++channel_it) {
uint channel_num = channel_it.key();
QString count_data_filename = every_ch_count_output_dir.filePath(QStringLiteral(u"通道%1粒子计数.csv").arg(channel_num));
particle_count_filename_list.insert(channel_num, count_data_filename);
// 创建文件流
std::shared_ptr<std::ofstream> out(new std::ofstream(QStrToSysPath(count_data_filename)));
std::shared_ptr<std::ofstream> out(new std::ofstream( QStrToSysPath(count_data_filename)));
channel_file_streams[channel_num] = out;
*out << QString(QStringLiteral(u"道址")).toStdString() << "," << QString(QStringLiteral(u"计数")).toStdString() << std::endl;
}
// 批量写入数据
for (auto channel_it = channel_address_counts.begin(); channel_it != channel_address_counts.end(); ++channel_it) {
uint channel_num = channel_it.key();
const QMap<uint, unsigned long long>& address_counts = channel_it.value();
auto out_stream = channel_file_streams[channel_num];
for (auto address_it = address_counts.begin(); address_it != address_counts.end(); ++address_it) {
uint address = address_it.key();
unsigned long long count = address_it.value();
*out_stream << address << "," << count << std::endl;
}
}
// 文件流会在shared_ptr析构时自动关闭
channel_file_streams.clear();
// 写入所有通道的粒子计数数据
// all_channel_total_count_filename = all_ch_count_output_dir.filePath("AllChannelParticleTotalCountData.csv");
// std::ofstream all_channel_out(QStrToSysPath(all_channel_total_count_filename));
// all_channel_out << QString(QStringLiteral(u"道址")).toStdString() << "," << QString(QStringLiteral(u"计数")).toStdString() << std::endl;
// for (auto address_it = all_channel_address_counts.begin(); address_it != all_channel_address_counts.end(); ++address_it) {
// uint address = address_it.key();
// uint count = address_it.value();
// all_channel_out << address << "," << count << std::endl;
// }
// all_channel_out.close();
} catch (const std::runtime_error& e) {
const QString& e_what = QString::fromLatin1(e.what());
QString error = QStringLiteral(u"处理%1发生运行时异常:%2").arg(all_channel_particle_data_filename).arg(e_what);
@ -218,6 +341,8 @@ bool EveryChannelParticleCountDataTask::processEveryChannelParticleData()
for (auto it = particle_count_filename_list.begin(); it != particle_count_filename_list.end(); ++it) {
project_model->SetChannelAddressCountDataFilename(it.key(), it.value());
}
// 更新项目模型中的所有通道粒子总计数数据文件名
// project_model->SetAllChannelParticleTotalCountDataFilename(all_channel_total_count_filename);
}
const QString& info = QStringLiteral(u"所有通道粒子计数处理完成.");
LOG_INFO(info);
@ -354,7 +479,9 @@ void mergeChunks(const std::vector<std::string>& chunks, const std::string& outp
while (!min_heap.empty()) {
CsvRow current = min_heap.top();
min_heap.pop();
outFile << current.board_id << "," << current.channel_id << "," << current.address << "," << current.time << "\n";
size_t chunk_index = current.chunk_index;
if (chunk_readers[chunk_index]) {
uint board_id;
@ -462,64 +589,7 @@ bool CoincidenceEventAnalysisTask::processTask()
if (project_model == nullptr) {
return false;
}
const QString& particle_data_filename = project_model->GetAllChannelParticleDataFilename();
if (particle_data_filename.isEmpty()) {
return false;
}
std::string event_id_str = QString(QStringLiteral(u"事件ID")).toStdString();
std::string board_id_str = QString(QStringLiteral(u"板卡号")).toStdString();
std::string channel_id_str = QString(QStringLiteral(u"通道号")).toStdString();
std::string addr_str = QString(QStringLiteral(u"道址")).toStdString();
std::string time_str = QString(QStringLiteral(u"时间计数")).toStdString();
try {
io::CSVReader<
4,
io::trim_chars<' ', '\t'>,
io::double_quote_escape<',', '"'>,
io::throw_on_overflow,
io::empty_line_comment>
reader(QStrToSysPath(particle_data_filename));
reader.read_header(io::ignore_extra_column, board_id_str, channel_id_str, addr_str, time_str);
using namespace CoincidenceSpectrum::F2t9Order;
std::vector<SpectrumData> spec_data;
SpectrumData spec_data_item;
while (reader.read_row(
spec_data_item.board_id,
spec_data_item.channel_id,
spec_data_item.energy,
spec_data_item.timestamp)) {
spec_data.push_back(spec_data_item);
}
std::vector<CoincidenceEvent> events;
if (!ProcessCoincidence(spec_data, events, project_model->GetConformTimeWin())) {
LOG_WARN(QStringLiteral(u"粒子符合数据处理异常!"));
}
const QString& coincidence_data_dir_name = QStringLiteral(u"粒子符合数据");
QDir project_dir(project_model->GetProjectDir());
project_dir.mkpath(coincidence_data_dir_name);
const QString& coincidence_data_dir_path = project_dir.filePath(coincidence_data_dir_name);
QMap<int, std::shared_ptr<std::ofstream> > coincidence_data_out_stream_map;
for (const CoincidenceEvent& event : events) {
const QString& event_data_filename = QDir(coincidence_data_dir_path).filePath(QStringLiteral(u"[%1ns]%2个粒子符合事件[未刻度].csv").arg(project_model->GetConformTimeWin()).arg(event.coincidence_order));
if ( !coincidence_data_out_stream_map.contains(event.coincidence_order) ) {
std::shared_ptr<std::ofstream> out_stream(new std::ofstream(QStrToSysPath(event_data_filename)));
*out_stream << event_id_str << "," << board_id_str << "," << channel_id_str << "," << addr_str << "," << time_str << std::endl;
coincidence_data_out_stream_map[event.coincidence_order] = out_stream;
}
unsigned long long event_id = 0;
std::shared_ptr<std::ofstream> out_stream = coincidence_data_out_stream_map[event.coincidence_order];
for (const SpectrumData& data_item : event.events) {
++ event_id;
*out_stream << event_id << "," << data_item.board_id << "," << data_item.channel_id << "," << data_item.energy << "," << data_item.timestamp << std::endl;
}
project_model->SetTimeWinConformParticleData(project_model->GetConformTimeWin(), event.coincidence_order, event_data_filename);
}
} catch (const std::exception& e) {
const QString& e_what = QString::fromUtf8(e.what());
LOG_WARN(QStringLiteral(u"粒子符合数据处理异常:%1").arg(e_what));
return false;
}
const QString& info = QStringLiteral(u"粒子符合数据处理完成.");
const QString& info = QStringLiteral(u"粒子符合事件数据处理完成.");
LOG_INFO(info);
return true;
}
@ -757,7 +827,6 @@ bool EnergyScaleParticleDataTask::processTask()
}
}
out.close();
project_model->SetParticleEnergyDataFilename(energy_spectrum_filename);
} catch (const std::exception& e) {
out.close();
std::remove(QStrToSysPath(energy_spectrum_filename));
@ -850,7 +919,7 @@ bool EnergyCountProcessTask::processTask()
return true;
}
bool EnergyScaleCoincidenceDataTask::processTask()
bool EnergyScaleCoincidenceEventDataTask::processTask()
{
const QString& project_name = GetProjectName();
MeasureAnalysisProjectModel* project_model = ProjectList::Instance()->GetProjectModel(project_name);
@ -864,73 +933,6 @@ bool EnergyScaleCoincidenceDataTask::processTask()
if (!energy_scale_data_model.IsValid()) {
return false;
}
const QString& coincidence_data_dir_name = QStringLiteral(u"符合能谱数据");
QDir project_dir(project_model->GetProjectDir());
project_dir.mkpath(coincidence_data_dir_name);
const QString& coincidence_data_dir_path = project_dir.filePath(coincidence_data_dir_name);
std::string event_id_str = QString(QStringLiteral(u"事件ID")).toStdString();
std::string board_id_str = QString(QStringLiteral(u"板卡号")).toStdString();
std::string channel_id_str = QString(QStringLiteral(u"通道号")).toStdString();
std::string addr_str = QString(QStringLiteral(u"道址")).toStdString();
std::string energy_str = QString(QStringLiteral(u"能量(KeV)")).toStdString();
std::string time_str = QString(QStringLiteral(u"时间计数")).toStdString();
auto conformParticleDataEnergyScale = [&](int time_win, int coincidence_order, const QString& conform_particle_data_filename) -> bool {
try {
io::CSVReader<
5,
io::trim_chars<' ', '\t'>,
io::double_quote_escape<',', '"'>,
io::throw_on_overflow,
io::empty_line_comment>
reader(QStrToSysPath(conform_particle_data_filename));
reader.read_header(io::ignore_extra_column, event_id_str, board_id_str, channel_id_str, addr_str, time_str);
const QString& data_name = QStringLiteral(u"[%1ns]%2个粒子符合事件.csv").arg(time_win).arg(coincidence_order);
const QString& coincidence_energy_data_filename = QDir(coincidence_data_dir_path).filePath(data_name);
std::ofstream out_stream(QStrToSysPath(coincidence_energy_data_filename));
out_stream << event_id_str << "," << board_id_str << "," << channel_id_str << "," << energy_str << "," << time_str << "\n" ;
using namespace CoincidenceSpectrum::F2t9Order;
unsigned long long event_id;
SpectrumData data_item;
while (reader.read_row(
event_id,
data_item.board_id,
data_item.channel_id,
data_item.energy,
data_item.timestamp)) {
int channel_num = (data_item.board_id) * 4 + (data_item.channel_id + 1);
const QString& channel_name = QStringLiteral(u"通道%1").arg(channel_num);
auto coeffs = energy_scale_data_model.GetEnergyFitResultCoeffs(channel_name);
if (!coeffs.empty()) {
data_item.energy = GaussPolyCoe::Predict(coeffs, data_item.energy);
out_stream << event_id << "," << data_item.board_id << "," << data_item.channel_id << "," << data_item.energy << "," << data_item.timestamp << "\n" ;
} else {
LOG_WARN(QStringLiteral(u"符合能谱数据处理异常:%1能量刻度拟合参数为空!").arg(channel_name));
// out_stream.close();
// QFile::remove(coincidence_energy_data_filename);
// return false;
}
}
out_stream.close();
project_model->SetTimeWinConformEnergyData(time_win, coincidence_order, coincidence_energy_data_filename);
} catch (const std::exception& e) {
const QString& e_what = QString::fromStdString(e.what());
LOG_WARN(QStringLiteral(u"符合能谱数据处理异常:%1").arg(e_what));
return false;
}
return true;
};
const auto& conform_particle_data_filename_list = project_model->GetConformParticleDataFilenameList();
for (const auto& time_win : conform_particle_data_filename_list.keys()) {
const auto& time_win_event_data_filename_list = conform_particle_data_filename_list.value(time_win);
for (const auto& coincidence_order : time_win_event_data_filename_list.keys()) {
const QString& conform_particle_data_filename = time_win_event_data_filename_list.value(coincidence_order);
conformParticleDataEnergyScale(time_win, coincidence_order, conform_particle_data_filename);
}
}
const QString& info = QStringLiteral(u"符合能谱数据处理完成.");
LOG_INFO(info);
return true;

View File

@ -55,6 +55,19 @@ namespace DataProcessWorkPool
QString _all_channel_particle_data_filename;
};
class EveryChannelParticleDataSeparateTask : public ParticleDataTask
{
public:
void SetResultDataDir(const QString& result_data_dir);
const QString& GetResultDataDir() const;
virtual bool IsValidSetWorkParameters() const;
private:
virtual bool processEveryChannelParticleData() override;
private:
QString _result_data_dir;
};
class EveryChannelParticleCountDataTask : public ParticleDataTask
{
public:
@ -138,7 +151,7 @@ namespace DataProcessWorkPool
virtual bool processTask() override;
};
class EnergyScaleCoincidenceDataTask : public DataProcessTask
class EnergyScaleCoincidenceEventDataTask : public DataProcessTask
{
private:
virtual bool processTask() override;

View File

@ -13,7 +13,6 @@
#include <QDialog>
#include <QPushButton>
#include <QCheckBox>
#include <QwtScaleDiv>
EnergyCountPlotView::EnergyCountPlotView(QWidget *parent)
@ -63,12 +62,12 @@ void EnergyCountPlotView::setupPlot()
QwtPlotCanvas* canvas = qobject_cast<QwtPlotCanvas*>(_plot->canvas());
canvas->setFrameStyle(QFrame::NoFrame);
_plot->setAxisTitle(QwtPlot::xBottom, QString(QStringLiteral(u"能量(KeV)")));
_plot->setAxisTitle(QwtPlot::xBottom, QString(QStringLiteral(u"能量")));
_plot->setAxisTitle(QwtPlot::yLeft, QString(QStringLiteral(u"计数")));
// set axis auto scale
_plot->setAxisAutoScale(QwtPlot::xBottom, true);
_plot->setAxisAutoScale(QwtPlot::yLeft, true);
// 启用网格线
_plot->enableAxis(QwtPlot::xBottom);
_plot->enableAxis(QwtPlot::yLeft);

View File

@ -140,8 +140,6 @@ void MainWindow::initMainWindow()
// 构建日志输出视图
_plain_edit_info_output = new QPlainTextEdit;
_plain_edit_info_output->setReadOnly(true);
_plain_edit_info_output->setFrameShape(QFrame::NoFrame);
_plain_edit_info_output->setLineWidth(0);
ads::CDockWidget* dockw_info_output = new ads::CDockWidget(QStringLiteral(u"信息输出"));
dockw_info_output->setWidget(_plain_edit_info_output);
dockw_info_output->setMinimumSizeHintMode(ads::CDockWidget::MinimumSizeHintFromContentMinimumSize);
@ -166,10 +164,6 @@ void MainWindow::initAction()
count_task->SetEveryChannelCountResultDir(every_ch_count_dir);
count_task->SetFinishedNotifier(project_list_model, "onChannelAddressCountProcessFinished", project_model->GetProjectName());
count_task->StartTask();
auto coincidence_process_task = new DataProcessWorkPool::CoincidenceEventAnalysisTask;
coincidence_process_task->SetFinishedNotifier(project_list_model, "onCoincidenceProcessFinished", project_model->GetProjectName());
coincidence_process_task->StartTask();
}
}
};

View File

@ -67,6 +67,47 @@
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="btn_load">
<property name="text">
<string>加载测量分析</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btn_export_data">
<property name="text">
<string>导出测量分析数据</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btn_import_particle_data">
<property name="text">
<string>导入测量粒子数据</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btn_remove">
<property name="text">
<string>删除</string>
</property>
</widget>
</item>
</layout>
</item>
<item>

View File

@ -231,11 +231,6 @@ const QString MeasureAnalysisProjectModel::GetParticleEnergyDataFilename() const
return this->_particle_energy_data_filename;
}
const QMap<uint, QMap<uint, QString> > MeasureAnalysisProjectModel::GetConformParticleDataFilenameList() const
{
return this->_time_win_conform_particle_data;
}
const QMap<uint, QString> MeasureAnalysisProjectModel::GetTimeWinConformParticleDataFilenameList(uint time_win) const
{
QMap<uint, QString> conform_particle_data;
@ -245,11 +240,6 @@ const QMap<uint, QString> MeasureAnalysisProjectModel::GetTimeWinConformParticle
return conform_particle_data;
}
const QMap<uint, QMap<uint, QString> > MeasureAnalysisProjectModel::GetConformParticleEnergyDataFilenameList() const
{
return this->_time_win_conform_energy_data;
}
const QMap<uint, QString> MeasureAnalysisProjectModel::GetTimeWinConformEnergyDataFilenameList(uint time_win) const
{
QMap<uint, QString> conform_energy_data;
@ -266,23 +256,52 @@ const QString MeasureAnalysisProjectModel::GetAnalysisCustomData(AnalysisType an
bool MeasureAnalysisProjectModel::LoadProjectModel(const QString& project_filename)
{
QVariantMap model_data;
if (!project_filename.isEmpty()) {
this->_project_filename = project_filename;
QFileInfo project_fileinfo(project_filename);
this->_project_dir = project_fileinfo.absoluteDir().absolutePath();
QFile json_file(this->_project_filename);
if (!json_file.open(QIODevice::ReadOnly | QIODevice::Text)) {
return false;
}
QJsonDocument json_doc = QJsonDocument::fromJson(json_file.readAll());
json_file.close();
if (json_doc.isNull())
return false;
if (!json_doc.isObject())
return false;
model_data = json_doc.object().toVariantMap();
this->_project_filename = project_filename;
// 从json文件加载项目模型
QFile json_file(this->_project_filename);
if (!json_file.open(QIODevice::ReadOnly | QIODevice::Text)) {
return false;
}
QJsonDocument json_doc = QJsonDocument::fromJson(json_file.readAll());
json_file.close();
if (json_doc.isNull()) {
return false;
}
if (!json_doc.isObject()) {
return false;
}
QJsonObject json_obj = json_doc.object();
if (!json_obj.contains("ProjectName")) {
return false;
}
this->_project_name = json_obj["ProjectName"].toString();
if (!json_obj.contains("SpectrumType")) {
return false;
}
this->_spec_type = (SpectrumType)json_obj["SpectrumType"].toInt();
if (!json_obj.contains("IsStandardSource")) {
return false;
}
this->_is_std_source = json_obj["IsStandardSource"].toBool();
if (!json_obj.contains("DescriptionInfo")) {
return false;
}
this->_description_info = json_obj["DescriptionInfo"].toString();
if (!json_obj.contains("MeasurePresetTime")) {
return false;
}
this->_measure_preset_time = json_obj["MeasurePresetTime"].toInt();
if (!json_obj.contains("IsMeasureComplete")) {
return false;
}
this->_is_measure_complete = json_obj["IsMeasureComplete"].toBool();
if (!json_obj.contains("ConformTimeWin")) {
return false;
}
this->_conform_time_win = json_obj["ConformTimeWin"].toInt();
QFileInfo project_fileinfo(project_filename);
this->_project_dir = project_fileinfo.absoluteDir().absolutePath();
auto ProjectAbsFilename = [this](const QString& project_relative_filename){
QString project_abs_filename;
@ -296,73 +315,34 @@ bool MeasureAnalysisProjectModel::LoadProjectModel(const QString& project_filena
}
return project_abs_filename;
};
if (!model_data.contains("ProjectName"))
return false;
this->_project_name = model_data["ProjectName"].toString();
if (!model_data.contains("SpectrumType"))
return false;
this->_spec_type = SpectrumType(model_data["SpectrumType"].toInt());
if (!model_data.contains("IsStandardSource"))
return false;
this->_is_std_source = model_data["IsStandardSource"].toBool();
if (!model_data.contains("DescriptionInfo"))
return false;
this->_description_info = model_data["DescriptionInfo"].toString();
if (!model_data.contains("MeasurePresetTime"))
return false;
this->_measure_preset_time = model_data["MeasurePresetTime"].toInt();
if (!model_data.contains("IsMeasureComplete"))
return false;
this->_is_measure_complete = model_data["IsMeasureComplete"].toBool();
if (!model_data.contains("ConformTimeWin"))
return false;
this->_conform_time_win = model_data["ConformTimeWin"].toInt();
this->_measure_device_params_cfg_filename = ProjectAbsFilename(model_data["MeasureDeviceParamsCfgFilename"].toString());
this->_energy_scale_filename = ProjectAbsFilename(model_data["EnergyScaleFilename"].toString());
this->_efficiency_scale_filename = ProjectAbsFilename(model_data["EfficiencyScaleFilename"].toString());
this->_all_channel_particle_data_filename = ProjectAbsFilename(model_data["AllChannelParticleDataFilename"].toString());
const auto& address_count_data_filename_list = model_data["ChannelAddressCountDataFilenameList"].toMap();
this->_measure_device_params_cfg_filename = ProjectAbsFilename(json_obj["MeasureDeviceParamsCfgFilename"].toString());
this->_energy_scale_filename = ProjectAbsFilename(json_obj["EnergyScaleFilename"].toString());
this->_efficiency_scale_filename = ProjectAbsFilename(json_obj["EfficiencyScaleFilename"].toString());
this->_all_channel_particle_data_filename = ProjectAbsFilename(json_obj["AllChannelParticleDataFilename"].toString());
const auto& address_count_data_filename_list = json_obj["ChannelAddressCountDataFilenameList"].toObject().toVariantMap();
for (auto it = address_count_data_filename_list.constBegin(); it!=address_count_data_filename_list.constEnd(); ++it) {
uint channel_num = it.key().toUInt();
this->_channel_address_count_data_filename_list[channel_num] = ProjectAbsFilename(it.value().toString());
}
const auto& energy_count_data_filename_list = model_data["ChannelEnergyCountDataFilenameList"].toMap();
const auto& energy_count_data_filename_list = json_obj["ChannelEnergyCountDataFilenameList"].toObject().toVariantMap();
for (auto it = energy_count_data_filename_list.constBegin(); it!=energy_count_data_filename_list.constEnd(); ++it) {
uint channel_num = it.key().toUInt();
this->_channel_energy_count_data_filename_list[channel_num] = ProjectAbsFilename(it.value().toString());
}
this->_all_channel_energy_total_count_data_filename = ProjectAbsFilename(model_data["AllChannelEnergyTotalCountDataFilename"].toString());
this->_particle_energy_data_filename = ProjectAbsFilename(model_data["ParticleEnergyDataFilename"].toString());
const auto& time_win_conform_particle_data = model_data["TimeWinConformParticleData"].toMap();
for (auto it1 = time_win_conform_particle_data.constBegin(); it1!=time_win_conform_particle_data.constEnd(); ++it1) {
uint time_win = it1.key().toUInt();
this->_all_channel_energy_total_count_data_filename = ProjectAbsFilename(json_obj["AllChannelEnergyTotalCountDataFilename"].toString());
this->_particle_energy_data_filename = ProjectAbsFilename(json_obj["ParticleEnergyDataFilename"].toString());
const auto& time_win_conform_particle_data = json_obj["TimeWinConformParticleData"].toObject().toVariantMap();
for (auto it = time_win_conform_particle_data.constBegin(); it!=time_win_conform_particle_data.constEnd(); ++it) {
uint time_win = it.key().toUInt();
QMap<uint, QString> conform_particle_data;
const auto& conform_particle_data_list = it1.value().toMap();
for (auto it2 = conform_particle_data_list.constBegin(); it2!=conform_particle_data_list.constEnd(); ++it2) {
uint particle_count = it2.key().toUInt();
conform_particle_data[particle_count] = ProjectAbsFilename(it2.value().toString());
}
// const auto& conform_particle_data_list = it.value().toObject().toVariantMap();
// for (auto it2 = conform_particle_data_list.constBegin(); it2!=conform_particle_data_list.constEnd(); ++it2) {
// uint particle_count = it2.key().toUInt();
// conform_particle_data[particle_count] = ProjectAbsFilename(it2.value().toString());
// }
this->_time_win_conform_particle_data[time_win] = conform_particle_data;
}
const auto& time_win_conform_energy_data = model_data["TimeWinConformEnergyData"].toMap();
for (auto it1 = time_win_conform_energy_data.constBegin(); it1!=time_win_conform_energy_data.constEnd(); ++it1) {
uint time_win = it1.key().toUInt();
QMap<uint, QString> conform_energy_data;
const auto& conform_energy_data_list = it1.value().toMap();
for (auto it2 = conform_energy_data_list.constBegin(); it2!=conform_energy_data_list.constEnd(); ++it2) {
uint particle_count = it2.key().toUInt();
conform_energy_data[particle_count] = ProjectAbsFilename(it2.value().toString());
}
this->_time_win_conform_energy_data[time_win] = conform_energy_data;
}
return true;
}
@ -398,41 +378,28 @@ bool MeasureAnalysisProjectModel::SaveProjectModel()
project_json_obj_map["EnergyScaleFilename"] = ProjectRelativeFilename(this->_energy_scale_filename);
project_json_obj_map["EfficiencyScaleFilename"] = ProjectRelativeFilename(this->_efficiency_scale_filename);
project_json_obj_map["AllChannelParticleDataFilename"] = ProjectRelativeFilename(this->_all_channel_particle_data_filename);
project_json_obj_map["ParticleEnergyDataFilename"] = ProjectRelativeFilename(this->_particle_energy_data_filename);
QVariantMap channel_address_count_data_filename_list;
for (auto it = this->_channel_address_count_data_filename_list.constBegin(); it != this->_channel_address_count_data_filename_list.constEnd(); ++it) {
channel_address_count_data_filename_list[QString::number(it.key())] = ProjectRelativeFilename(it.value());
}
project_json_obj_map["ChannelAddressCountDataFilenameList"] = channel_address_count_data_filename_list;
QVariantMap channel_energy_count_data_filename_list;
for (auto it = this->_channel_energy_count_data_filename_list.constBegin(); it != this->_channel_energy_count_data_filename_list.constEnd(); ++it) {
channel_energy_count_data_filename_list[QString::number(it.key())] = ProjectRelativeFilename(it.value());
}
project_json_obj_map["ChannelEnergyCountDataFilenameList"] = channel_energy_count_data_filename_list;
project_json_obj_map["AllChannelEnergyTotalCountDataFilename"] = ProjectRelativeFilename(this->_all_channel_energy_total_count_data_filename);
QVariantMap time_win_conform_particle_data;
for (auto it1 = this->_time_win_conform_particle_data.constBegin(); it1 != this->_time_win_conform_particle_data.constEnd(); ++it1) {
for (auto it = this->_time_win_conform_particle_data.constBegin(); it != this->_time_win_conform_particle_data.constEnd(); ++it) {
QVariantMap conform_particle_data;
for (auto it2 = it1.value().constBegin(); it2 != it1.value().constEnd(); ++it2) {
for (auto it2 = it.value().constBegin(); it2 != it.value().constEnd(); ++it2) {
conform_particle_data[QString::number(it2.key())] = ProjectRelativeFilename(it2.value());
}
time_win_conform_particle_data[QString::number(it1.key())] = conform_particle_data;
time_win_conform_particle_data[QString::number(it.key())] = conform_particle_data;
}
project_json_obj_map["ParticleEnergyDataFilename"] = ProjectRelativeFilename(this->_particle_energy_data_filename);
project_json_obj_map["TimeWinConformParticleData"] = time_win_conform_particle_data;
QVariantMap time_win_conform_energy_data;
for (auto it1 = this->_time_win_conform_energy_data.constBegin(); it1 != this->_time_win_conform_energy_data.constEnd(); ++it1) {
QVariantMap conform_energy_data;
for (auto it2 = it1.value().constBegin(); it2 != it1.value().constEnd(); ++it2) {
conform_energy_data[QString::number(it2.key())] = ProjectRelativeFilename(it2.value());
}
time_win_conform_energy_data[QString::number(it1.key())] = conform_energy_data;
}
project_json_obj_map["TimeWinConformEnergyData"] = time_win_conform_energy_data;
// 将项目模型保存到json文件
QJsonDocument json_doc = QJsonDocument::fromVariant(project_json_obj_map);
QFile json_file(this->_project_filename);
@ -694,14 +661,9 @@ void MeasureAnalysisProjectModelList::ApplyEnergyScale(const QString &project_na
auto apply_erergy_scale_fit_task = new DataProcessWorkPool::EnergyScaleParticleDataTask;
apply_erergy_scale_fit_task->SetFinishedNotifier(this, "onEnergyScaleParticleDataFinished", project_name);
apply_erergy_scale_fit_task->StartTask();
auto energy_count_process_task = new DataProcessWorkPool::EnergyCountProcessTask;
energy_count_process_task->SetFinishedNotifier(this, "onEnergyCountProcessFinished", project_name);
energy_count_process_task->StartTask();
auto coincidence_process_task = new DataProcessWorkPool::EnergyScaleCoincidenceDataTask;
coincidence_process_task->SetFinishedNotifier(this, "onEnergyScaleCoincidenceDataFinished", project_name);
coincidence_process_task->StartTask();
}
}
}
@ -758,11 +720,6 @@ void MeasureAnalysisProjectModelList::onEnergyScaleParticleDataFinished(bool ok,
if (!particle_energy_data_filename.isEmpty()) {
status_ok = true;
status = QStringLiteral(u"有效");
const QString& particle_energy_item_name = QStringLiteral(u"粒子能量数据");
if (node_map.contains(particle_energy_item_name)) {
auto energy_total_count_spec_item = node_map[particle_energy_item_name];
this->SetNodeStatus(energy_total_count_spec_item, status, status_ok);
}
const QString& count_rate_analysis_item_name = QStringLiteral(u"计数率分析");
if (node_map.contains(count_rate_analysis_item_name)) {
auto energy_total_count_spec_item = node_map[count_rate_analysis_item_name];
@ -836,17 +793,6 @@ void MeasureAnalysisProjectModelList::onEnergyCountProcessFinished(bool ok, cons
}
void MeasureAnalysisProjectModelList::onCoincidenceProcessFinished(bool ok, const QString &project_name, const QVariant &data)
{
Q_UNUSED(data);
if ( !ok )
return;
if (this->_project_models.contains(project_name)) {
auto pro_model = this->_project_models[project_name];
pro_model->SaveProjectModel();
}
}
void MeasureAnalysisProjectModelList::onEnergyScaleCoincidenceDataFinished(bool ok, const QString &project_name, const QVariant &data)
{
Q_UNUSED(data);
if ( !ok )
@ -856,57 +802,35 @@ void MeasureAnalysisProjectModelList::onEnergyScaleCoincidenceDataFinished(bool
auto& node_map = this->_project_node_items[project_name];
bool status_ok = false;
QString status = QStringLiteral(u"无效");
auto time_win_file_name_set = pro_model->GetConformParticleEnergyDataFilenameList();
if (!time_win_file_name_set.isEmpty()) {
uint conform_time_win = pro_model->GetConformTimeWin();
const auto& Conform_energy_data_filename_list = pro_model->GetTimeWinConformEnergyDataFilenameList(conform_time_win);
if (!Conform_energy_data_filename_list.isEmpty()) {
status_ok = true;
status = QStringLiteral(u"有效");
QString item_name = QStringLiteral(u"符合粒子能量数据");
QStandardItem* conform_energy_data_item = nullptr;
QString item_name = QStringLiteral(u"符合事件时间分析");
if (node_map.contains(item_name)) {
conform_energy_data_item = node_map[item_name];
this->SetNodeStatus(conform_energy_data_item, status, status_ok);
auto energy_total_count_item = node_map[item_name];
this->SetNodeStatus(energy_total_count_item, status, status_ok);
}
for (int conform_time_win : time_win_file_name_set.keys()) {
const auto& conform_energy_data_filename_list = pro_model->GetTimeWinConformEnergyDataFilenameList(conform_time_win);
for (auto it = conform_energy_data_filename_list.constBegin(); it!=conform_energy_data_filename_list.constEnd(); ++it) {
int order = it.key();
if (conform_energy_data_item) {
QString item_name = QStringLiteral(u"%1个粒子符合[%2ns]").arg(order).arg(conform_time_win);
if ( !node_map.contains(item_name) ) {
const QVariant& analys_type = QVariant::fromValue(AnalysisType::CoincidenceParticleEnergyData);
QStandardItem* node_item = AddChildNode(conform_energy_data_item, item_name, status, analys_type, true, status_ok);
node_item->setData(project_name, ProjectName);
QVariantList conform_info { conform_time_win, order };
node_item->setData(conform_info, ConformInfo);
node_map[item_name] = node_item;
} else {
auto ch_energy_count_item = node_map[item_name];
this->SetNodeStatus(ch_energy_count_item, status, status_ok);
}
}
if (!conform_energy_data_filename_list.isEmpty()) {
item_name = QStringLiteral(u"符合能谱[%1ns]").arg(conform_time_win);
if (node_map.contains(item_name)) {
auto energy_total_count_spec_item = node_map[item_name];
this->SetNodeStatus(energy_total_count_spec_item, status, status_ok);
}
item_name = QStringLiteral(u"反符合能谱[%1ns]").arg(conform_time_win);
if (node_map.contains(item_name)) {
auto energy_total_count_spec_item = node_map[item_name];
this->SetNodeStatus(energy_total_count_spec_item, status, status_ok);
}
item_name = QStringLiteral(u"二维符合能谱[%1ns]").arg(conform_time_win);
if (node_map.contains(item_name)) {
auto energy_total_count_spec_item = node_map[item_name];
this->SetNodeStatus(energy_total_count_spec_item, status, status_ok);
}
item_name = QStringLiteral(u"三维符合能谱[%1ns]").arg(conform_time_win);
if (node_map.contains(item_name)) {
auto energy_total_count_spec_item = node_map[item_name];
this->SetNodeStatus(energy_total_count_spec_item, status, status_ok);
}
}
}
item_name = QStringLiteral(u"符合能谱[%1ns]").arg(conform_time_win);
if (node_map.contains(item_name)) {
auto energy_total_count_spec_item = node_map[item_name];
this->SetNodeStatus(energy_total_count_spec_item, status, status_ok);
}
item_name = QStringLiteral(u"反符合能谱[%1ns]").arg(conform_time_win);
if (node_map.contains(item_name)) {
auto energy_total_count_spec_item = node_map[item_name];
this->SetNodeStatus(energy_total_count_spec_item, status, status_ok);
}
item_name = QStringLiteral(u"二维符合能谱[%1ns]").arg(conform_time_win);
if (node_map.contains(item_name)) {
auto energy_total_count_spec_item = node_map[item_name];
this->SetNodeStatus(energy_total_count_spec_item, status, status_ok);
}
item_name = QStringLiteral(u"三维符合能谱[%1ns]").arg(conform_time_win);
if (node_map.contains(item_name)) {
auto energy_total_count_spec_item = node_map[item_name];
this->SetNodeStatus(energy_total_count_spec_item, status, status_ok);
}
}
pro_model->SaveProjectModel();
@ -931,57 +855,54 @@ void MeasureAnalysisProjectModelList::intiProjectNodeStruce(MeasureAnalysisProje
// 测量控制
QString item_name = QStringLiteral(u"测量控制");
analys_type = QVariant::fromValue(AnalysisType::None);
QStandardItem* measure_ctrl_item = AddChildNode(project_item, item_name, QString(), analys_type, true, true);
QStandardItem* measure_ctrl_item = AddChildNode(project_item, item_name, QString(), QVariant(), true, true);
measure_ctrl_item->setData(project_name, ProjectName);
node_map[item_name] = measure_ctrl_item;
const QString& measure_device_params_cfg_filename = pro_model->GetMeasureDeviceParamsCfgFilename();
bool status_ok = !measure_device_params_cfg_filename.isEmpty();
status = status_ok ? QStringLiteral(u"已配置") : QStringLiteral(u"未配置");
bool state_ok = !measure_device_params_cfg_filename.isEmpty();
status = state_ok ? QStringLiteral(u"已配置") : QStringLiteral(u"未配置");
analys_type = QVariant::fromValue(AnalysisType::DeviceParamsCfg);
item_name = QStringLiteral(u"设备配置参数");
QStandardItem* node_item = AddChildNode(measure_ctrl_item, item_name, status, analys_type, true, status_ok);
QStandardItem* node_item = AddChildNode(measure_ctrl_item, item_name, status, analys_type, true, state_ok);
node_item->setData(project_name, ProjectName);
node_map[item_name] = node_item;
status_ok = !pro_model->GetEnergyScaleFilename().isEmpty();
status = status_ok ? QStringLiteral(u"已配置") : QStringLiteral(u"未配置");
state_ok = !pro_model->GetEnergyScaleFilename().isEmpty();
status = state_ok ? QStringLiteral(u"已配置") : QStringLiteral(u"未配置");
analys_type = QVariant::fromValue(AnalysisType::EnergyScale);
item_name = QStringLiteral(u"能量刻度");
node_item = AddChildNode(measure_ctrl_item, item_name, status, analys_type, true, status_ok);
node_item = AddChildNode(measure_ctrl_item, item_name, status, analys_type, true, state_ok);
node_item->setData(project_name, ProjectName);
node_map[item_name] = node_item;
status_ok = !pro_model->GetEfficiencyScaleFilename().isEmpty();
status = status_ok ? QStringLiteral(u"已配置") : QStringLiteral(u"未配置");
state_ok = !pro_model->GetEfficiencyScaleFilename().isEmpty();
status = state_ok ? QStringLiteral(u"已配置") : QStringLiteral(u"未配置");
analys_type = QVariant::fromValue(AnalysisType::EfficiencyScale);
item_name = QStringLiteral(u"效率刻度");
node_item = AddChildNode(measure_ctrl_item, item_name, status, analys_type, true, status_ok);
node_item = AddChildNode(measure_ctrl_item, item_name, status, analys_type, true, state_ok);
node_item->setData(project_name, ProjectName);
node_map[item_name] = node_item;
// 分析数据
item_name = QStringLiteral(u"分析数据");
analys_type = QVariant::fromValue(AnalysisType::None);
QStandardItem* analysis_data_item = AddChildNode(project_item, item_name, QString(), analys_type, true, true);
QStandardItem* analysis_data_item = AddChildNode(project_item, item_name, QString(), QVariant(), true, true);
analysis_data_item->setData(project_name, ProjectName);
node_map[item_name] = node_item;
status_ok = !pro_model->GetAllChannelParticleDataFilename().isEmpty();
status = status_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效");
state_ok = !pro_model->GetAllChannelParticleDataFilename().isEmpty();
status = state_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效");
analys_type = QVariant::fromValue(AnalysisType::ParticleData);
item_name = QStringLiteral(u"测量粒子数据");
node_item = AddChildNode(analysis_data_item, item_name, status, analys_type, true, status_ok);
node_item = AddChildNode(analysis_data_item, item_name, status, analys_type, true, state_ok);
node_item->setData(project_name, ProjectName);
node_map[item_name] = node_item;
const auto& ch_addr_count_data_filename_list = pro_model->GetChannelAddressCountDataFilenameList();
status_ok = !ch_addr_count_data_filename_list.isEmpty();
status = status_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效");
state_ok = !ch_addr_count_data_filename_list.isEmpty();
status = state_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效");
item_name = QStringLiteral(u"道址计数");
analys_type = QVariant::fromValue(AnalysisType::None);
node_item = AddChildNode(analysis_data_item, item_name, status, analys_type, true, status_ok);
node_item = AddChildNode(analysis_data_item, item_name, status, QVariant(), true, state_ok);
node_item->setData(project_name, ProjectName);
node_map[item_name] = node_item;
QStandardItem* adrr_count_item = node_item;
@ -989,65 +910,48 @@ void MeasureAnalysisProjectModelList::intiProjectNodeStruce(MeasureAnalysisProje
uint ch_num = it.key();
QString item_name = QStringLiteral(u"通道%1道址计数").arg(ch_num);
const QVariant& analys_type = QVariant::fromValue(AnalysisType::AddressCountData);
QStandardItem* node_item = AddChildNode(adrr_count_item, item_name, status, analys_type, true, status_ok);
QStandardItem* node_item = AddChildNode(adrr_count_item, item_name, status, analys_type, true, state_ok);
node_item->setData(project_name, ProjectName);
node_item->setData(ch_num, ChannelNum);
node_map[item_name] = node_item;
}
status_ok = !pro_model->GetParticleEnergyDataFilename().isEmpty();
status = status_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效");
state_ok = !pro_model->GetParticleEnergyDataFilename().isEmpty();
status = state_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效");
analys_type = QVariant::fromValue(AnalysisType::ParticleEnergyData);
item_name = QStringLiteral(u"粒子能量数据");
node_item = AddChildNode(analysis_data_item, item_name, status, analys_type, true, status_ok);
node_item = AddChildNode(analysis_data_item, item_name, status, analys_type, true, state_ok);
node_item->setData(project_name, ProjectName);
node_map[item_name] = node_item;
status_ok = !pro_model->GetAllChannelEnergyTotalCountDataFilename().isEmpty();
status = status_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效");
state_ok = !pro_model->GetAllChannelEnergyTotalCountDataFilename().isEmpty();
status = state_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效");
item_name = QStringLiteral(u"能量计数");
analys_type = QVariant::fromValue(AnalysisType::EnergyCountData);
node_item = AddChildNode(analysis_data_item, item_name, status, analys_type, true, status_ok);
node_item = AddChildNode(analysis_data_item, item_name, status, analys_type, true, state_ok);
node_item->setData(project_name, ProjectName);
node_map[item_name] = node_item;
QStandardItem* energy_count_item = node_item;
const auto& ch_energy_count_data_filename_list = pro_model->GetChannelEnergyCountDataFilenameList();
status_ok = !ch_energy_count_data_filename_list.isEmpty();
state_ok = !ch_energy_count_data_filename_list.isEmpty();
for (auto it = ch_energy_count_data_filename_list.begin(); it != ch_energy_count_data_filename_list.end(); ++it) {
uint ch_num = it.key();
QString item_name = QStringLiteral(u"通道%1能量计数").arg(ch_num);
const QVariant& analys_type = QVariant::fromValue(AnalysisType::ChannelEnergyCountData);
QStandardItem* node_item = AddChildNode(energy_count_item, item_name, status, analys_type, true, status_ok);
QStandardItem* node_item = AddChildNode(energy_count_item, item_name, status, analys_type, true, state_ok);
node_item->setData(project_name, ProjectName);
node_item->setData(ch_num, ChannelNum);
node_map[item_name] = node_item;
}
uint conform_time_win = pro_model->GetConformTimeWin();
status_ok = !pro_model->GetTimeWinConformEnergyDataFilenameList(conform_time_win).isEmpty();
status = status_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效");
item_name = QStringLiteral(u"符合粒子能量数据");
analys_type = QVariant::fromValue(AnalysisType::None);
QStandardItem* conform_energy_data_group_item = AddChildNode(analysis_data_item, item_name, status, analys_type, true, status_ok);
conform_energy_data_group_item->setData(project_name, ProjectName);
node_map[item_name] = conform_energy_data_group_item;
auto time_win_file_name_set = pro_model->GetConformParticleEnergyDataFilenameList();
for (int conform_time_win : time_win_file_name_set.keys()) {
const auto& conform_energy_data_filename_list = pro_model->GetTimeWinConformEnergyDataFilenameList(conform_time_win);
for (auto it = conform_energy_data_filename_list.constBegin(); it!=conform_energy_data_filename_list.constEnd(); ++it) {
int order = it.key();
status_ok = !it.value().isEmpty();
status = status_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效");
QString item_name = QStringLiteral(u"%1个粒子符合[%2ns]").arg(order).arg(conform_time_win);
const QVariant& analys_type = QVariant::fromValue(AnalysisType::CoincidenceParticleEnergyData);
QStandardItem* node_item = AddChildNode(conform_energy_data_group_item, item_name, status, analys_type, true, status_ok);
node_item->setData(project_name, ProjectName);
QVariantList conform_info { conform_time_win, order };
node_item->setData(conform_info, ConformInfo);
node_map[item_name] = node_item;
}
}
state_ok = !pro_model->GetTimeWinConformParticleDataFilenameList(conform_time_win).isEmpty();
status = state_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效");
analys_type = QVariant::fromValue(AnalysisType::CoincidenceParticleEnergyData);
item_name = QStringLiteral(u"符合粒子数据[%1ns]").arg(conform_time_win);
node_item = AddChildNode(analysis_data_item, item_name, status, analys_type, true, state_ok);
node_item->setData(project_name, ProjectName);
node_map[item_name] = node_item;
// 交互分析
item_name = QStringLiteral(u"交互分析");
@ -1055,98 +959,98 @@ void MeasureAnalysisProjectModelList::intiProjectNodeStruce(MeasureAnalysisProje
interactive_analysis_item->setData(project_name, ProjectName);
node_map[item_name] = interactive_analysis_item;
status_ok = !pro_model->GetChannelAddressCountDataFilenameList().isEmpty();
status = status_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效");
state_ok = !pro_model->GetChannelAddressCountDataFilenameList().isEmpty();
status = state_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效");
analys_type = QVariant::fromValue(AnalysisType::AddressCountSpectrumView);
item_name = QStringLiteral(u"道址计数谱");
node_item = AddChildNode(interactive_analysis_item, item_name, status, analys_type, true, status_ok);
node_item = AddChildNode(interactive_analysis_item, item_name, status, analys_type, true, state_ok);
node_item->setData(project_name, ProjectName);
node_map[item_name] = node_item;
status_ok = !pro_model->GetAllChannelEnergyTotalCountDataFilename().isEmpty();
status_ok &= !pro_model->GetChannelEnergyCountDataFilenameList().isEmpty();
status = status_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效");
state_ok = !pro_model->GetAllChannelEnergyTotalCountDataFilename().isEmpty();
state_ok &= !pro_model->GetChannelEnergyCountDataFilenameList().isEmpty();
status = state_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效");
analys_type = QVariant::fromValue(AnalysisType::EnergyCountSpectrumView);
item_name = QStringLiteral(u"能量计数谱");
node_item = AddChildNode(interactive_analysis_item, item_name, status, analys_type, true, status_ok);
node_item = AddChildNode(interactive_analysis_item, item_name, status, analys_type, true, state_ok);
node_item->setData(project_name, ProjectName);
node_map[item_name] = node_item;
status_ok = !pro_model->GetParticleEnergyDataFilename().isEmpty();
status = status_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效");
state_ok = !pro_model->GetParticleEnergyDataFilename().isEmpty();
status = state_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效");
analys_type = QVariant::fromValue(AnalysisType::CountingRateView);
item_name = QStringLiteral(u"计数率分析");
node_item = AddChildNode(interactive_analysis_item, item_name, status, analys_type, true, status_ok);
node_item = AddChildNode(interactive_analysis_item, item_name, status, analys_type, true, state_ok);
node_item->setData(project_name, ProjectName);
node_map[item_name] = node_item;
status_ok = !pro_model->GetParticleEnergyDataFilename().isEmpty();
status = status_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效");
state_ok = !pro_model->GetParticleEnergyDataFilename().isEmpty();
status = state_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效");
analys_type = QVariant::fromValue(AnalysisType::EnergyPeakFitView);
item_name = QStringLiteral(u"峰拟合分析");
node_item = AddChildNode(interactive_analysis_item, item_name, status, analys_type, true, status_ok);
node_item = AddChildNode(interactive_analysis_item, item_name, status, analys_type, true, state_ok);
node_item->setData(project_name, ProjectName);
node_map[item_name] = node_item;
status_ok = !pro_model->GetParticleEnergyDataFilename().isEmpty();
status = status_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效");
state_ok = !pro_model->GetParticleEnergyDataFilename().isEmpty();
status = state_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效");
analys_type = QVariant::fromValue(AnalysisType::NuclideAnalysisView);
item_name = QStringLiteral(u"核素分析");
node_item = AddChildNode(interactive_analysis_item, item_name, status, analys_type, true, status_ok);
node_item = AddChildNode(interactive_analysis_item, item_name, status, analys_type, true, state_ok);
node_item->setData(project_name, ProjectName);
node_map[item_name] = node_item;
status_ok = !pro_model->GetParticleEnergyDataFilename().isEmpty();
status = status_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效");
state_ok = !pro_model->GetParticleEnergyDataFilename().isEmpty();
status = state_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效");
analys_type = QVariant::fromValue(AnalysisType::ParticleInTimeView);
item_name = QStringLiteral(u"粒子入射时间分析");
node_item = AddChildNode(interactive_analysis_item, item_name, status, analys_type, true, status_ok);
node_item = AddChildNode(interactive_analysis_item, item_name, status, analys_type, true, state_ok);
node_item->setData(project_name, ProjectName);
node_map[item_name] = node_item;
status_ok = !pro_model->GetAllChannelParticleDataFilename().isEmpty();
status = status_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效");
state_ok = !pro_model->GetAllChannelParticleDataFilename().isEmpty();
status = state_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效");
analys_type = QVariant::fromValue(AnalysisType::ParticleTimeDiffView);
item_name = QStringLiteral(u"粒子时间差分析");
node_item = AddChildNode(interactive_analysis_item, item_name, status, analys_type, true, status_ok);
node_item = AddChildNode(interactive_analysis_item, item_name, status, analys_type, true, state_ok);
node_item->setData(project_name, ProjectName);
node_map[item_name] = node_item;
status_ok = !pro_model->GetTimeWinConformEnergyDataFilenameList(conform_time_win).isEmpty();
status = status_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效");
state_ok = !pro_model->GetTimeWinConformEnergyDataFilenameList(conform_time_win).isEmpty();
status = state_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效");
analys_type = QVariant::fromValue(AnalysisType::CoincidenceEventTimeView);
item_name = QStringLiteral(u"符合事件时间分析");
node_item = AddChildNode(interactive_analysis_item, item_name, status, analys_type, true, status_ok);
node_item = AddChildNode(interactive_analysis_item, item_name, status, analys_type, true, state_ok);
node_item->setData(project_name, ProjectName);
node_map[item_name] = node_item;
status_ok = !pro_model->GetTimeWinConformEnergyDataFilenameList(conform_time_win).isEmpty();
status = status_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效");
state_ok = !pro_model->GetTimeWinConformEnergyDataFilenameList(conform_time_win).isEmpty();
status = state_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效");
analys_type = QVariant::fromValue(AnalysisType::CoincidenceParticleEnergySpectrumView);
item_name = QStringLiteral(u"符合能谱[%1ns]").arg(conform_time_win);
node_item = AddChildNode(interactive_analysis_item, item_name, status, analys_type, true, status_ok);
node_item = AddChildNode(interactive_analysis_item, item_name, status, analys_type, true, state_ok);
node_item->setData(project_name, ProjectName);
node_map[item_name] = node_item;
analys_type = QVariant::fromValue(AnalysisType::AntiCoincidenceSpectrumView);
item_name = QStringLiteral(u"反符合能谱[%1ns]").arg(conform_time_win);
node_item = AddChildNode(interactive_analysis_item, item_name, status, analys_type, true, status_ok);
node_item = AddChildNode(interactive_analysis_item, item_name, status, analys_type, true, state_ok);
node_item->setData(project_name, ProjectName);
node_map[item_name] = node_item;
status_ok = !pro_model->GetTimeWinConformEnergyDataFilenameList(conform_time_win).isEmpty();
status = status_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效");
state_ok = !pro_model->GetTimeWinConformEnergyDataFilenameList(conform_time_win).isEmpty();
status = state_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效");
analys_type = QVariant::fromValue(AnalysisType::CoincidenceParticleEnergySpectrum2DView);
item_name = QStringLiteral(u"二维符合能谱[%1ns]").arg(conform_time_win);
node_item = AddChildNode(interactive_analysis_item, item_name, status, analys_type, true, status_ok);
node_item = AddChildNode(interactive_analysis_item, item_name, status, analys_type, true, state_ok);
node_item->setData(project_name, ProjectName);
node_map[item_name] = node_item;
status_ok = !pro_model->GetTimeWinConformEnergyDataFilenameList(conform_time_win).isEmpty();
status = status_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效");
state_ok = !pro_model->GetTimeWinConformEnergyDataFilenameList(conform_time_win).isEmpty();
status = state_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效");
analys_type = QVariant::fromValue(AnalysisType::CoincidenceParticleEnergySpectrum3DView);
item_name = QStringLiteral(u"三维符合能谱[%1ns]").arg(conform_time_win);
node_item = AddChildNode(interactive_analysis_item, item_name, status, analys_type, true, status_ok);
node_item = AddChildNode(interactive_analysis_item, item_name, status, analys_type, true, state_ok);
node_item->setData(project_name, ProjectName);
node_map[item_name] = node_item;

View File

@ -33,7 +33,9 @@ public:
void SetEnergyScaleFilename(const QString& filename);
void SetEfficiencyScaleFilename(const QString& filename);
void SetAllChannelParticleDataFilename(const QString& filename);
// void SetChannelParticleDataFilename(uint channel, const QString& filename);
void SetChannelAddressCountDataFilename(uint channel, const QString& filename);
// void SetAllChannelParticleTotalCountDataFilename(const QString& filename);
void SetChannelEnergyCountDataFilename(uint channel, const QString& filename);
void SetAllChannelEnergyTotalCountDataFilename(const QString& filename);
void SetParticleEnergyDataFilename(const QString& filename);
@ -53,15 +55,16 @@ public:
const QString& GetEnergyScaleFilename() const;
const QString& GetEfficiencyScaleFilename() const;
const QString& GetAllChannelParticleDataFilename() const;
// const QMap<uint, QString>& GetChannelParticleDataFilenameList() const;
// const QString& GetChannelParticleDataFilename(uint channel) const;
const QMap<uint, QString>& GetChannelAddressCountDataFilenameList() const;
const QString GetChannelAddressCountDataFilename(uint channel) const;
// const QString& GetAllChannelParticleTotalCountDataFilename() const;
const QMap<uint, QString>& GetChannelEnergyCountDataFilenameList() const;
const QString GetChannelEnergyCountDataFilename(uint channel) const;
const QString& GetAllChannelEnergyTotalCountDataFilename() const;
const QString GetParticleEnergyDataFilename() const;
const QMap<uint, QMap<uint, QString> > GetConformParticleDataFilenameList() const;
const QMap<uint, QString> GetTimeWinConformParticleDataFilenameList(uint time_win) const;
const QMap<uint, QMap<uint, QString> > GetConformParticleEnergyDataFilenameList() const;
const QMap<uint, QString> GetTimeWinConformEnergyDataFilenameList(uint time_win) const;
const QString GetAnalysisCustomData(AnalysisType analysis_type, const QString& data_item_name);
@ -107,8 +110,7 @@ public:
NodeType = Qt::UserRole,
Fixed = Qt::UserRole + 1,
ProjectName = Qt::UserRole + 2,
ChannelNum = Qt::UserRole + 3,
ConformInfo = Qt::UserRole + 4
ChannelNum = Qt::UserRole + 3
};
public:
@ -144,7 +146,6 @@ private slots:
void onEnergyScaleParticleDataFinished(bool ok, const QString& project_name, const QVariant& data);
void onEnergyCountProcessFinished(bool ok, const QString& project_name, const QVariant& data);
void onCoincidenceProcessFinished(bool ok, const QString& project_name, const QVariant& data);
void onEnergyScaleCoincidenceDataFinished(bool ok, const QString& project_name, const QVariant& data);
private:
void intiProjectNodeStruce(MeasureAnalysisProjectModel *pro_model);

View File

@ -6,9 +6,6 @@
MeasureAnalysisTreeView::MeasureAnalysisTreeView(QWidget* parent)
: QTreeView(parent)
{
this->setFrameShape(QFrame::NoFrame);
this->setLineWidth(0);
_model = ProjectList::Instance();
this->setModel(_model);
@ -137,24 +134,6 @@ void MeasureAnalysisTreeView::onNodeDoubleClicked(const QModelIndex& index)
}
}
} break;
case AnalysisType::CoincidenceParticleEnergyData: {
QVariant conform_info_v = _model->GetNodeUserData(item, ProjectList::ConformInfo);
if (conform_info_v.isValid()) {
auto conform_info = conform_info_v.toList();
if (conform_info.size() == 2) {
int conform_time_win = conform_info.at(0).toInt();
int order = conform_info.at(1).toInt();
MeasureAnalysisProjectModel* project_model = _model->GetProjectModel(project_name);
if (project_model) {
auto file_name_list = project_model->GetTimeWinConformEnergyDataFilenameList(conform_time_win);
if ( file_name_list.contains(order) ) {
const QString& data_name = QStringLiteral(u"%1个粒子符合能量数据[%2ns]").arg(conform_time_win).arg(order);;
data_files_set[data_name] = QString(file_name_list[order]);
}
}
}
}
} break;
case AnalysisType::AddressCountSpectrumView: {
MeasureAnalysisProjectModel* project_model = _model->GetProjectModel(project_name);
if (project_model) {

View File

@ -71,7 +71,7 @@ SOURCES += \
VirtualTable/SampleDataSource.cpp \
VirtualTable/VirtualTableModel.cpp \
VirtualTable/VirtualTableView.cpp \
ParticleTimePoorView/ParticleTimePoorView.cpp \
ParticleTimePoorView/ParticleTimePoorView.cpp\
main.cpp
HEADERS += \