符合数据处理

This commit is contained in:
徐海 2026-03-26 14:48:12 +08:00
parent 1c80d3fcfe
commit 3a09022a29
6 changed files with 184 additions and 110 deletions

View File

@ -466,6 +466,7 @@ bool CoincidenceEventAnalysisTask::processTask()
if (particle_data_filename.isEmpty()) { if (particle_data_filename.isEmpty()) {
return false; return false;
} }
std::string event_id_str = QString(QStringLiteral(u"事件ID")).toStdString();
std::string board_id_str = QString(QStringLiteral(u"板卡号")).toStdString(); std::string board_id_str = QString(QStringLiteral(u"板卡号")).toStdString();
std::string channel_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 addr_str = QString(QStringLiteral(u"道址")).toStdString();
@ -502,12 +503,14 @@ bool CoincidenceEventAnalysisTask::processTask()
const QString& event_data_filename = QDir(coincidence_data_dir_path).filePath(QStringLiteral(u"[%1ns]%2个粒子符合事件[未刻度].csv").arg(project_model->GetConformTimeWin()).arg(event.coincidence_order)); 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) ) { if ( !coincidence_data_out_stream_map.contains(event.coincidence_order) ) {
std::shared_ptr<std::ofstream> out_stream(new std::ofstream(QStrToSysPath(event_data_filename))); std::shared_ptr<std::ofstream> out_stream(new std::ofstream(QStrToSysPath(event_data_filename)));
*out_stream << board_id_str << "," << channel_id_str << "," << addr_str << "," << time_str << std::endl; *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; 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]; std::shared_ptr<std::ofstream> out_stream = coincidence_data_out_stream_map[event.coincidence_order];
for (const SpectrumData& data_item : event.events) { for (const SpectrumData& data_item : event.events) {
*out_stream << data_item.board_id << "," << data_item.channel_id << "," << data_item.energy << "," << data_item.timestamp << std::endl; ++ 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); project_model->SetTimeWinConformParticleData(project_model->GetConformTimeWin(), event.coincidence_order, event_data_filename);
} }
@ -866,6 +869,7 @@ bool EnergyScaleCoincidenceDataTask::processTask()
project_dir.mkpath(coincidence_data_dir_name); project_dir.mkpath(coincidence_data_dir_name);
const QString& coincidence_data_dir_path = project_dir.filePath(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 board_id_str = QString(QStringLiteral(u"板卡号")).toStdString();
std::string channel_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 addr_str = QString(QStringLiteral(u"道址")).toStdString();
@ -875,22 +879,24 @@ bool EnergyScaleCoincidenceDataTask::processTask()
auto conformParticleDataEnergyScale = [&](int time_win, int coincidence_order, const QString& conform_particle_data_filename) -> bool { auto conformParticleDataEnergyScale = [&](int time_win, int coincidence_order, const QString& conform_particle_data_filename) -> bool {
try { try {
io::CSVReader< io::CSVReader<
4, 5,
io::trim_chars<' ', '\t'>, io::trim_chars<' ', '\t'>,
io::double_quote_escape<',', '"'>, io::double_quote_escape<',', '"'>,
io::throw_on_overflow, io::throw_on_overflow,
io::empty_line_comment> io::empty_line_comment>
reader(QStrToSysPath(conform_particle_data_filename)); reader(QStrToSysPath(conform_particle_data_filename));
reader.read_header(io::ignore_extra_column, board_id_str, channel_id_str, addr_str, time_str); 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& 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); const QString& coincidence_energy_data_filename = QDir(coincidence_data_dir_path).filePath(data_name);
std::ofstream out_stream(QStrToSysPath(coincidence_energy_data_filename)); std::ofstream out_stream(QStrToSysPath(coincidence_energy_data_filename));
out_stream << board_id_str << "," << channel_id_str << "," << energy_str << "," << time_str << "\n" ; out_stream << event_id_str << "," << board_id_str << "," << channel_id_str << "," << energy_str << "," << time_str << "\n" ;
using namespace CoincidenceSpectrum::F2t9Order; using namespace CoincidenceSpectrum::F2t9Order;
unsigned long long event_id;
SpectrumData data_item; SpectrumData data_item;
while (reader.read_row( while (reader.read_row(
event_id,
data_item.board_id, data_item.board_id,
data_item.channel_id, data_item.channel_id,
data_item.energy, data_item.energy,
@ -900,12 +906,12 @@ bool EnergyScaleCoincidenceDataTask::processTask()
auto coeffs = energy_scale_data_model.GetEnergyFitResultCoeffs(channel_name); auto coeffs = energy_scale_data_model.GetEnergyFitResultCoeffs(channel_name);
if (!coeffs.empty()) { if (!coeffs.empty()) {
data_item.energy = GaussPolyCoe::Predict(coeffs, data_item.energy); data_item.energy = GaussPolyCoe::Predict(coeffs, data_item.energy);
out_stream << data_item.board_id << "," << data_item.channel_id << "," << data_item.energy << "," << data_item.timestamp << "\n" ; out_stream << event_id << "," << data_item.board_id << "," << data_item.channel_id << "," << data_item.energy << "," << data_item.timestamp << "\n" ;
} else { } else {
LOG_WARN(QStringLiteral(u"符合能谱数据处理异常:%1能量刻度拟合参数为空!").arg(channel_name)); LOG_WARN(QStringLiteral(u"符合能谱数据处理异常:%1能量刻度拟合参数为空!").arg(channel_name));
out_stream.close(); // out_stream.close();
QFile::remove(coincidence_energy_data_filename); // QFile::remove(coincidence_energy_data_filename);
return false; // return false;
} }
} }
out_stream.close(); out_stream.close();

View File

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

View File

@ -140,6 +140,8 @@ void MainWindow::initMainWindow()
// 构建日志输出视图 // 构建日志输出视图
_plain_edit_info_output = new QPlainTextEdit; _plain_edit_info_output = new QPlainTextEdit;
_plain_edit_info_output->setReadOnly(true); _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"信息输出")); ads::CDockWidget* dockw_info_output = new ads::CDockWidget(QStringLiteral(u"信息输出"));
dockw_info_output->setWidget(_plain_edit_info_output); dockw_info_output->setWidget(_plain_edit_info_output);
dockw_info_output->setMinimumSizeHintMode(ads::CDockWidget::MinimumSizeHintFromContentMinimumSize); dockw_info_output->setMinimumSizeHintMode(ads::CDockWidget::MinimumSizeHintFromContentMinimumSize);

View File

@ -245,6 +245,11 @@ const QMap<uint, QString> MeasureAnalysisProjectModel::GetTimeWinConformParticle
return conform_particle_data; 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 const QMap<uint, QString> MeasureAnalysisProjectModel::GetTimeWinConformEnergyDataFilenameList(uint time_win) const
{ {
QMap<uint, QString> conform_energy_data; QMap<uint, QString> conform_energy_data;
@ -851,21 +856,35 @@ void MeasureAnalysisProjectModelList::onEnergyScaleCoincidenceDataFinished(bool
auto& node_map = this->_project_node_items[project_name]; auto& node_map = this->_project_node_items[project_name];
bool status_ok = false; bool status_ok = false;
QString status = QStringLiteral(u"无效"); QString status = QStringLiteral(u"无效");
uint conform_time_win = pro_model->GetConformTimeWin(); auto time_win_file_name_set = pro_model->GetConformParticleEnergyDataFilenameList();
const auto& Conform_energy_data_filename_list = pro_model->GetTimeWinConformEnergyDataFilenameList(conform_time_win); if (!time_win_file_name_set.isEmpty()) {
if (!Conform_energy_data_filename_list.isEmpty()) {
status_ok = true; status_ok = true;
status = QStringLiteral(u"有效"); status = QStringLiteral(u"有效");
QString item_name = QStringLiteral(u"符合粒子能量数据[%1ns]").arg(conform_time_win); QString item_name = QStringLiteral(u"符合粒子能量数据");
QStandardItem* conform_energy_data_item = nullptr;
if (node_map.contains(item_name)) { if (node_map.contains(item_name)) {
auto energy_total_count_spec_item = node_map[item_name]; conform_energy_data_item = node_map[item_name];
this->SetNodeStatus(energy_total_count_spec_item, status, status_ok); this->SetNodeStatus(conform_energy_data_item, status, status_ok);
} }
item_name = QStringLiteral(u"符合事件时间分析"); for (int conform_time_win : time_win_file_name_set.keys()) {
if (node_map.contains(item_name)) { const auto& conform_energy_data_filename_list = pro_model->GetTimeWinConformEnergyDataFilenameList(conform_time_win);
auto energy_total_count_item = node_map[item_name]; for (auto it = conform_energy_data_filename_list.constBegin(); it!=conform_energy_data_filename_list.constEnd(); ++it) {
this->SetNodeStatus(energy_total_count_item, status, status_ok); 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); item_name = QStringLiteral(u"符合能谱[%1ns]").arg(conform_time_win);
if (node_map.contains(item_name)) { if (node_map.contains(item_name)) {
auto energy_total_count_spec_item = node_map[item_name]; auto energy_total_count_spec_item = node_map[item_name];
@ -887,6 +906,9 @@ void MeasureAnalysisProjectModelList::onEnergyScaleCoincidenceDataFinished(bool
this->SetNodeStatus(energy_total_count_spec_item, status, status_ok); this->SetNodeStatus(energy_total_count_spec_item, status, status_ok);
} }
} }
}
}
}
pro_model->SaveProjectModel(); pro_model->SaveProjectModel();
} }
} }
@ -909,54 +931,57 @@ void MeasureAnalysisProjectModelList::intiProjectNodeStruce(MeasureAnalysisProje
// 测量控制 // 测量控制
QString item_name = QStringLiteral(u"测量控制"); QString item_name = QStringLiteral(u"测量控制");
QStandardItem* measure_ctrl_item = AddChildNode(project_item, item_name, QString(), QVariant(), true, true); analys_type = QVariant::fromValue(AnalysisType::None);
QStandardItem* measure_ctrl_item = AddChildNode(project_item, item_name, QString(), analys_type, true, true);
measure_ctrl_item->setData(project_name, ProjectName); measure_ctrl_item->setData(project_name, ProjectName);
node_map[item_name] = measure_ctrl_item; node_map[item_name] = measure_ctrl_item;
const QString& measure_device_params_cfg_filename = pro_model->GetMeasureDeviceParamsCfgFilename(); const QString& measure_device_params_cfg_filename = pro_model->GetMeasureDeviceParamsCfgFilename();
bool state_ok = !measure_device_params_cfg_filename.isEmpty(); bool status_ok = !measure_device_params_cfg_filename.isEmpty();
status = state_ok ? QStringLiteral(u"已配置") : QStringLiteral(u"未配置"); status = status_ok ? QStringLiteral(u"已配置") : QStringLiteral(u"未配置");
analys_type = QVariant::fromValue(AnalysisType::DeviceParamsCfg); analys_type = QVariant::fromValue(AnalysisType::DeviceParamsCfg);
item_name = QStringLiteral(u"设备配置参数"); item_name = QStringLiteral(u"设备配置参数");
QStandardItem* node_item = AddChildNode(measure_ctrl_item, item_name, status, analys_type, true, state_ok); QStandardItem* node_item = AddChildNode(measure_ctrl_item, item_name, status, analys_type, true, status_ok);
node_item->setData(project_name, ProjectName); node_item->setData(project_name, ProjectName);
node_map[item_name] = node_item; node_map[item_name] = node_item;
state_ok = !pro_model->GetEnergyScaleFilename().isEmpty(); status_ok = !pro_model->GetEnergyScaleFilename().isEmpty();
status = state_ok ? QStringLiteral(u"已配置") : QStringLiteral(u"未配置"); status = status_ok ? QStringLiteral(u"已配置") : QStringLiteral(u"未配置");
analys_type = QVariant::fromValue(AnalysisType::EnergyScale); analys_type = QVariant::fromValue(AnalysisType::EnergyScale);
item_name = QStringLiteral(u"能量刻度"); item_name = QStringLiteral(u"能量刻度");
node_item = AddChildNode(measure_ctrl_item, item_name, status, analys_type, true, state_ok); node_item = AddChildNode(measure_ctrl_item, item_name, status, analys_type, true, status_ok);
node_item->setData(project_name, ProjectName); node_item->setData(project_name, ProjectName);
node_map[item_name] = node_item; node_map[item_name] = node_item;
state_ok = !pro_model->GetEfficiencyScaleFilename().isEmpty(); status_ok = !pro_model->GetEfficiencyScaleFilename().isEmpty();
status = state_ok ? QStringLiteral(u"已配置") : QStringLiteral(u"未配置"); status = status_ok ? QStringLiteral(u"已配置") : QStringLiteral(u"未配置");
analys_type = QVariant::fromValue(AnalysisType::EfficiencyScale); analys_type = QVariant::fromValue(AnalysisType::EfficiencyScale);
item_name = QStringLiteral(u"效率刻度"); item_name = QStringLiteral(u"效率刻度");
node_item = AddChildNode(measure_ctrl_item, item_name, status, analys_type, true, state_ok); node_item = AddChildNode(measure_ctrl_item, item_name, status, analys_type, true, status_ok);
node_item->setData(project_name, ProjectName); node_item->setData(project_name, ProjectName);
node_map[item_name] = node_item; node_map[item_name] = node_item;
// 分析数据 // 分析数据
item_name = QStringLiteral(u"分析数据"); item_name = QStringLiteral(u"分析数据");
QStandardItem* analysis_data_item = AddChildNode(project_item, item_name, QString(), QVariant(), true, true); analys_type = QVariant::fromValue(AnalysisType::None);
QStandardItem* analysis_data_item = AddChildNode(project_item, item_name, QString(), analys_type, true, true);
analysis_data_item->setData(project_name, ProjectName); analysis_data_item->setData(project_name, ProjectName);
node_map[item_name] = node_item; node_map[item_name] = node_item;
state_ok = !pro_model->GetAllChannelParticleDataFilename().isEmpty(); status_ok = !pro_model->GetAllChannelParticleDataFilename().isEmpty();
status = state_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效"); status = status_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效");
analys_type = QVariant::fromValue(AnalysisType::ParticleData); analys_type = QVariant::fromValue(AnalysisType::ParticleData);
item_name = QStringLiteral(u"测量粒子数据"); item_name = QStringLiteral(u"测量粒子数据");
node_item = AddChildNode(analysis_data_item, item_name, status, analys_type, true, state_ok); node_item = AddChildNode(analysis_data_item, item_name, status, analys_type, true, status_ok);
node_item->setData(project_name, ProjectName); node_item->setData(project_name, ProjectName);
node_map[item_name] = node_item; node_map[item_name] = node_item;
const auto& ch_addr_count_data_filename_list = pro_model->GetChannelAddressCountDataFilenameList(); const auto& ch_addr_count_data_filename_list = pro_model->GetChannelAddressCountDataFilenameList();
state_ok = !ch_addr_count_data_filename_list.isEmpty(); status_ok = !ch_addr_count_data_filename_list.isEmpty();
status = state_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效"); status = status_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效");
item_name = QStringLiteral(u"道址计数"); item_name = QStringLiteral(u"道址计数");
node_item = AddChildNode(analysis_data_item, item_name, status, QVariant(), true, state_ok); analys_type = QVariant::fromValue(AnalysisType::None);
node_item = AddChildNode(analysis_data_item, item_name, status, analys_type, true, status_ok);
node_item->setData(project_name, ProjectName); node_item->setData(project_name, ProjectName);
node_map[item_name] = node_item; node_map[item_name] = node_item;
QStandardItem* adrr_count_item = node_item; QStandardItem* adrr_count_item = node_item;
@ -964,48 +989,65 @@ void MeasureAnalysisProjectModelList::intiProjectNodeStruce(MeasureAnalysisProje
uint ch_num = it.key(); uint ch_num = it.key();
QString item_name = QStringLiteral(u"通道%1道址计数").arg(ch_num); QString item_name = QStringLiteral(u"通道%1道址计数").arg(ch_num);
const QVariant& analys_type = QVariant::fromValue(AnalysisType::AddressCountData); const QVariant& analys_type = QVariant::fromValue(AnalysisType::AddressCountData);
QStandardItem* node_item = AddChildNode(adrr_count_item, item_name, status, analys_type, true, state_ok); QStandardItem* node_item = AddChildNode(adrr_count_item, item_name, status, analys_type, true, status_ok);
node_item->setData(project_name, ProjectName); node_item->setData(project_name, ProjectName);
node_item->setData(ch_num, ChannelNum); node_item->setData(ch_num, ChannelNum);
node_map[item_name] = node_item; node_map[item_name] = node_item;
} }
state_ok = !pro_model->GetParticleEnergyDataFilename().isEmpty(); status_ok = !pro_model->GetParticleEnergyDataFilename().isEmpty();
status = state_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效"); status = status_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效");
analys_type = QVariant::fromValue(AnalysisType::ParticleEnergyData); analys_type = QVariant::fromValue(AnalysisType::ParticleEnergyData);
item_name = QStringLiteral(u"粒子能量数据"); item_name = QStringLiteral(u"粒子能量数据");
node_item = AddChildNode(analysis_data_item, item_name, status, analys_type, true, state_ok); node_item = AddChildNode(analysis_data_item, item_name, status, analys_type, true, status_ok);
node_item->setData(project_name, ProjectName); node_item->setData(project_name, ProjectName);
node_map[item_name] = node_item; node_map[item_name] = node_item;
state_ok = !pro_model->GetAllChannelEnergyTotalCountDataFilename().isEmpty(); status_ok = !pro_model->GetAllChannelEnergyTotalCountDataFilename().isEmpty();
status = state_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效"); status = status_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效");
item_name = QStringLiteral(u"能量计数"); item_name = QStringLiteral(u"能量计数");
analys_type = QVariant::fromValue(AnalysisType::EnergyCountData); analys_type = QVariant::fromValue(AnalysisType::EnergyCountData);
node_item = AddChildNode(analysis_data_item, item_name, status, analys_type, true, state_ok); node_item = AddChildNode(analysis_data_item, item_name, status, analys_type, true, status_ok);
node_item->setData(project_name, ProjectName); node_item->setData(project_name, ProjectName);
node_map[item_name] = node_item; node_map[item_name] = node_item;
QStandardItem* energy_count_item = node_item; QStandardItem* energy_count_item = node_item;
const auto& ch_energy_count_data_filename_list = pro_model->GetChannelEnergyCountDataFilenameList(); const auto& ch_energy_count_data_filename_list = pro_model->GetChannelEnergyCountDataFilenameList();
state_ok = !ch_energy_count_data_filename_list.isEmpty(); status_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) { for (auto it = ch_energy_count_data_filename_list.begin(); it != ch_energy_count_data_filename_list.end(); ++it) {
uint ch_num = it.key(); uint ch_num = it.key();
QString item_name = QStringLiteral(u"通道%1能量计数").arg(ch_num); QString item_name = QStringLiteral(u"通道%1能量计数").arg(ch_num);
const QVariant& analys_type = QVariant::fromValue(AnalysisType::ChannelEnergyCountData); const QVariant& analys_type = QVariant::fromValue(AnalysisType::ChannelEnergyCountData);
QStandardItem* node_item = AddChildNode(energy_count_item, item_name, status, analys_type, true, state_ok); QStandardItem* node_item = AddChildNode(energy_count_item, item_name, status, analys_type, true, status_ok);
node_item->setData(project_name, ProjectName); node_item->setData(project_name, ProjectName);
node_item->setData(ch_num, ChannelNum); node_item->setData(ch_num, ChannelNum);
node_map[item_name] = node_item; node_map[item_name] = node_item;
} }
uint conform_time_win = pro_model->GetConformTimeWin(); uint conform_time_win = pro_model->GetConformTimeWin();
state_ok = !pro_model->GetTimeWinConformEnergyDataFilenameList(conform_time_win).isEmpty(); status_ok = !pro_model->GetTimeWinConformEnergyDataFilenameList(conform_time_win).isEmpty();
status = state_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效"); status = status_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效");
analys_type = QVariant::fromValue(AnalysisType::CoincidenceParticleEnergyData); item_name = QStringLiteral(u"符合粒子能量数据");
item_name = QStringLiteral(u"符合粒子能量数据[%1ns]").arg(conform_time_win); analys_type = QVariant::fromValue(AnalysisType::None);
node_item = AddChildNode(analysis_data_item, item_name, status, analys_type, true, state_ok); 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); 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; node_map[item_name] = node_item;
}
}
// 交互分析 // 交互分析
item_name = QStringLiteral(u"交互分析"); item_name = QStringLiteral(u"交互分析");
@ -1013,98 +1055,98 @@ void MeasureAnalysisProjectModelList::intiProjectNodeStruce(MeasureAnalysisProje
interactive_analysis_item->setData(project_name, ProjectName); interactive_analysis_item->setData(project_name, ProjectName);
node_map[item_name] = interactive_analysis_item; node_map[item_name] = interactive_analysis_item;
state_ok = !pro_model->GetChannelAddressCountDataFilenameList().isEmpty(); status_ok = !pro_model->GetChannelAddressCountDataFilenameList().isEmpty();
status = state_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效"); status = status_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效");
analys_type = QVariant::fromValue(AnalysisType::AddressCountSpectrumView); analys_type = QVariant::fromValue(AnalysisType::AddressCountSpectrumView);
item_name = QStringLiteral(u"道址计数谱"); item_name = QStringLiteral(u"道址计数谱");
node_item = AddChildNode(interactive_analysis_item, item_name, status, analys_type, true, state_ok); node_item = AddChildNode(interactive_analysis_item, item_name, status, analys_type, true, status_ok);
node_item->setData(project_name, ProjectName); node_item->setData(project_name, ProjectName);
node_map[item_name] = node_item; node_map[item_name] = node_item;
state_ok = !pro_model->GetAllChannelEnergyTotalCountDataFilename().isEmpty(); status_ok = !pro_model->GetAllChannelEnergyTotalCountDataFilename().isEmpty();
state_ok &= !pro_model->GetChannelEnergyCountDataFilenameList().isEmpty(); status_ok &= !pro_model->GetChannelEnergyCountDataFilenameList().isEmpty();
status = state_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效"); status = status_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效");
analys_type = QVariant::fromValue(AnalysisType::EnergyCountSpectrumView); analys_type = QVariant::fromValue(AnalysisType::EnergyCountSpectrumView);
item_name = QStringLiteral(u"能量计数谱"); item_name = QStringLiteral(u"能量计数谱");
node_item = AddChildNode(interactive_analysis_item, item_name, status, analys_type, true, state_ok); node_item = AddChildNode(interactive_analysis_item, item_name, status, analys_type, true, status_ok);
node_item->setData(project_name, ProjectName); node_item->setData(project_name, ProjectName);
node_map[item_name] = node_item; node_map[item_name] = node_item;
state_ok = !pro_model->GetParticleEnergyDataFilename().isEmpty(); status_ok = !pro_model->GetParticleEnergyDataFilename().isEmpty();
status = state_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效"); status = status_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效");
analys_type = QVariant::fromValue(AnalysisType::CountingRateView); analys_type = QVariant::fromValue(AnalysisType::CountingRateView);
item_name = QStringLiteral(u"计数率分析"); item_name = QStringLiteral(u"计数率分析");
node_item = AddChildNode(interactive_analysis_item, item_name, status, analys_type, true, state_ok); node_item = AddChildNode(interactive_analysis_item, item_name, status, analys_type, true, status_ok);
node_item->setData(project_name, ProjectName); node_item->setData(project_name, ProjectName);
node_map[item_name] = node_item; node_map[item_name] = node_item;
state_ok = !pro_model->GetParticleEnergyDataFilename().isEmpty(); status_ok = !pro_model->GetParticleEnergyDataFilename().isEmpty();
status = state_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效"); status = status_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效");
analys_type = QVariant::fromValue(AnalysisType::EnergyPeakFitView); analys_type = QVariant::fromValue(AnalysisType::EnergyPeakFitView);
item_name = QStringLiteral(u"峰拟合分析"); item_name = QStringLiteral(u"峰拟合分析");
node_item = AddChildNode(interactive_analysis_item, item_name, status, analys_type, true, state_ok); node_item = AddChildNode(interactive_analysis_item, item_name, status, analys_type, true, status_ok);
node_item->setData(project_name, ProjectName); node_item->setData(project_name, ProjectName);
node_map[item_name] = node_item; node_map[item_name] = node_item;
state_ok = !pro_model->GetParticleEnergyDataFilename().isEmpty(); status_ok = !pro_model->GetParticleEnergyDataFilename().isEmpty();
status = state_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效"); status = status_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效");
analys_type = QVariant::fromValue(AnalysisType::NuclideAnalysisView); analys_type = QVariant::fromValue(AnalysisType::NuclideAnalysisView);
item_name = QStringLiteral(u"核素分析"); item_name = QStringLiteral(u"核素分析");
node_item = AddChildNode(interactive_analysis_item, item_name, status, analys_type, true, state_ok); node_item = AddChildNode(interactive_analysis_item, item_name, status, analys_type, true, status_ok);
node_item->setData(project_name, ProjectName); node_item->setData(project_name, ProjectName);
node_map[item_name] = node_item; node_map[item_name] = node_item;
state_ok = !pro_model->GetParticleEnergyDataFilename().isEmpty(); status_ok = !pro_model->GetParticleEnergyDataFilename().isEmpty();
status = state_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效"); status = status_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效");
analys_type = QVariant::fromValue(AnalysisType::ParticleInTimeView); analys_type = QVariant::fromValue(AnalysisType::ParticleInTimeView);
item_name = QStringLiteral(u"粒子入射时间分析"); item_name = QStringLiteral(u"粒子入射时间分析");
node_item = AddChildNode(interactive_analysis_item, item_name, status, analys_type, true, state_ok); node_item = AddChildNode(interactive_analysis_item, item_name, status, analys_type, true, status_ok);
node_item->setData(project_name, ProjectName); node_item->setData(project_name, ProjectName);
node_map[item_name] = node_item; node_map[item_name] = node_item;
state_ok = !pro_model->GetAllChannelParticleDataFilename().isEmpty(); status_ok = !pro_model->GetAllChannelParticleDataFilename().isEmpty();
status = state_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效"); status = status_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效");
analys_type = QVariant::fromValue(AnalysisType::ParticleTimeDiffView); analys_type = QVariant::fromValue(AnalysisType::ParticleTimeDiffView);
item_name = QStringLiteral(u"粒子时间差分析"); item_name = QStringLiteral(u"粒子时间差分析");
node_item = AddChildNode(interactive_analysis_item, item_name, status, analys_type, true, state_ok); node_item = AddChildNode(interactive_analysis_item, item_name, status, analys_type, true, status_ok);
node_item->setData(project_name, ProjectName); node_item->setData(project_name, ProjectName);
node_map[item_name] = node_item; node_map[item_name] = node_item;
state_ok = !pro_model->GetTimeWinConformEnergyDataFilenameList(conform_time_win).isEmpty(); status_ok = !pro_model->GetTimeWinConformEnergyDataFilenameList(conform_time_win).isEmpty();
status = state_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效"); status = status_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效");
analys_type = QVariant::fromValue(AnalysisType::CoincidenceEventTimeView); analys_type = QVariant::fromValue(AnalysisType::CoincidenceEventTimeView);
item_name = QStringLiteral(u"符合事件时间分析"); item_name = QStringLiteral(u"符合事件时间分析");
node_item = AddChildNode(interactive_analysis_item, item_name, status, analys_type, true, state_ok); node_item = AddChildNode(interactive_analysis_item, item_name, status, analys_type, true, status_ok);
node_item->setData(project_name, ProjectName); node_item->setData(project_name, ProjectName);
node_map[item_name] = node_item; node_map[item_name] = node_item;
state_ok = !pro_model->GetTimeWinConformEnergyDataFilenameList(conform_time_win).isEmpty(); status_ok = !pro_model->GetTimeWinConformEnergyDataFilenameList(conform_time_win).isEmpty();
status = state_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效"); status = status_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效");
analys_type = QVariant::fromValue(AnalysisType::CoincidenceParticleEnergySpectrumView); analys_type = QVariant::fromValue(AnalysisType::CoincidenceParticleEnergySpectrumView);
item_name = QStringLiteral(u"符合能谱[%1ns]").arg(conform_time_win); item_name = QStringLiteral(u"符合能谱[%1ns]").arg(conform_time_win);
node_item = AddChildNode(interactive_analysis_item, item_name, status, analys_type, true, state_ok); node_item = AddChildNode(interactive_analysis_item, item_name, status, analys_type, true, status_ok);
node_item->setData(project_name, ProjectName); node_item->setData(project_name, ProjectName);
node_map[item_name] = node_item; node_map[item_name] = node_item;
analys_type = QVariant::fromValue(AnalysisType::AntiCoincidenceSpectrumView); analys_type = QVariant::fromValue(AnalysisType::AntiCoincidenceSpectrumView);
item_name = QStringLiteral(u"反符合能谱[%1ns]").arg(conform_time_win); item_name = QStringLiteral(u"反符合能谱[%1ns]").arg(conform_time_win);
node_item = AddChildNode(interactive_analysis_item, item_name, status, analys_type, true, state_ok); node_item = AddChildNode(interactive_analysis_item, item_name, status, analys_type, true, status_ok);
node_item->setData(project_name, ProjectName); node_item->setData(project_name, ProjectName);
node_map[item_name] = node_item; node_map[item_name] = node_item;
state_ok = !pro_model->GetTimeWinConformEnergyDataFilenameList(conform_time_win).isEmpty(); status_ok = !pro_model->GetTimeWinConformEnergyDataFilenameList(conform_time_win).isEmpty();
status = state_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效"); status = status_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效");
analys_type = QVariant::fromValue(AnalysisType::CoincidenceParticleEnergySpectrum2DView); analys_type = QVariant::fromValue(AnalysisType::CoincidenceParticleEnergySpectrum2DView);
item_name = QStringLiteral(u"二维符合能谱[%1ns]").arg(conform_time_win); item_name = QStringLiteral(u"二维符合能谱[%1ns]").arg(conform_time_win);
node_item = AddChildNode(interactive_analysis_item, item_name, status, analys_type, true, state_ok); node_item = AddChildNode(interactive_analysis_item, item_name, status, analys_type, true, status_ok);
node_item->setData(project_name, ProjectName); node_item->setData(project_name, ProjectName);
node_map[item_name] = node_item; node_map[item_name] = node_item;
state_ok = !pro_model->GetTimeWinConformEnergyDataFilenameList(conform_time_win).isEmpty(); status_ok = !pro_model->GetTimeWinConformEnergyDataFilenameList(conform_time_win).isEmpty();
status = state_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效"); status = status_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效");
analys_type = QVariant::fromValue(AnalysisType::CoincidenceParticleEnergySpectrum3DView); analys_type = QVariant::fromValue(AnalysisType::CoincidenceParticleEnergySpectrum3DView);
item_name = QStringLiteral(u"三维符合能谱[%1ns]").arg(conform_time_win); item_name = QStringLiteral(u"三维符合能谱[%1ns]").arg(conform_time_win);
node_item = AddChildNode(interactive_analysis_item, item_name, status, analys_type, true, state_ok); node_item = AddChildNode(interactive_analysis_item, item_name, status, analys_type, true, status_ok);
node_item->setData(project_name, ProjectName); node_item->setData(project_name, ProjectName);
node_map[item_name] = node_item; node_map[item_name] = node_item;

