diff --git a/src/CountRateAnalysisView/CountRateAnalysisView.cpp b/src/CountRateAnalysisView/CountRateAnalysisView.cpp new file mode 100644 index 0000000..c33baa5 --- /dev/null +++ b/src/CountRateAnalysisView/CountRateAnalysisView.cpp @@ -0,0 +1,177 @@ +#include "CountRateAnalysisView.h" +#include "ui_CountRateAnalysisView.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "CustomQwtPlot.h" +#include +#include + +CountRateAnalysisView::CountRateAnalysisView(QWidget *parent) : + MeasureAnalysisView(parent), + ui(new Ui::CountRateAnalysisView) +{ + ui->setupUi(this); + InitUi(); + +} + +CountRateAnalysisView::~CountRateAnalysisView() +{ + delete ui; +} + +void CountRateAnalysisView::InitViewWorkspace(const QString &project_name) +{ + +} + +void CountRateAnalysisView::SetAnalyzeDataFilename(const QMap &data_files_set) +{ + if(!data_files_set.isEmpty()) + { + m_AllData = getParticleInjectTimeData(data_files_set.first().toString()); + setData(m_AllData); + } +} + +void CountRateAnalysisView::setData(QVector data) +{ + int energyStart = ui->label_energyStart->text().toInt(); + int energyEnd = ui->label_energyEnd->text().toInt(); + int nInv = 1; + constexpr qint64 NS_PER_SECOND = 1000000000; // 纳秒转秒的基数 + + if (data.isEmpty()) return; // 添加空列表保护 + QVector x; + QVector y; + + const ParticleInjectTime& lostdt = data.last(); + const qint64 totalNanoseconds = lostdt.dTime * 5; + const int nAllS = static_cast(totalNanoseconds / NS_PER_SECOND) + 1; + const int nVecSize = nAllS / nInv; + QVector vec(nVecSize); // 默认初始化为0 + + + double minValue = 0; + double maxValue = 0; + for(auto info : data) + { + const qint64 ns = (info.dTime * 5) / NS_PER_SECOND; + const int nidx = static_cast(ns / nInv); // 整数除法,速度快 + if (nidx < nVecSize) + ++vec[nidx]; // 使用 ++ 而非 vec[nidx]++ + } + + QVector vecXpt(vec.size()); + for (int i = 0; i < vec.size(); ++i) + vecXpt[i] = static_cast(i); + + // 创建曲线并设置数据 + QwtPlotCurve *curve = new QwtPlotCurve(); + curve->setSamples(vecXpt, vec); + // 将曲线添加到 CustomQwtPlot 中(会自动分配颜色) + plot->AddCurve(curve); + // 设置坐标轴范围和标题 +// plot->setAxisScale(QwtPlot::xBottom, 0, x.last()); +// plot->setAxisScale(QwtPlot::yLeft,minValue , maxValue); + + LOG_INFO(QStringLiteral(u"%1数据读取完毕.").arg(this->GetViewName())); + + // 刷新绘图 + plot->replot(); + +} + +QVector CountRateAnalysisView::getParticleInjectTimeData(QString path) +{ + QVector records; + QFile file(path); + + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { + qWarning() << "无法打开文件:" << file.errorString(); + return records; + } + QTextStream stream(&file); + stream.setCodec("UTF-8"); + int lineNumber = 0; + while (!stream.atEnd()) + { + QString line = stream.readLine().trimmed(); + lineNumber++; + + // 跳过空行 + if (line.isEmpty()) + continue; + + // 按逗号分割 + QStringList fields = line.split(','); + + // 检查字段数量是否正确(应该为4) + if (fields.size() != 4) { + qWarning() << "行" << lineNumber << "字段数量不正确,跳过:" << line; + continue; + } + + //获取板卡号通道号 + int bd = fields[0].toInt(); + int ch = fields[1].toInt(); + int detector = bd + ch * 8; + if(detector >= 32) + { + continue; + } + + bool ok; + ParticleInjectTime rec; + rec.bd = bd; + rec.ch = ch; + rec.index = lineNumber; + rec.dEnergy = fields[2].toDouble(&ok); + rec.dTime = fields[3].toLongLong(&ok); + records.append(rec); + } + + file.close(); + + return records; +} + +void CountRateAnalysisView::InitUi() +{ + plot = new CustomQwtPlot(); + plot->SetXaxisDragScale(true); + setupPlot(); + ui->verticalLayout_2->addWidget(plot); +} + +void CountRateAnalysisView::setupPlot() +{ + plot->setCanvasBackground(Qt::white); + QwtPlotCanvas* canvas = qobject_cast(plot->canvas()); + canvas->setFrameStyle(QFrame::NoFrame); + + plot->setAxisTitle(QwtPlot::xBottom, QStringLiteral(u"时间")); + plot->setAxisTitle(QwtPlot::yLeft, QStringLiteral(u"计数")); + // set axis auto scale + plot->setAxisAutoScale(QwtPlot::xBottom, true); + plot->setAxisAutoScale(QwtPlot::yLeft, true); + // 启用网格线 + plot->enableAxis(QwtPlot::xBottom); + plot->enableAxis(QwtPlot::yLeft); + + // 设置QWT图例 +// QwtLegend* legend = new QwtLegend(); +// legend->setDefaultItemMode(QwtLegendData::ReadOnly); +// plot->insertLegend(legend, QwtPlot::RightLegend); + + plot->SetXaxisDragScale(true); +} diff --git a/src/CountRateAnalysisView/CountRateAnalysisView.h b/src/CountRateAnalysisView/CountRateAnalysisView.h new file mode 100644 index 0000000..fde83de --- /dev/null +++ b/src/CountRateAnalysisView/CountRateAnalysisView.h @@ -0,0 +1,42 @@ +#ifndef COUNTRATEANALYSISVIEW_H +#define COUNTRATEANALYSISVIEW_H + +#include +#include "qwt.h" +#include "CustomQwtPlot.h" +#include +#include +#include "MeasureAnalysisView.h" + + + +namespace Ui { +class CountRateAnalysisView; +} + +class CountRateAnalysisView : public MeasureAnalysisView +{ + Q_OBJECT + +public: + explicit CountRateAnalysisView(QWidget *parent = nullptr); + virtual ~CountRateAnalysisView(); + + virtual void InitViewWorkspace(const QString& project_name) override final; + virtual void SetAnalyzeDataFilename(const QMap& data_files_set); + + void setData(QVector data); + + //获取数据 + QVector getParticleInjectTimeData(QString path); +private: + void InitUi(); + void setupPlot(); + +private: + Ui::CountRateAnalysisView *ui; + CustomQwtPlot *plot; + QVector m_AllData;//存储的所有的粒子入射时间数据 +}; + +#endif //COUNTRATEANALYSIS_H diff --git a/src/CountRateAnalysisView/CountRateAnalysisView.ui b/src/CountRateAnalysisView/CountRateAnalysisView.ui new file mode 100644 index 0000000..58b955e --- /dev/null +++ b/src/CountRateAnalysisView/CountRateAnalysisView.ui @@ -0,0 +1,184 @@ + + + CountRateAnalysisView + + + + 0 + 0 + 997 + 307 + + + + ParticleInjectTimeAnalysis + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 0 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + 统计时间间隔: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + 1 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + s + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + 统计目标: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + 特征峰 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + 特征峰能量: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + 45 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + KeV + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + 计数率统计时间设置 + + + + + + + + + + 0 + 0 + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + + + + + + + diff --git a/src/MeasureAnalysisView.cpp b/src/MeasureAnalysisView.cpp index 677cce4..ef42da9 100644 --- a/src/MeasureAnalysisView.cpp +++ b/src/MeasureAnalysisView.cpp @@ -2,8 +2,8 @@ #include #include "MeasureAnalysisDataTableView.h" #include "ParticleCountPlotView.h" -#include "ParticleInjectTimeAnalysis.h" -#include "CountRateAnalysis.h" +#include "ParticleInjectTimeAnalysisView.h" +#include "CountRateAnalysisView.h" #include "EnergyCountPlotView.h" MeasureAnalysisView *MeasureAnalysisView::NewAnalyzeView(AnalysisType view_type) @@ -67,7 +67,7 @@ MeasureAnalysisView *MeasureAnalysisView::NewAnalyzeView(AnalysisType view_type) // new_view->setDeleteOnClose(false); } break; case AnalysisType::CountingRateView: { - new_view = new CountRateAnalysis; + new_view = new CountRateAnalysisView; new_view->setDeleteOnClose(false); } break; case AnalysisType::EnergyPeakFitView: { @@ -79,7 +79,7 @@ MeasureAnalysisView *MeasureAnalysisView::NewAnalyzeView(AnalysisType view_type) // new_view->setDeleteOnClose(false); } break; case AnalysisType::ParticleInTimeView: { - new_view = new ParticleInjectTimeAnalysis; + new_view = new ParticleInjectTimeAnalysisView; new_view->setDeleteOnClose(false); } break; case AnalysisType::ParticleTimeDiffView: { diff --git a/src/ParticleInjectTimeView/ParticleInjectTimeAnalysisView.cpp b/src/ParticleInjectTimeView/ParticleInjectTimeAnalysisView.cpp new file mode 100644 index 0000000..82f5aa8 --- /dev/null +++ b/src/ParticleInjectTimeView/ParticleInjectTimeAnalysisView.cpp @@ -0,0 +1,165 @@ +#include "ParticleInjectTimeAnalysisView.h" +#include "ui_ParticleInjectTimeAnalysisView.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "CustomQwtPlot.h" +#include +#include + +ParticleInjectTimeAnalysisView::ParticleInjectTimeAnalysisView(QWidget *parent) : + MeasureAnalysisView(parent), + ui(new Ui::ParticleInjectTimeAnalysisView) +{ + ui->setupUi(this); + InitUi(); + +} + +ParticleInjectTimeAnalysisView::~ParticleInjectTimeAnalysisView() +{ + delete ui; +} + +void ParticleInjectTimeAnalysisView::InitViewWorkspace(const QString &project_name) +{ + +} + +void ParticleInjectTimeAnalysisView::SetAnalyzeDataFilename(const QMap &data_files_set) +{ + if(!data_files_set.isEmpty()) + { + m_AllData = getParticleInjectTimeData(data_files_set.first().toString()); + setData(m_AllData); + } +} + +void ParticleInjectTimeAnalysisView::setData(QVector data) +{ + int energyStart = ui->label_energyStart->text().toInt(); + int energyEnd = ui->label_energyEnd->text().toInt(); + + QVector x; + QVector y; + + double minValue = 0; + double maxValue = 0; + for(auto info : data) + { + if(info.dEnergy <= energyStart || info.dEnergy >= energyEnd) + { + continue; + } + x.append(info.index); + y.append(info.dTime); + minValue = qMin(minValue, info.dTime); + maxValue = qMax(maxValue, info.dTime); + } + + // 创建曲线并设置数据 + QwtPlotCurve *curve = new QwtPlotCurve(); + curve->setSamples(x, y); + // 将曲线添加到 CustomQwtPlot 中(会自动分配颜色) + plot->AddCurve(curve); + // 设置坐标轴范围和标题 +// plot->setAxisScale(QwtPlot::xBottom, 0, x.last()); +// plot->setAxisScale(QwtPlot::yLeft,minValue , maxValue); + + LOG_INFO(QStringLiteral(u"%1数据读取完毕.").arg(this->GetViewName())); + + // 刷新绘图 + plot->replot(); + +} + +QVector ParticleInjectTimeAnalysisView::getParticleInjectTimeData(QString path) +{ + QVector records; + QFile file(path); + + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { + qWarning() << "无法打开文件:" << file.errorString(); + return records; + } + QTextStream stream(&file); + stream.setCodec("UTF-8"); + int lineNumber = 0; + while (!stream.atEnd()) + { + QString line = stream.readLine().trimmed(); + lineNumber++; + + // 跳过空行 + if (line.isEmpty()) + continue; + + // 按逗号分割 + QStringList fields = line.split(','); + + // 检查字段数量是否正确(应该为4) + if (fields.size() != 4) { + qWarning() << "行" << lineNumber << "字段数量不正确,跳过:" << line; + continue; + } + + //获取板卡号通道号 + int bd = fields[0].toInt(); + int ch = fields[1].toInt(); + int detector = bd + ch * 8; + if(detector >= 32) + { + continue; + } + + bool ok; + ParticleInjectTime rec; + rec.index = lineNumber; + rec.dEnergy = fields[2].toDouble(&ok); + rec.dTime = fields[3].toLongLong(&ok); + records.append(rec); + } + + file.close(); + + return records; +} + +void ParticleInjectTimeAnalysisView::InitUi() +{ + plot = new CustomQwtPlot(); + plot->SetXaxisDragScale(true); + setupPlot(); + ui->verticalLayout_2->addWidget(plot); +} + +void ParticleInjectTimeAnalysisView::setupPlot() +{ + plot->setCanvasBackground(Qt::white); + QwtPlotCanvas* canvas = qobject_cast(plot->canvas()); + canvas->setFrameStyle(QFrame::NoFrame); + + plot->setAxisTitle(QwtPlot::xBottom, QStringLiteral(u"粒子序号")); + plot->setAxisTitle(QwtPlot::yLeft, QStringLiteral(u"粒子时间")); + // set axis auto scale + plot->setAxisAutoScale(QwtPlot::xBottom, true); + plot->setAxisAutoScale(QwtPlot::yLeft, true); + // 启用网格线 + plot->enableAxis(QwtPlot::xBottom); + plot->enableAxis(QwtPlot::yLeft); + +// // 设置QWT图例 +// QwtLegend* legend = new QwtLegend(); +// legend->setDefaultItemMode(QwtLegendData::ReadOnly); +// plot->insertLegend(legend, QwtPlot::RightLegend); + + plot->SetXaxisDragScale(true); +} diff --git a/src/ParticleInjectTimeView/ParticleInjectTimeAnalysisView.h b/src/ParticleInjectTimeView/ParticleInjectTimeAnalysisView.h new file mode 100644 index 0000000..4a822b7 --- /dev/null +++ b/src/ParticleInjectTimeView/ParticleInjectTimeAnalysisView.h @@ -0,0 +1,41 @@ +#ifndef PARTICLEINJECTTIMEANALYSISVIEW_H +#define PARTICLEINJECTTIMEANALYSISVIEW_H + +#include +#include "qwt.h" +#include "CustomQwtPlot.h" +#include +#include +#include "MeasureAnalysisView.h" + + +namespace Ui { +class ParticleInjectTimeAnalysisView; +} + +class ParticleInjectTimeAnalysisView : public MeasureAnalysisView +{ + Q_OBJECT + +public: + explicit ParticleInjectTimeAnalysisView(QWidget *parent = nullptr); + virtual ~ParticleInjectTimeAnalysisView(); + + virtual void InitViewWorkspace(const QString& project_name) override final; + virtual void SetAnalyzeDataFilename(const QMap& data_files_set); + + void setData(QVector data); + + //获取数据 + QVector getParticleInjectTimeData(QString path); +private: + void InitUi(); + void setupPlot(); + +private: + Ui::ParticleInjectTimeAnalysisView *ui; + CustomQwtPlot *plot; + QVector m_AllData;//存储的所有的粒子入射时间数据 +}; + +#endif // PARTICLEINJECTTIMEANALYSIS_H diff --git a/src/ParticleInjectTimeView/ParticleInjectTimeAnalysisView.ui b/src/ParticleInjectTimeView/ParticleInjectTimeAnalysisView.ui new file mode 100644 index 0000000..e9d4bd5 --- /dev/null +++ b/src/ParticleInjectTimeView/ParticleInjectTimeAnalysisView.ui @@ -0,0 +1,157 @@ + + + ParticleInjectTimeAnalysisView + + + + 0 + 0 + 997 + 307 + + + + ParticleInjectTimeAnalysis + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + 粒子入射设置 + + + + + + + 起始能量: + + + + + + + 50 + + + + + + + KeV + + + + + + + ~ + + + + + + + 终止能量: + + + + + + + 100 + + + + + + + KeV + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + 感兴趣区域(ROI)选择 + + + + + + + + + + 0 + 0 + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + + + + + + + diff --git a/src/src.pro b/src/src.pro index 6bf655f..9b75255 100644 --- a/src/src.pro +++ b/src/src.pro @@ -35,17 +35,18 @@ INCLUDEPATH += \ $${PWD}/ParticleCountPlotView \ $${PWD}/ParticleInjectTimeView \ $${PWD}/EnergyCountPlotView \ - $${PWD}/CountRateAnalysis + $${PWD}/CountRateAnalysisView DEPENDPATH += \ $${PWD}/MeasureAnalysisParticleCountPlotView \ $${PWD}/ParticleCountPlotView \ $${PWD}/ParticleInjectTimeView\ $${PWD}/EnergyCountPlotView \ - $${PWD}/CountRateAnalysis + $${PWD}/CountRateAnalysisView SOURCES += \ AboutDlg.cpp \ + CountRateAnalysisView/CountRateAnalysisView.cpp \ CustomQwtPlot.cpp \ DataProcessWorkPool.cpp \ EnergyCountPlotView/EnergyCountPlotView.cpp \ @@ -62,17 +63,17 @@ SOURCES += \ MeasureDeviceParamsCfgForm.cpp \ NewMeasureAnalysisDlg.cpp \ MeasureAnalysisProjectModel.cpp \ + ParticleInjectTimeView/ParticleInjectTimeAnalysisView.cpp \ VirtualTable/CsvDataSource.cpp \ VirtualTable/SampleDataSource.cpp \ VirtualTable/VirtualTableModel.cpp \ VirtualTable/VirtualTableView.cpp \ - ParticleInjectTimeView/ParticleInjectTimeAnalysis.cpp\ - CountRateAnalysis/CountRateAnalysis.cpp\ main.cpp HEADERS += \ AboutDlg.h \ AnalysisTypeDefine.h \ + CountRateAnalysisView/CountRateAnalysisView.h \ CustomQwtPlot.h \ DataProcessWorkPool.h \ EnergyCountPlotView/EnergyCountPlotView.h \ @@ -90,25 +91,24 @@ HEADERS += \ MeasureDeviceParamsCfgForm.h \ NewMeasureAnalysisDlg.h \ MeasureAnalysisProjectModel.h \ + ParticleInjectTimeView/ParticleInjectTimeAnalysisView.h \ VirtualTable/CsvDataSource.h \ VirtualTable/DataSource.h \ VirtualTable/SampleDataSource.h \ VirtualTable/VirtualTableModel.h \ - VirtualTable/VirtualTableView.h \ - ParticleInjectTimeView/ParticleInjectTimeAnalysis.h\ - CountRateAnalysis/CountRateAnalysis.h + VirtualTable/VirtualTableView.h FORMS += \ AboutDlg.ui \ + CountRateAnalysisView/CountRateAnalysisView.ui \ EnergyScaleForm.ui \ MainWindow.ui \ MeasureAnalysisHistoryForm.ui \ ParticleCountPlotView/BatchEnergyScaleDialog.ui \ MeasureDeviceParamsCfgForm.ui \ - NewMeasureAnalysisDlg.ui\ - ParticleInjectTimeView/ParticleInjectTimeAnalysis.ui\ - CountRateAnalysis/CountRateAnalysis.ui + NewMeasureAnalysisDlg.ui \ + ParticleInjectTimeView/ParticleInjectTimeAnalysisView.ui