From e69629e2038258ecb43ca37c42eed059f181b7b4 Mon Sep 17 00:00:00 2001 From: anxinglong <2910824064@qq.com> Date: Thu, 26 Mar 2026 09:41:59 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=AE=A1=E6=95=B0=E7=8E=87?= =?UTF-8?q?=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/CountRateAnalysis/CountRateAnalysis.cpp | 177 ----------------- src/CountRateAnalysis/CountRateAnalysis.h | 42 ---- src/CountRateAnalysis/CountRateAnalysis.ui | 184 ------------------ .../CountRateAnalysisView.cpp | 65 +++---- src/MeasureAnalysisTreeView.cpp | 9 + src/MeasureAnalysisView.cpp | 6 +- .../ParticleInjectTimeAnalysis.cpp | 165 ---------------- .../ParticleInjectTimeAnalysis.h | 41 ---- .../ParticleInjectTimeAnalysis.ui | 157 --------------- .../ParticleInjectTimeAnalysisView.cpp | 129 +++++++----- .../ParticleInjectTimeAnalysisView.h | 8 +- src/src.pro | 15 +- 12 files changed, 127 insertions(+), 871 deletions(-) delete mode 100644 src/CountRateAnalysis/CountRateAnalysis.cpp delete mode 100644 src/CountRateAnalysis/CountRateAnalysis.h delete mode 100644 src/CountRateAnalysis/CountRateAnalysis.ui delete mode 100644 src/ParticleInjectTimeView/ParticleInjectTimeAnalysis.cpp delete mode 100644 src/ParticleInjectTimeView/ParticleInjectTimeAnalysis.h delete mode 100644 src/ParticleInjectTimeView/ParticleInjectTimeAnalysis.ui diff --git a/src/CountRateAnalysis/CountRateAnalysis.cpp b/src/CountRateAnalysis/CountRateAnalysis.cpp deleted file mode 100644 index bf3b372..0000000 --- a/src/CountRateAnalysis/CountRateAnalysis.cpp +++ /dev/null @@ -1,177 +0,0 @@ -#include "CountRateAnalysis.h" -#include "ui_CountRateAnalysis.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "CustomQwtPlot.h" -#include -#include - -CountRateAnalysis::CountRateAnalysis(QWidget *parent) : - MeasureAnalysisView(parent), - ui(new Ui::CountRateAnalysis) -{ - ui->setupUi(this); - InitUi(); - -} - -CountRateAnalysis::~CountRateAnalysis() -{ - delete ui; -} - -void CountRateAnalysis::InitViewWorkspace(const QString &project_name) -{ - -} - -void CountRateAnalysis::SetAnalyzeDataFilename(const QMap &data_files_set) -{ - if(!data_files_set.isEmpty()) - { - m_AllData = getParticleInjectTimeData(data_files_set.first().toString()); - setData(m_AllData); - } -} - -void CountRateAnalysis::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 CountRateAnalysis::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 CountRateAnalysis::InitUi() -{ - plot = new CustomQwtPlot(); - plot->SetXaxisDragScale(true); - setupPlot(); - ui->verticalLayout_2->addWidget(plot); -} - -void CountRateAnalysis::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/CountRateAnalysis/CountRateAnalysis.h b/src/CountRateAnalysis/CountRateAnalysis.h deleted file mode 100644 index eec4efa..0000000 --- a/src/CountRateAnalysis/CountRateAnalysis.h +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef COUNTRATEANALYSIS_H -#define COUNTRATEANALYSIS_H - -#include -#include "qwt.h" -#include "CustomQwtPlot.h" -#include -#include -#include "MeasureAnalysisView.h" - - - -namespace Ui { -class CountRateAnalysis; -} - -class CountRateAnalysis : public MeasureAnalysisView -{ - Q_OBJECT - -public: - explicit CountRateAnalysis(QWidget *parent = nullptr); - virtual ~CountRateAnalysis(); - - 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::CountRateAnalysis *ui; - CustomQwtPlot *plot; - QVector m_AllData;//存储的所有的粒子入射时间数据 -}; - -#endif //COUNTRATEANALYSIS_H diff --git a/src/CountRateAnalysis/CountRateAnalysis.ui b/src/CountRateAnalysis/CountRateAnalysis.ui deleted file mode 100644 index 46a4ac1..0000000 --- a/src/CountRateAnalysis/CountRateAnalysis.ui +++ /dev/null @@ -1,184 +0,0 @@ - - - CountRateAnalysis - - - - 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/CountRateAnalysisView/CountRateAnalysisView.cpp b/src/CountRateAnalysisView/CountRateAnalysisView.cpp index c33baa5..b1375f5 100644 --- a/src/CountRateAnalysisView/CountRateAnalysisView.cpp +++ b/src/CountRateAnalysisView/CountRateAnalysisView.cpp @@ -14,12 +14,15 @@ #include "CustomQwtPlot.h" #include #include +#include "csv.h" CountRateAnalysisView::CountRateAnalysisView(QWidget *parent) : MeasureAnalysisView(parent), ui(new Ui::CountRateAnalysisView) { ui->setupUi(this); + this->setViewType(PlotFrame); + InitUi(); } @@ -94,53 +97,29 @@ void CountRateAnalysisView::setData(QVector data) QVector CountRateAnalysisView::getParticleInjectTimeData(QString path) { QVector records; - QFile file(path); + io::CSVReader<4> in(QStrToSysPath(path)); + in.read_header(io::ignore_extra_column, "板卡号", "通道号", "能量(KeV)", "时间计数"); - if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { - qWarning() << "无法打开文件:" << file.errorString(); - return records; - } - QTextStream stream(&file); - stream.setCodec("UTF-8"); + int board, channel; + double energy, time_count; 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); + // 逐行读取 + while (in.read_row(board, channel, energy, time_count)) + { + int detector = board + channel * 8; + lineNumber++; + if(detector >= 32) + { + continue; + } + ParticleInjectTime rec; + rec.index = lineNumber; + rec.dEnergy = energy; + rec.dTime = time_count; + records.append(rec); } - - file.close(); + return records; return records; } diff --git a/src/MeasureAnalysisTreeView.cpp b/src/MeasureAnalysisTreeView.cpp index aa29811..ca9da6e 100644 --- a/src/MeasureAnalysisTreeView.cpp +++ b/src/MeasureAnalysisTreeView.cpp @@ -184,6 +184,15 @@ void MeasureAnalysisTreeView::onNodeDoubleClicked(const QModelIndex& index) data_files_set[QStringLiteral(u"计数率")] = file_name; } } + } break; + case AnalysisType::ParticleTimeDiffView: { + MeasureAnalysisProjectModel* project_model = _model->GetProjectModel(project_name); + if (project_model) { + auto file_name = project_model->GetAllChannelParticleDataFilename(); + if ( !file_name.isEmpty() ) { + data_files_set[QStringLiteral(u"粒子时间差")] = file_name; + } + } } break; default: break; diff --git a/src/MeasureAnalysisView.cpp b/src/MeasureAnalysisView.cpp index ef42da9..6eafe7d 100644 --- a/src/MeasureAnalysisView.cpp +++ b/src/MeasureAnalysisView.cpp @@ -5,7 +5,7 @@ #include "ParticleInjectTimeAnalysisView.h" #include "CountRateAnalysisView.h" #include "EnergyCountPlotView.h" - +#include "ParticleTimePoorView.h" MeasureAnalysisView *MeasureAnalysisView::NewAnalyzeView(AnalysisType view_type) { MeasureAnalysisView* new_view = nullptr; @@ -83,8 +83,8 @@ MeasureAnalysisView *MeasureAnalysisView::NewAnalyzeView(AnalysisType view_type) new_view->setDeleteOnClose(false); } break; case AnalysisType::ParticleTimeDiffView: { - // new_view = new MeasureAnalysisParticleCountPlotView; - // new_view->setDeleteOnClose(false); + new_view = new ParticleTimePoorView; + new_view->setDeleteOnClose(false); } break; case AnalysisType::CoincidenceEventTimeView: { // new_view = new MeasureAnalysisParticleCountPlotView; diff --git a/src/ParticleInjectTimeView/ParticleInjectTimeAnalysis.cpp b/src/ParticleInjectTimeView/ParticleInjectTimeAnalysis.cpp deleted file mode 100644 index ff17bed..0000000 --- a/src/ParticleInjectTimeView/ParticleInjectTimeAnalysis.cpp +++ /dev/null @@ -1,165 +0,0 @@ -#include "ParticleInjectTimeAnalysis.h" -#include "ui_ParticleInjectTimeAnalysis.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "CustomQwtPlot.h" -#include -#include - -ParticleInjectTimeAnalysis::ParticleInjectTimeAnalysis(QWidget *parent) : - MeasureAnalysisView(parent), - ui(new Ui::ParticleInjectTimeAnalysis) -{ - ui->setupUi(this); - InitUi(); - -} - -ParticleInjectTimeAnalysis::~ParticleInjectTimeAnalysis() -{ - delete ui; -} - -void ParticleInjectTimeAnalysis::InitViewWorkspace(const QString &project_name) -{ - -} - -void ParticleInjectTimeAnalysis::SetAnalyzeDataFilename(const QMap &data_files_set) -{ - if(!data_files_set.isEmpty()) - { - m_AllData = getParticleInjectTimeData(data_files_set.first().toString()); - setData(m_AllData); - } -} - -void ParticleInjectTimeAnalysis::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 ParticleInjectTimeAnalysis::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 ParticleInjectTimeAnalysis::InitUi() -{ - plot = new CustomQwtPlot(); - plot->SetXaxisDragScale(true); - setupPlot(); - ui->verticalLayout_2->addWidget(plot); -} - -void ParticleInjectTimeAnalysis::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/ParticleInjectTimeAnalysis.h b/src/ParticleInjectTimeView/ParticleInjectTimeAnalysis.h deleted file mode 100644 index e5976f1..0000000 --- a/src/ParticleInjectTimeView/ParticleInjectTimeAnalysis.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef PARTICLEINJECTTIMEANALYSIS_H -#define PARTICLEINJECTTIMEANALYSIS_H - -#include -#include "qwt.h" -#include "CustomQwtPlot.h" -#include -#include -#include "MeasureAnalysisView.h" - - -namespace Ui { -class ParticleInjectTimeAnalysis; -} - -class ParticleInjectTimeAnalysis : public MeasureAnalysisView -{ - Q_OBJECT - -public: - explicit ParticleInjectTimeAnalysis(QWidget *parent = nullptr); - virtual ~ParticleInjectTimeAnalysis(); - - 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::ParticleInjectTimeAnalysis *ui; - CustomQwtPlot *plot; - QVector m_AllData;//存储的所有的粒子入射时间数据 -}; - -#endif // PARTICLEINJECTTIMEANALYSIS_H diff --git a/src/ParticleInjectTimeView/ParticleInjectTimeAnalysis.ui b/src/ParticleInjectTimeView/ParticleInjectTimeAnalysis.ui deleted file mode 100644 index a37f20a..0000000 --- a/src/ParticleInjectTimeView/ParticleInjectTimeAnalysis.ui +++ /dev/null @@ -1,157 +0,0 @@ - - - ParticleInjectTimeAnalysis - - - - 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/ParticleInjectTimeView/ParticleInjectTimeAnalysisView.cpp b/src/ParticleInjectTimeView/ParticleInjectTimeAnalysisView.cpp index 82f5aa8..235e51c 100644 --- a/src/ParticleInjectTimeView/ParticleInjectTimeAnalysisView.cpp +++ b/src/ParticleInjectTimeView/ParticleInjectTimeAnalysisView.cpp @@ -19,6 +19,7 @@ ParticleInjectTimeAnalysisView::ParticleInjectTimeAnalysisView(QWidget *parent) MeasureAnalysisView(parent), ui(new Ui::ParticleInjectTimeAnalysisView) { + this->setViewType(PlotFrame); ui->setupUi(this); InitUi(); @@ -36,14 +37,59 @@ void ParticleInjectTimeAnalysisView::InitViewWorkspace(const QString &project_na void ParticleInjectTimeAnalysisView::SetAnalyzeDataFilename(const QMap &data_files_set) { + int energyStart = ui->label_energyStart->text().toInt(); + int energyEnd = ui->label_energyEnd->text().toInt(); if(!data_files_set.isEmpty()) { - m_AllData = getParticleInjectTimeData(data_files_set.first().toString()); - setData(m_AllData); + io::CSVReader<4> in(QStrToSysPath(data_files_set.first().toString())); + in.read_header(io::ignore_extra_column, "板卡号", "通道号", "能量(KeV)", "时间计数"); + + int board, channel; + double energy, time_count; + int lineNumber = 0; + QVector x; + QVector y; + double minValue = 0; + double maxValue = 0; + // 逐行读取 + while (in.read_row(board, channel, energy, time_count)) + { + // qDebug()< 32) + { + continue; + } + if(energy <= energyStart || energy >= energyEnd) + { + continue; + } + x.append(lineNumber); + y.append(time_count); + minValue = qMin(minValue, time_count); + maxValue = qMax(maxValue, time_count); + } + // 创建曲线并设置数据 + 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(); +// m_AllData = getParticleInjectTimeData(data_files_set.first().toString()); +// setData(m_AllData); + } } -void ParticleInjectTimeAnalysisView::setData(QVector data) +void ParticleInjectTimeAnalysisView::setData(QVector data) { int energyStart = ui->label_energyStart->text().toInt(); int energyEnd = ui->label_energyEnd->text().toInt(); @@ -55,18 +101,19 @@ void ParticleInjectTimeAnalysisView::setData(QVector data) double maxValue = 0; for(auto info : data) { - if(info.dEnergy <= energyStart || info.dEnergy >= energyEnd) + 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); + x.append(info->index); + y.append(info->dTime); + minValue = qMin(minValue, info->dTime); + maxValue = qMax(maxValue, info->dTime); } // 创建曲线并设置数据 QwtPlotCurve *curve = new QwtPlotCurve(); +// curve->setRawSamples(x.data(),y.data(),x.size()); curve->setSamples(x, y); // 将曲线添加到 CustomQwtPlot 中(会自动分配颜色) plot->AddCurve(curve); @@ -81,55 +128,33 @@ void ParticleInjectTimeAnalysisView::setData(QVector data) } -QVector ParticleInjectTimeAnalysisView::getParticleInjectTimeData(QString path) +QVector ParticleInjectTimeAnalysisView::getParticleInjectTimeData(QString path) { - QVector records; - QFile file(path); + QVector records; - if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { - qWarning() << "无法打开文件:" << file.errorString(); - return records; - } - QTextStream stream(&file); - stream.setCodec("UTF-8"); + io::CSVReader<4> in(QStrToSysPath(path)); + in.read_header(io::ignore_extra_column, "板卡号", "通道号", "能量(KeV)", "时间计数"); + + int board, channel; + double energy, time_count; 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); + // 逐行读取 + while (in.read_row(board, channel, energy, time_count)) + { +// qDebug()< 32) + { + continue; + } + ParticleInjectTime *rec = new ParticleInjectTime; + rec->index = lineNumber; + rec->dEnergy = energy; + rec->dTime = time_count; + records.append(rec); } - - file.close(); - return records; } diff --git a/src/ParticleInjectTimeView/ParticleInjectTimeAnalysisView.h b/src/ParticleInjectTimeView/ParticleInjectTimeAnalysisView.h index 4a822b7..3e5b500 100644 --- a/src/ParticleInjectTimeView/ParticleInjectTimeAnalysisView.h +++ b/src/ParticleInjectTimeView/ParticleInjectTimeAnalysisView.h @@ -7,6 +7,8 @@ #include #include #include "MeasureAnalysisView.h" +#include "csv.h" + namespace Ui { @@ -24,10 +26,10 @@ public: virtual void InitViewWorkspace(const QString& project_name) override final; virtual void SetAnalyzeDataFilename(const QMap& data_files_set); - void setData(QVector data); + void setData(QVector data); //获取数据 - QVector getParticleInjectTimeData(QString path); + QVector getParticleInjectTimeData(QString path); private: void InitUi(); void setupPlot(); @@ -35,7 +37,7 @@ private: private: Ui::ParticleInjectTimeAnalysisView *ui; CustomQwtPlot *plot; - QVector m_AllData;//存储的所有的粒子入射时间数据 + QVector m_AllData;//存储的所有的粒子入射时间数据 }; #endif // PARTICLEINJECTTIMEANALYSIS_H diff --git a/src/src.pro b/src/src.pro index 9b75255..42af255 100644 --- a/src/src.pro +++ b/src/src.pro @@ -35,14 +35,17 @@ INCLUDEPATH += \ $${PWD}/ParticleCountPlotView \ $${PWD}/ParticleInjectTimeView \ $${PWD}/EnergyCountPlotView \ - $${PWD}/CountRateAnalysisView + $${PWD}/CountRateAnalysisView \ + $${PWD}/ParticleTimePoorView DEPENDPATH += \ $${PWD}/MeasureAnalysisParticleCountPlotView \ $${PWD}/ParticleCountPlotView \ $${PWD}/ParticleInjectTimeView\ $${PWD}/EnergyCountPlotView \ - $${PWD}/CountRateAnalysisView + $${PWD}/CountRateAnalysisView \ + $${PWD}/ParticleTimePoorView + SOURCES += \ AboutDlg.cpp \ @@ -68,6 +71,7 @@ SOURCES += \ VirtualTable/SampleDataSource.cpp \ VirtualTable/VirtualTableModel.cpp \ VirtualTable/VirtualTableView.cpp \ + ParticleTimePoorView/ParticleTimePoorView.cpp\ main.cpp HEADERS += \ @@ -96,7 +100,8 @@ HEADERS += \ VirtualTable/DataSource.h \ VirtualTable/SampleDataSource.h \ VirtualTable/VirtualTableModel.h \ - VirtualTable/VirtualTableView.h + VirtualTable/VirtualTableView.h\ + ParticleTimePoorView/ParticleTimePoorView.h FORMS += \ @@ -108,7 +113,9 @@ FORMS += \ ParticleCountPlotView/BatchEnergyScaleDialog.ui \ MeasureDeviceParamsCfgForm.ui \ NewMeasureAnalysisDlg.ui \ - ParticleInjectTimeView/ParticleInjectTimeAnalysisView.ui + ParticleInjectTimeView/ParticleInjectTimeAnalysisView.ui\ + ParticleTimePoorView/ParticleTimePoorView.ui +