优化多通道能量刻度编辑
This commit is contained in:
parent
25cc07917b
commit
73d4544880
|
|
@ -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()) {
|
||||
|
|
|
|||
|
|
@ -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<double> 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<double> 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<std::vector<double> > EnergyScaleDataModel::GetFitData(const QString& channel_name)
|
||||
|
|
@ -183,4 +197,13 @@ std::vector<std::vector<double> > 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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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<std::vector<double> >& fit_data);
|
||||
std::vector<std::vector<double> > GetFitData(const QString& channel_name);
|
||||
|
||||
private:
|
||||
void cleanEmptyItem();
|
||||
|
||||
private:
|
||||
QString _data_filename;
|
||||
QVariantMap _energy_scale_data_map;
|
||||
|
|
|
|||
|
|
@ -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<QPushButton*>(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<QString, std::vector<std::vector<double> > > fit_data;
|
||||
for (int i = 0; i < ui->tablew_process_data->rowCount(); i++) {
|
||||
std::vector<double> 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<QString, int> 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<QString, std::vector<std::vector<double> > > 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<double> 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)
|
||||
|
|
|
|||
|
|
@ -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<EnergyScaleDataModel> _energy_scale_data_model;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -6,8 +6,8 @@
|
|||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>929</width>
|
||||
<height>404</height>
|
||||
<width>785</width>
|
||||
<height>435</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
|
|
@ -109,13 +109,6 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="btn_save">
|
||||
<property name="text">
|
||||
<string>保存</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="btn_apply">
|
||||
<property name="text">
|
||||
|
|
|
|||
|
|
@ -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<QString, QVariant>& 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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user