From 73d45448801091507d2a81fd427e9c089c870e50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=B5=B7?= Date: Thu, 19 Mar 2026 23:36:29 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=A4=9A=E9=80=9A=E9=81=93?= =?UTF-8?q?=E8=83=BD=E9=87=8F=E5=88=BB=E5=BA=A6=E7=BC=96=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/DataProcessWorkPool.cpp | 2 +- src/EnergyScaleDataModel.cpp | 41 +++++-- src/EnergyScaleDataModel.h | 6 + .../BatchEnergyScaleDialog.cpp | 106 +++++++++--------- .../BatchEnergyScaleDialog.h | 4 +- .../BatchEnergyScaleDialog.ui | 11 +- .../MeasureAnalysisParticleCountPlotView.cpp | 2 +- 7 files changed, 96 insertions(+), 76 deletions(-) diff --git a/src/DataProcessWorkPool.cpp b/src/DataProcessWorkPool.cpp index c637766..c967239 100644 --- a/src/DataProcessWorkPool.cpp +++ b/src/DataProcessWorkPool.cpp @@ -676,7 +676,7 @@ bool ChannelEnergyScaleFittingTask::IsValidSetWorkParameters() const bool ChannelEnergyScaleFittingTask::processTask() { QDir result_dir(this->_result_dir); - const QString& energy_scale_data_filename = result_dir.filePath(QStringLiteral(u"多通道能量刻度拟合.json")); + const QString& energy_scale_data_filename = result_dir.filePath(QStringLiteral(u"多通道能量刻度拟合结果.json")); EnergyScaleDataModel energy_scale_data_model(energy_scale_data_filename); for (const QString& channel : this->_channel_energy_scale_fit_data_map.keys()) { diff --git a/src/EnergyScaleDataModel.cpp b/src/EnergyScaleDataModel.cpp index 76e9b42..4bbc12e 100644 --- a/src/EnergyScaleDataModel.cpp +++ b/src/EnergyScaleDataModel.cpp @@ -6,9 +6,6 @@ EnergyScaleDataModel::EnergyScaleDataModel(const QString& filename) : _data_filename(filename) { _data_filename = filename; - if (!_data_filename.isEmpty()) { - LoadData(); - } } EnergyScaleDataModel::~EnergyScaleDataModel() @@ -19,9 +16,6 @@ EnergyScaleDataModel::~EnergyScaleDataModel() void EnergyScaleDataModel::SetDataFilename(const QString& filename) { _data_filename = filename; - if (!_data_filename.isEmpty()) { - LoadData(); - } } bool EnergyScaleDataModel::LoadData() @@ -64,6 +58,18 @@ bool EnergyScaleDataModel::IsValid() return b_is_valid; } +void EnergyScaleDataModel::SetChannelEnergyScaleDataMap(const QString& channel_name, const QVariantMap& ch_energy_scale_data_map) +{ + if (!ch_energy_scale_data_map.isEmpty()) { + this->_energy_scale_data_map[channel_name] = ch_energy_scale_data_map; + } +} + +QVariantMap EnergyScaleDataModel::GetChannelEnergyScaleDataMap(const QString& channel_name) +{ + return _energy_scale_data_map.value(channel_name, QVariantMap()).toMap(); +} + void EnergyScaleDataModel::SetEnergyFitDegree(const QString& channel_name, int fit_degree) { if (!_energy_scale_data_map.contains(channel_name)) { @@ -76,6 +82,7 @@ void EnergyScaleDataModel::SetEnergyFitDegree(const QString& channel_name, int f energy_scale_ch_data_map["EnergyFitDegree"] = fit_degree; } _energy_scale_data_map[channel_name] = energy_scale_ch_data_map; + cleanEmptyItem(); } int EnergyScaleDataModel::GetEnergyFitDegree(const QString& channel_name) @@ -98,12 +105,13 @@ void EnergyScaleDataModel::SetEnergyFitResultCoeffs(const QString& channel_name, coeffs_list.append(coeff); } QVariantMap energy_scale_ch_data_map = _energy_scale_data_map[channel_name].toMap(); - if ( coeffs_list.empty() ) { + if ( coeffs_list.isEmpty() ) { energy_scale_ch_data_map.remove("EnergyFitResultCoeffs"); } else { energy_scale_ch_data_map["EnergyFitResultCoeffs"] = coeffs_list; } _energy_scale_data_map[channel_name] = energy_scale_ch_data_map; + cleanEmptyItem(); } std::vector EnergyScaleDataModel::GetEnergyFitResultCoeffs(const QString& channel_name) @@ -129,12 +137,13 @@ void EnergyScaleDataModel::SetFwhmFitResultCoeffs(const QString& channel_name, s coeffs_list.append(coeff); } QVariantMap energy_scale_ch_data_map = _energy_scale_data_map[channel_name].toMap(); - if ( coeffs_list.empty() ) { + if ( coeffs_list.isEmpty() ) { energy_scale_ch_data_map.remove("FwhmFitResultCoeffs"); } else { energy_scale_ch_data_map["FwhmFitResultCoeffs"] = coeffs_list; } _energy_scale_data_map[channel_name] = energy_scale_ch_data_map; + cleanEmptyItem(); } std::vector EnergyScaleDataModel::GetFwhmFitResultCoeffs(const QString& channel_name) @@ -164,8 +173,13 @@ void EnergyScaleDataModel::SetFitData(const QString& channel_name, const std::ve fit_data_list.append(QVariant(fit_list)); } QVariantMap energy_scale_ch_data_map = _energy_scale_data_map[channel_name].toMap(); - energy_scale_ch_data_map["FitData"] = fit_data_list; + if ( fit_data_list.isEmpty() ) { + energy_scale_ch_data_map.remove("FitData"); + } else { + energy_scale_ch_data_map["FitData"] = fit_data_list; + } _energy_scale_data_map[channel_name] = energy_scale_ch_data_map; + cleanEmptyItem(); } std::vector > EnergyScaleDataModel::GetFitData(const QString& channel_name) @@ -183,4 +197,13 @@ std::vector > EnergyScaleDataModel::GetFitData(const QString } } return fit_data; +} + +void EnergyScaleDataModel::cleanEmptyItem() +{ + for (auto it = _energy_scale_data_map.begin(); it != _energy_scale_data_map.end(); it++) { + if (it.value().toMap().isEmpty()) { + _energy_scale_data_map.remove(it.key()); + } + } } \ No newline at end of file diff --git a/src/EnergyScaleDataModel.h b/src/EnergyScaleDataModel.h index 457643c..b2f20d7 100644 --- a/src/EnergyScaleDataModel.h +++ b/src/EnergyScaleDataModel.h @@ -16,6 +16,9 @@ public: bool SaveData(); bool IsValid(); + void SetChannelEnergyScaleDataMap(const QString& channel_name, const QVariantMap& ch_energy_scale_data_map); + QVariantMap GetChannelEnergyScaleDataMap(const QString& channel_name); + void SetEnergyFitDegree(const QString& channel_name, int fit_degree); int GetEnergyFitDegree(const QString& channel_name); @@ -28,6 +31,9 @@ public: void SetFitData(const QString& channel_name, const std::vector >& fit_data); std::vector > GetFitData(const QString& channel_name); +private: + void cleanEmptyItem(); + private: QString _data_filename; QVariantMap _energy_scale_data_map; diff --git a/src/MeasureAnalysisParticleCountPlotView/BatchEnergyScaleDialog.cpp b/src/MeasureAnalysisParticleCountPlotView/BatchEnergyScaleDialog.cpp index 606fc19..50aab41 100644 --- a/src/MeasureAnalysisParticleCountPlotView/BatchEnergyScaleDialog.cpp +++ b/src/MeasureAnalysisParticleCountPlotView/BatchEnergyScaleDialog.cpp @@ -79,6 +79,7 @@ BatchEnergyScaleDialog::BatchEnergyScaleDialog(QWidget* parent) } }); connect(ui->btn_remove_selected, &QPushButton::clicked, [this](){ + QStringList changed_ch_name_list; auto row_count = ui->tablew_process_data->rowCount(); for (int row = row_count - 1; row >= 0; --row) { QTableWidgetItem* item = ui->tablew_process_data->item(row, 0); @@ -86,19 +87,15 @@ BatchEnergyScaleDialog::BatchEnergyScaleDialog(QWidget* parent) continue; QPushButton* btn_remove_row = dynamic_cast(ui->tablew_process_data->cellWidget(row, 8)); if (btn_remove_row) { - ui->tablew_process_data->removeRow(row); btn_remove_row->deleteLater(); - this->updateSetEnergyFilter(); } + changed_ch_name_list.append(item->text()); + ui->tablew_process_data->removeRow(row); + this->updateSetEnergyFilter(); } - if ( row_count > ui->tablew_process_data->rowCount() ) { - this->saveEnergyScaleData(); - } + this->energyScaleDataChanged(changed_ch_name_list); }); connect(ui->btn_fit, &QPushButton::clicked, this, &BatchEnergyScaleDialog::onFitBtnClickedProcess); - connect(ui->btn_save, &QPushButton::clicked, [this](){ - this->saveEnergyScaleData(); - }); connect(ui->btn_apply, &QPushButton::clicked, [this](){ this->applyEnergyScaleFitResultData(); }); @@ -131,7 +128,6 @@ void BatchEnergyScaleDialog::SetPeakResultDataModel(QAbstractTableModel* peaks_r void BatchEnergyScaleDialog::SetViewWorkspace(const QString &workspace) { this->_workspace = workspace; - QDir workspace_dir(this->_workspace); const QString& energy_scale_data_filename = workspace_dir.filePath(QStringLiteral(u"多通道能量刻度拟合.json")); this->_energy_scale_data_model->SetDataFilename(energy_scale_data_filename); @@ -173,7 +169,7 @@ void BatchEnergyScaleDialog::onSelectedScaleRange(double min, double max) layout->addLayout(layout_btns); if (QDialog::Accepted == set_energy_dlg.exec()) { - bool b_has_new_data = false; + QStringList changed_ch_name_list; double set_energy = spinbox_set_energy->value(); for (int i = 0; i < _peaks_result_model->rowCount(); i++) { const QString& channel_name = _peaks_result_model->data(_peaks_result_model->index(i, 0)).toString(); @@ -195,22 +191,20 @@ void BatchEnergyScaleDialog::onSelectedScaleRange(double min, double max) ui->tablew_process_data->setItem(row, 8, item); QPushButton* btn_remove_row = new QPushButton(QStringLiteral(u"删除")); btn_remove_row->setMaximumWidth(35); - connect(btn_remove_row, &QPushButton::clicked, [this, item, btn_remove_row]() { + connect(btn_remove_row, &QPushButton::clicked, [this, channel_name, item, btn_remove_row]() { item->setCheckState(Qt::Unchecked); int remove_row = item->row(); ui->tablew_process_data->removeRow(remove_row); btn_remove_row->deleteLater(); this->updateSetEnergyFilter(); - this->saveEnergyScaleData(); + this->energyScaleDataChanged({channel_name}); }); ui->tablew_process_data->setCellWidget(row, 8, btn_remove_row); this->insertSetEnergyValueToFilter(set_energy); - b_has_new_data = true; + changed_ch_name_list.append(channel_name); } } - if (b_has_new_data) { - this->saveEnergyScaleData(); - } + this->energyScaleDataChanged(changed_ch_name_list); } } @@ -275,13 +269,13 @@ void BatchEnergyScaleDialog::LoadEnergyScaleData() ui->tablew_process_data->setItem(row, 8, item); QPushButton* btn_remove_row = new QPushButton(QStringLiteral(u"删除")); btn_remove_row->setMaximumWidth(35); - connect(btn_remove_row, &QPushButton::clicked, [this, item, btn_remove_row]() { + connect(btn_remove_row, &QPushButton::clicked, [this, channel_name, item, btn_remove_row]() { item->setCheckState(Qt::Unchecked); int remove_row = item->row(); ui->tablew_process_data->removeRow(remove_row); btn_remove_row->deleteLater(); this->updateSetEnergyFilter(); - this->saveEnergyScaleData(); + this->energyScaleDataChanged({channel_name}); }); ui->tablew_process_data->setCellWidget(row, 8, btn_remove_row); this->insertSetEnergyValueToFilter(fit_data_item[1]); @@ -289,37 +283,6 @@ void BatchEnergyScaleDialog::LoadEnergyScaleData() } } -void BatchEnergyScaleDialog::saveEnergyScaleData() -{ - QMap > > fit_data; - for (int i = 0; i < ui->tablew_process_data->rowCount(); i++) { - std::vector fit_data_item; - const QString& channel_name = ui->tablew_process_data->item(i, 0)->text(); - double peak_pos_addr = ui->tablew_process_data->item(i, 1)->text().toDouble(); - double set_energy = ui->tablew_process_data->item(i, 2)->text().toDouble(); - double fit_energy = ui->tablew_process_data->item(i, 3)->text().toDouble(); - double energy_diff = ui->tablew_process_data->item(i, 4)->text().toDouble(); - double peak_fwhm = ui->tablew_process_data->item(i, 5)->text().toDouble(); - double fit_fwhm = ui->tablew_process_data->item(i, 6)->text().toDouble(); - double fwhm_diff = ui->tablew_process_data->item(i, 7)->text().toDouble(); - fit_data_item.push_back(peak_pos_addr); - fit_data_item.push_back(set_energy); - fit_data_item.push_back(fit_energy); - fit_data_item.push_back(energy_diff); - fit_data_item.push_back(peak_fwhm); - fit_data_item.push_back(fit_fwhm); - fit_data_item.push_back(fwhm_diff); - fit_data[channel_name].push_back(fit_data_item); - } - for (const QString& channel_name : fit_data.keys()) { - this->_energy_scale_data_model->SetFitData(channel_name, fit_data[channel_name]); - this->_energy_scale_data_model->SetEnergyFitDegree(channel_name, 0); - this->_energy_scale_data_model->SetEnergyFitResultCoeffs(channel_name, {}); - this->_energy_scale_data_model->SetFwhmFitResultCoeffs(channel_name, {}); - } - this->_energy_scale_data_model->SaveData(); -} - void BatchEnergyScaleDialog::onFitBtnClickedProcess() { QMap fit_degree_map; @@ -347,7 +310,6 @@ void BatchEnergyScaleDialog::onFitBtnClickedProcess() return; } if (!channel_energy_scale_fit_data_map.empty()) { - ui->btn_apply->setEnabled(false); auto channel_erergy_scale_fit_task = new DataProcessWorkPool::ChannelEnergyScaleFittingTask; channel_erergy_scale_fit_task->SetResultDir(this->_workspace); channel_erergy_scale_fit_task->SetData(channel_energy_scale_fit_data_map, fit_degree_map); @@ -359,6 +321,16 @@ void BatchEnergyScaleDialog::onFitBtnClickedProcess() void BatchEnergyScaleDialog::onEnergyScaleFitFinished(const QString &project_name) { Q_UNUSED(project_name); + QDir result_dir(this->_workspace); + const QString& result_filename = result_dir.filePath(QStringLiteral(u"多通道能量刻度拟合结果.json")); + EnergyScaleDataModel result_model(result_filename); + result_model.LoadData(); + for (const QString& channel_name : this->_channel_name_list) { + const QVariantMap& ch_energy_scale_data_map = result_model.GetChannelEnergyScaleDataMap(channel_name); + this->_energy_scale_data_model->SetChannelEnergyScaleDataMap(channel_name, ch_energy_scale_data_map); + } + this->_energy_scale_data_model->SaveData(); + QFile::remove(result_filename); this->LoadEnergyScaleData(); } @@ -381,10 +353,38 @@ void BatchEnergyScaleDialog::applyEnergyScaleFitResultData() } } -void BatchEnergyScaleDialog::energyScaleDataChange() +void BatchEnergyScaleDialog::energyScaleDataChanged(const QStringList &channel_name_list) { - this->_is_fit_finished = false; - ui->btn_apply->setEnabled(false); + QMap > > ch_fit_data; + for (int i = 0; i < ui->tablew_process_data->rowCount(); i++) { + const QString& channel_name = ui->tablew_process_data->item(i, 0)->text(); + if ( !channel_name_list.contains(channel_name) ) { + continue; + } + std::vector fit_data_item; + double peak_pos_addr = ui->tablew_process_data->item(i, 1)->text().toDouble(); + double set_energy = ui->tablew_process_data->item(i, 2)->text().toDouble(); + double fit_energy = ui->tablew_process_data->item(i, 3)->text().toDouble(); + double energy_diff = ui->tablew_process_data->item(i, 4)->text().toDouble(); + double peak_fwhm = ui->tablew_process_data->item(i, 5)->text().toDouble(); + double fit_fwhm = ui->tablew_process_data->item(i, 6)->text().toDouble(); + double fwhm_diff = ui->tablew_process_data->item(i, 7)->text().toDouble(); + fit_data_item.push_back(peak_pos_addr); + fit_data_item.push_back(set_energy); + fit_data_item.push_back(fit_energy); + fit_data_item.push_back(energy_diff); + fit_data_item.push_back(peak_fwhm); + fit_data_item.push_back(fit_fwhm); + fit_data_item.push_back(fwhm_diff); + ch_fit_data[channel_name].push_back(fit_data_item); + } + for (const QString& channel_name : ch_fit_data.keys()) { + this->_energy_scale_data_model->SetFitData(channel_name, ch_fit_data[channel_name]); + this->_energy_scale_data_model->SetEnergyFitDegree(channel_name, 0); + this->_energy_scale_data_model->SetEnergyFitResultCoeffs(channel_name, {}); + this->_energy_scale_data_model->SetFwhmFitResultCoeffs(channel_name, {}); + } + this->_energy_scale_data_model->SaveData(); } void BatchEnergyScaleDialog::closeEvent(QCloseEvent *e) diff --git a/src/MeasureAnalysisParticleCountPlotView/BatchEnergyScaleDialog.h b/src/MeasureAnalysisParticleCountPlotView/BatchEnergyScaleDialog.h index e046579..2536c1f 100644 --- a/src/MeasureAnalysisParticleCountPlotView/BatchEnergyScaleDialog.h +++ b/src/MeasureAnalysisParticleCountPlotView/BatchEnergyScaleDialog.h @@ -33,9 +33,8 @@ private slots: private: void insertSetEnergyValueToFilter(double energy); void updateSetEnergyFilter(); - void saveEnergyScaleData(); void applyEnergyScaleFitResultData(); - void energyScaleDataChange(); + void energyScaleDataChanged(const QStringList& channel_name_list); signals: void close(); @@ -49,7 +48,6 @@ private: QStringList _channel_name_list; QString _workspace; QAbstractTableModel* _peaks_result_model; - bool _is_fit_finished = false; std::unique_ptr _energy_scale_data_model; }; diff --git a/src/MeasureAnalysisParticleCountPlotView/BatchEnergyScaleDialog.ui b/src/MeasureAnalysisParticleCountPlotView/BatchEnergyScaleDialog.ui index 032fb63..631ca80 100644 --- a/src/MeasureAnalysisParticleCountPlotView/BatchEnergyScaleDialog.ui +++ b/src/MeasureAnalysisParticleCountPlotView/BatchEnergyScaleDialog.ui @@ -6,8 +6,8 @@ 0 0 - 929 - 404 + 785 + 435 @@ -109,13 +109,6 @@ - - - - 保存 - - - diff --git a/src/MeasureAnalysisParticleCountPlotView/MeasureAnalysisParticleCountPlotView.cpp b/src/MeasureAnalysisParticleCountPlotView/MeasureAnalysisParticleCountPlotView.cpp index 312d70f..22cb2fb 100644 --- a/src/MeasureAnalysisParticleCountPlotView/MeasureAnalysisParticleCountPlotView.cpp +++ b/src/MeasureAnalysisParticleCountPlotView/MeasureAnalysisParticleCountPlotView.cpp @@ -74,6 +74,7 @@ void MeasureAnalysisParticleCountPlotView::InitViewWorkspace(const QString& proj _batch_energy_scale_dlg->SetProjectName(project_name); _batch_energy_scale_dlg->SetViewWorkspace(workspace); + _batch_energy_scale_dlg->SetPeakResultDataModel(_find_peaks_result_dlg->GetPeakResultDataModel()); } void MeasureAnalysisParticleCountPlotView::SetAnalyzeDataFilename(const QMap& data_files_set) @@ -188,7 +189,6 @@ void MeasureAnalysisParticleCountPlotView::setupEnergyScaleDlg() { if (!_batch_energy_scale_dlg) { _batch_energy_scale_dlg = new BatchEnergyScaleDialog(this); - _batch_energy_scale_dlg->SetPeakResultDataModel(_find_peaks_result_dlg->GetPeakResultDataModel()); connect(_data_selector, &CustomQwtPlotXaxisSelector::selectionFinished, _batch_energy_scale_dlg, &BatchEnergyScaleDialog::onSelectedScaleRange); connect(_batch_energy_scale_dlg, &BatchEnergyScaleDialog::close, [this](){ this->_data_selector->setEnabled(false);