View File

@ -61,6 +61,7 @@ public:
const QString GetParticleEnergyDataFilename() const; const QString GetParticleEnergyDataFilename() const;
const QMap<uint, QMap<uint, QString> > GetConformParticleDataFilenameList() const; const QMap<uint, QMap<uint, QString> > GetConformParticleDataFilenameList() const;
const QMap<uint, QString> GetTimeWinConformParticleDataFilenameList(uint time_win) 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 QMap<uint, QString> GetTimeWinConformEnergyDataFilenameList(uint time_win) const;
const QString GetAnalysisCustomData(AnalysisType analysis_type, const QString& data_item_name); const QString GetAnalysisCustomData(AnalysisType analysis_type, const QString& data_item_name);
@ -106,7 +107,8 @@ public:
NodeType = Qt::UserRole, NodeType = Qt::UserRole,
Fixed = Qt::UserRole + 1, Fixed = Qt::UserRole + 1,
ProjectName = Qt::UserRole + 2, ProjectName = Qt::UserRole + 2,
ChannelNum = Qt::UserRole + 3 ChannelNum = Qt::UserRole + 3,
ConformInfo = Qt::UserRole + 4
}; };
public: public:

View File

@ -6,6 +6,9 @@
MeasureAnalysisTreeView::MeasureAnalysisTreeView(QWidget* parent) MeasureAnalysisTreeView::MeasureAnalysisTreeView(QWidget* parent)
: QTreeView(parent) : QTreeView(parent)
{ {
this->setFrameShape(QFrame::NoFrame);
this->setLineWidth(0);
_model = ProjectList::Instance(); _model = ProjectList::Instance();
this->setModel(_model); this->setModel(_model);
@ -134,6 +137,24 @@ void MeasureAnalysisTreeView::onNodeDoubleClicked(const QModelIndex& index)
} }
} }
} break; } 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: { case AnalysisType::AddressCountSpectrumView: {
MeasureAnalysisProjectModel* project_model = _model->GetProjectModel(project_name); MeasureAnalysisProjectModel* project_model = _model->GetProjectModel(project_name);
if (project_model) { if (project_model) {