1、添加反符合谱数据查看和修改反符合视图问题;
2、修改已知BUG;
This commit is contained in:
parent
51d9050e9a
commit
e7f7e31d85
|
|
@ -13,6 +13,7 @@ enum class AnalysisType {
|
|||
EnergyCountData, // 能量计数数据
|
||||
ChannelEnergyCountData, // 通道能量计数数据
|
||||
CoincidenceParticleEnergyData, // 符合粒子能量数据
|
||||
AntiCoincidenceParticleEnergyData, // 反符合粒子能量数据
|
||||
AddressCountSpectrumView, // 粒子计数谱视图
|
||||
EnergyCountSpectrumView, // 能量计数谱视图
|
||||
CoincidenceParticleEnergySpectrum2DView, // 符合粒子能量2D视图
|
||||
|
|
|
|||
|
|
@ -16,13 +16,6 @@
|
|||
#include <map>
|
||||
#include <vector>
|
||||
|
||||
struct SpectrumData {
|
||||
int board_id;
|
||||
int channel_id;
|
||||
double energy;
|
||||
uint64_t timestamp;
|
||||
};
|
||||
|
||||
AntiConformEnergySpectrumView::AntiConformEnergySpectrumView(QWidget* parent)
|
||||
: MeasureAnalysisView(parent)
|
||||
{
|
||||
|
|
@ -92,57 +85,37 @@ void AntiConformEnergySpectrumView::loadAndProcess()
|
|||
return;
|
||||
}
|
||||
|
||||
std::vector<SpectrumData> rawData;
|
||||
io::CSVReader<4> in(QStrToSysPath(_data_filename));
|
||||
io::CSVReader<5> in(QStrToSysPath(_data_filename));
|
||||
in.read_header(io::ignore_extra_column,
|
||||
QString(QStringLiteral(u"时间窗口")).toStdString(),
|
||||
QString(QStringLiteral(u"板卡号")).toStdString(),
|
||||
QString(QStringLiteral(u"通道号")).toStdString(),
|
||||
QString(QStringLiteral(u"能量(KeV)")).toStdString(),
|
||||
QString(QStringLiteral(u"时间计数")).toStdString());
|
||||
|
||||
int board, channel;
|
||||
double energy;
|
||||
unsigned long long time_count;
|
||||
while (in.read_row(board, channel, energy, time_count)) {
|
||||
SpectrumData sd;
|
||||
sd.board_id = board;
|
||||
sd.channel_id = channel;
|
||||
sd.energy = energy;
|
||||
sd.timestamp = time_count;
|
||||
rawData.push_back(sd);
|
||||
}
|
||||
|
||||
if (rawData.empty()) {
|
||||
QMetaObject::invokeMethod(this, [this]() {
|
||||
_busy_indicator->Stop();
|
||||
}, Qt::QueuedConnection);
|
||||
return;
|
||||
}
|
||||
|
||||
const int STEP = 1;
|
||||
std::map<int, double> hist;
|
||||
|
||||
for (const auto& spdt : rawData) {
|
||||
int idx = static_cast<int>(spdt.energy) / STEP;
|
||||
int time_win, board, channel;
|
||||
double energy;
|
||||
unsigned long long time_count;
|
||||
while (in.read_row(time_win, board, channel, energy, time_count)) {
|
||||
int idx = static_cast<int>(energy) / STEP;
|
||||
hist[idx] += 1.0;
|
||||
}
|
||||
|
||||
QVector<double> vx, vy;
|
||||
for (const auto& pair : hist) {
|
||||
vx.push_back(pair.first * STEP);
|
||||
vy.push_back(pair.second);
|
||||
}
|
||||
|
||||
if (vx.isEmpty()) {
|
||||
QMetaObject::invokeMethod(this, [this]() {
|
||||
_busy_indicator->Stop();
|
||||
}, Qt::QueuedConnection);
|
||||
return;
|
||||
}
|
||||
|
||||
double dmaxx = *std::max_element(vx.begin(), vx.end());
|
||||
double dmaxy = *std::max_element(vy.begin(), vy.end());
|
||||
|
||||
QMetaObject::invokeMethod(this, [this, vx, vy, dmaxx, dmaxy]() {
|
||||
_curve->setSamples(vx, vy);
|
||||
_plot->SetAxisInitRange(QwtPlot::xBottom, 0.0f, dmaxx);
|
||||
|
|
|
|||
|
|
@ -861,6 +861,15 @@ void MeasureAnalysisProjectModelList::onChannelAddressCountProcessFinished(bool
|
|||
this->SetNodeStatus(adrr_count_spec_item, status, status_ok);
|
||||
}
|
||||
pro_model->SaveProjectModel();
|
||||
|
||||
if ( !pro_model->GetEnergyScaleFilename().isEmpty() ) {
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -962,7 +971,24 @@ void MeasureAnalysisProjectModelList::onCoincidenceProcessFinished(bool ok, cons
|
|||
return;
|
||||
if (this->_project_models.contains(project_name)) {
|
||||
auto pro_model = this->_project_models[project_name];
|
||||
|
||||
// auto& node_map = this->_project_node_items[project_name];
|
||||
// const QString& item_name = QStringLiteral(u"符合事件时间分析[%1ns]").arg(conform_time_win);;
|
||||
// if (node_map.contains(item_name)) {
|
||||
// auto item = node_map[item_name];
|
||||
// this->SetNodeStatus(item, status, status_ok);
|
||||
// }
|
||||
|
||||
pro_model->SaveProjectModel();
|
||||
|
||||
if ( !pro_model->GetEnergyScaleFilename().isEmpty() ) {
|
||||
auto coincidence_process_task = new DataProcessWorkPool::EnergyScaleCoincidenceDataTask;
|
||||
coincidence_process_task->SetFinishedNotifier(this, "onEnergyScaleCoincidenceDataFinished", project_name);
|
||||
coincidence_process_task->StartTask();
|
||||
auto anti_coincidence_process_task = new DataProcessWorkPool::EnergyScaleaAntiCoincidenceDataTask;
|
||||
anti_coincidence_process_task->SetFinishedNotifier(this, "onEnergyScaleAntiCoincidenceDataFinished", project_name);
|
||||
anti_coincidence_process_task->StartTask();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1007,18 +1033,28 @@ void MeasureAnalysisProjectModelList::onEnergyScaleCoincidenceDataFinished(bool
|
|||
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);
|
||||
auto item = node_map[item_name];
|
||||
this->SetNodeStatus(item, status, status_ok);
|
||||
}
|
||||
item_name = QStringLiteral(u"符合事件时间分析[%1ns]").arg(conform_time_win);;
|
||||
if (node_map.contains(item_name)) {
|
||||
auto item = node_map[item_name];
|
||||
this->SetNodeStatus(item, status, status_ok);
|
||||
}
|
||||
item_name = QStringLiteral(u"符合事件时间分析[%1ns]").arg(conform_time_win);;
|
||||
if (node_map.contains(item_name)) {
|
||||
auto item = node_map[item_name];
|
||||
this->SetNodeStatus(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);
|
||||
auto item = node_map[item_name];
|
||||
this->SetNodeStatus(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);
|
||||
auto item = node_map[item_name];
|
||||
this->SetNodeStatus(item, status, status_ok);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1037,14 +1073,41 @@ void MeasureAnalysisProjectModelList::onEnergyScaleAntiCoincidenceDataFinished(b
|
|||
auto pro_model = this->_project_models[project_name];
|
||||
auto& node_map = this->_project_node_items[project_name];
|
||||
const auto& anti_conform_energy_data = pro_model->GetAntiConformEnergyData();
|
||||
|
||||
bool status_ok = false;
|
||||
QString status = QStringLiteral(u"无效");
|
||||
if ( anti_conform_energy_data.size() ) {
|
||||
status_ok = true;
|
||||
status = QStringLiteral(u"有效");
|
||||
}
|
||||
QString item_name = QStringLiteral(u"反符合粒子能量数据");
|
||||
QStandardItem* anti_conform_energy_data_group_item = nullptr;
|
||||
if (node_map.contains(item_name)) {
|
||||
anti_conform_energy_data_group_item = node_map[item_name];
|
||||
this->SetNodeStatus(anti_conform_energy_data_group_item, status, status_ok);
|
||||
}
|
||||
for (const auto& time_win : anti_conform_energy_data.keys()) {
|
||||
bool status_ok = false;
|
||||
QString status = QStringLiteral(u"无效");
|
||||
status_ok = false;
|
||||
status = QStringLiteral(u"无效");
|
||||
const QString& data_filename = anti_conform_energy_data.value(time_win);
|
||||
if ( (!data_filename.isEmpty()) && QFile::exists(data_filename) ) {
|
||||
status_ok = true;
|
||||
status = QStringLiteral(u"有效");
|
||||
}
|
||||
if (anti_conform_energy_data_group_item) {
|
||||
QString item_name = QStringLiteral(u"反符合能谱数据[%1ns]").arg(time_win);
|
||||
if (node_map.contains(item_name)) {
|
||||
auto anti_conform_erergy_spec_item = node_map[item_name];
|
||||
this->SetNodeStatus(anti_conform_erergy_spec_item, status, status_ok);
|
||||
} else {
|
||||
const QVariant& analys_type = QVariant::fromValue(AnalysisType::AntiCoincidenceParticleEnergyData);
|
||||
QStandardItem* node_item = AddChildNode(anti_conform_energy_data_group_item, item_name, status, analys_type, true, status_ok);
|
||||
node_item->setData(project_name, ProjectName);
|
||||
QVariant conform_info(time_win);
|
||||
node_item->setData(conform_info, ConformInfo);
|
||||
node_map[item_name] = node_item;
|
||||
}
|
||||
}
|
||||
QString item_name = QStringLiteral(u"反符合能谱[%1ns]").arg(time_win);
|
||||
if (node_map.contains(item_name)) {
|
||||
auto anti_conform_erergy_spec_item = node_map[item_name];
|
||||
|
|
@ -1181,7 +1244,7 @@ void MeasureAnalysisProjectModelList::intiProjectNodeStruce(MeasureAnalysisProje
|
|||
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);
|
||||
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);
|
||||
|
|
@ -1191,6 +1254,28 @@ void MeasureAnalysisProjectModelList::intiProjectNodeStruce(MeasureAnalysisProje
|
|||
}
|
||||
}
|
||||
|
||||
status_ok = !pro_model->GetAntiConformEnergyData(conform_time_win).isEmpty();
|
||||
status = status_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效");
|
||||
item_name = QStringLiteral(u"反符合粒子能量数据");
|
||||
analys_type = QVariant::fromValue(AnalysisType::None);
|
||||
QStandardItem* anti_conform_energy_data_group_item = AddChildNode(analysis_data_item, item_name, status, analys_type, true, status_ok);
|
||||
anti_conform_energy_data_group_item->setData(project_name, ProjectName);
|
||||
node_map[item_name] = anti_conform_energy_data_group_item;
|
||||
|
||||
auto time_win_anit_confirm_file_name_set = pro_model->GetAntiConformEnergyData();
|
||||
for (int conform_time_win : time_win_anit_confirm_file_name_set.keys()) {
|
||||
const auto& anti_conform_energy_data_filename = pro_model->GetAntiConformEnergyData(conform_time_win);
|
||||
status_ok = !anti_conform_energy_data_filename.isEmpty();
|
||||
status = status_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效");
|
||||
QString item_name = QStringLiteral(u"反符合能谱数据[%1ns]").arg(conform_time_win);
|
||||
const QVariant& analys_type = QVariant::fromValue(AnalysisType::AntiCoincidenceParticleEnergyData);
|
||||
QStandardItem* node_item = AddChildNode(anti_conform_energy_data_group_item, item_name, status, analys_type, true, status_ok);
|
||||
node_item->setData(project_name, ProjectName);
|
||||
QVariant conform_info(conform_time_win);
|
||||
node_item->setData(conform_info, ConformInfo);
|
||||
node_map[item_name] = node_item;
|
||||
}
|
||||
|
||||
// 交互分析
|
||||
item_name = QStringLiteral(u"交互分析");
|
||||
QStandardItem* interactive_analysis_item = AddChildNode(project_item, item_name, QString(), QVariant(), true, true);
|
||||
|
|
@ -1257,7 +1342,7 @@ void MeasureAnalysisProjectModelList::intiProjectNodeStruce(MeasureAnalysisProje
|
|||
status_ok = !pro_model->GetTimeWinConformEnergyDataFilenameList(conform_time_win).isEmpty();
|
||||
status = status_ok ? QStringLiteral(u"有效") : QStringLiteral(u"无效");
|
||||
analys_type = QVariant::fromValue(AnalysisType::CoincidenceEventTimeView);
|
||||
item_name = QStringLiteral(u"符合事件时间分析");
|
||||
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->setData(project_name, ProjectName);
|
||||
node_map[item_name] = node_item;
|
||||
|
|
|
|||
|
|
@ -155,6 +155,18 @@ void MeasureAnalysisTreeView::onNodeDoubleClicked(const QModelIndex& index)
|
|||
}
|
||||
}
|
||||
} break;
|
||||
case AnalysisType::AntiCoincidenceParticleEnergyData: {
|
||||
QVariant conform_info_v = _model->GetNodeUserData(item, ProjectList::ConformInfo);
|
||||
if (conform_info_v.isValid()) {
|
||||
int conform_time_win = conform_info_v.toInt();
|
||||
MeasureAnalysisProjectModel* project_model = _model->GetProjectModel(project_name);
|
||||
if (project_model) {
|
||||
auto file_name = project_model->GetAntiConformEnergyData(conform_time_win);
|
||||
const QString& data_name = QStringLiteral(u"反符合粒子能量数据[%1ns]").arg(conform_time_win);
|
||||
data_files_set[data_name] = QString(file_name);
|
||||
}
|
||||
}
|
||||
} break;
|
||||
case AnalysisType::CoincidenceParticleEnergyData: {
|
||||
QVariant conform_info_v = _model->GetNodeUserData(item, ProjectList::ConformInfo);
|
||||
if (conform_info_v.isValid()) {
|
||||
|
|
|
|||
|
|
@ -59,6 +59,10 @@ MeasureAnalysisView* MeasureAnalysisView::NewAnalyzeView(AnalysisType view_type)
|
|||
new_view = new MeasureAnalysisDataTableView;
|
||||
new_view->setDeleteOnClose(true);
|
||||
} break;
|
||||
case AnalysisType::AntiCoincidenceParticleEnergyData: {
|
||||
new_view = new MeasureAnalysisDataTableView;
|
||||
new_view->setDeleteOnClose(true);
|
||||
} break;
|
||||
case AnalysisType::AddressCountSpectrumView: {
|
||||
new_view = new ParticleCountPlotView;
|
||||
new_view->setDeleteOnClose(false);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user