diff --git a/src/CountRateAnalysis/CountRateAnalysis.cpp b/src/CountRateAnalysis/CountRateAnalysis.cpp new file mode 100644 index 0000000..bf3b372 --- /dev/null +++ b/src/CountRateAnalysis/CountRateAnalysis.cpp @@ -0,0 +1,177 @@ +#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 new file mode 100644 index 0000000..eec4efa --- /dev/null +++ b/src/CountRateAnalysis/CountRateAnalysis.h @@ -0,0 +1,42 @@ +#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 new file mode 100644 index 0000000..46a4ac1 --- /dev/null +++ b/src/CountRateAnalysis/CountRateAnalysis.ui @@ -0,0 +1,184 @@ + + + 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/MeasureAnalysisTreeView.cpp b/src/MeasureAnalysisTreeView.cpp index 1dd0cb4..e6327f8 100644 --- a/src/MeasureAnalysisTreeView.cpp +++ b/src/MeasureAnalysisTreeView.cpp @@ -131,6 +131,15 @@ void MeasureAnalysisTreeView::onNodeDoubleClicked(const QModelIndex& index) } } } break; + case AnalysisType::CountingRateView: { + MeasureAnalysisProjectModel* project_model = _model->GetProjectModel(project_name); + if (project_model) { + auto file_name = project_model->GetParticleEnergyDataFilename(); + 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 64f4518..7bc8acb 100644 --- a/src/MeasureAnalysisView.cpp +++ b/src/MeasureAnalysisView.cpp @@ -3,7 +3,7 @@ #include "MeasureAnalysisDataTableView.h" #include "MeasureAnalysisParticleCountPlotView.h" #include "ParticleInjectTimeAnalysis.h" - +#include "CountRateAnalysis.h" MeasureAnalysisView *MeasureAnalysisView::NewAnalyzeView(AnalysisType view_type) { MeasureAnalysisView* new_view = nullptr; @@ -65,8 +65,8 @@ MeasureAnalysisView *MeasureAnalysisView::NewAnalyzeView(AnalysisType view_type) // new_view->setDeleteOnClose(false); } break; case AnalysisType::CountingRateView: { - // new_view = new MeasureAnalysisDataTableView; - // new_view->setDeleteOnClose(false); + new_view = new CountRateAnalysis; + new_view->setDeleteOnClose(false); } break; case AnalysisType::EnergyPeakFitView: { // new_view = new MeasureAnalysisDataTableView; diff --git a/src/MeasureAnalysisView.h b/src/MeasureAnalysisView.h index 0ec0265..2785aff 100644 --- a/src/MeasureAnalysisView.h +++ b/src/MeasureAnalysisView.h @@ -8,6 +8,14 @@ #include #include "AnalysisTypeDefine.h" +typedef struct ParticleInjectTime +{ + int bd; + int ch; + double dTime; + int index; + double dEnergy; +} PARTICLEINJECTTIME; class MeasureAnalysisView : public QWidget { Q_OBJECT diff --git a/src/ParticleInjectTimeView/ParticleInjectTimeAnalysis.cpp b/src/ParticleInjectTimeView/ParticleInjectTimeAnalysis.cpp index dd36bb1..ff17bed 100644 --- a/src/ParticleInjectTimeView/ParticleInjectTimeAnalysis.cpp +++ b/src/ParticleInjectTimeView/ParticleInjectTimeAnalysis.cpp @@ -73,8 +73,7 @@ void ParticleInjectTimeAnalysis::setData(QVector data) // 设置坐标轴范围和标题 // plot->setAxisScale(QwtPlot::xBottom, 0, x.last()); // plot->setAxisScale(QwtPlot::yLeft,minValue , maxValue); - plot->setAxisTitle(QwtPlot::xBottom, "粒子序号"); - plot->setAxisTitle(QwtPlot::yLeft, "粒子时间"); + LOG_INFO(QStringLiteral(u"%1数据读取完毕.").arg(this->GetViewName())); // 刷新绘图 @@ -125,11 +124,7 @@ QVector ParticleInjectTimeAnalysis::getParticleInjectTimeDat ParticleInjectTime rec; rec.index = lineNumber; rec.dEnergy = fields[2].toDouble(&ok); - if (!ok) { qWarning() << "道址格式错误,行" << rec.dEnergy << lineNumber; continue; } rec.dTime = fields[3].toLongLong(&ok); - - if (!ok) { qWarning() << "时间计数格式错误,行" << fields[3] << rec.dTime <(plot->canvas()); canvas->setFrameStyle(QFrame::NoFrame); - plot->setAxisTitle(QwtPlot::xBottom, QString(QStringLiteral(u"道址"))); - plot->setAxisTitle(QwtPlot::yLeft, QString(QStringLiteral(u"计数"))); + 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); @@ -161,10 +156,10 @@ void ParticleInjectTimeAnalysis::setupPlot() plot->enableAxis(QwtPlot::xBottom); plot->enableAxis(QwtPlot::yLeft); - // 设置QWT图例 - QwtLegend* legend = new QwtLegend(); - legend->setDefaultItemMode(QwtLegendData::ReadOnly); - plot->insertLegend(legend, QwtPlot::RightLegend); +// // 设置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 index 8d6d341..e5976f1 100644 --- a/src/ParticleInjectTimeView/ParticleInjectTimeAnalysis.h +++ b/src/ParticleInjectTimeView/ParticleInjectTimeAnalysis.h @@ -8,14 +8,6 @@ #include #include "MeasureAnalysisView.h" -typedef struct ParticleInjectTime -{ - int bd; - int ch; - double dTime; - int index; - double dEnergy; -} PARTICLEINJECTTIME; namespace Ui { class ParticleInjectTimeAnalysis; diff --git a/src/src.pro b/src/src.pro index cc96c2b..6b7820a 100644 --- a/src/src.pro +++ b/src/src.pro @@ -32,11 +32,14 @@ UI_DIR = $${BUILD_UI}/$${TARGET}/ui INCLUDEPATH += \ $${PWD}/MeasureAnalysisParticleCountPlotView \ - $${PWD}/ParticleInjectTimeView + $${PWD}/ParticleInjectTimeView \ + $${PWD}/CountRateAnalysis DEPENDPATH += \ $${PWD}/MeasureAnalysisParticleCountPlotView \ - $${PWD}/ParticleInjectTimeView + $${PWD}/ParticleInjectTimeView\ + $${PWD}/CountRateAnalysis + SOURCES += \ AboutDlg.cpp \ @@ -60,6 +63,7 @@ SOURCES += \ VirtualTable/VirtualTableModel.cpp \ VirtualTable/VirtualTableView.cpp \ ParticleInjectTimeView/ParticleInjectTimeAnalysis.cpp\ + CountRateAnalysis/CountRateAnalysis.cpp\ main.cpp HEADERS += \ @@ -86,7 +90,9 @@ HEADERS += \ VirtualTable/SampleDataSource.h \ VirtualTable/VirtualTableModel.h \ VirtualTable/VirtualTableView.h \ - ParticleInjectTimeView/ParticleInjectTimeAnalysis.h + ParticleInjectTimeView/ParticleInjectTimeAnalysis.h\ + CountRateAnalysis/CountRateAnalysis.h + FORMS += \ AboutDlg.ui \ @@ -96,6 +102,8 @@ FORMS += \ MeasureAnalysisParticleCountPlotView/BatchEnergyScaleDialog.ui \ MeasureDeviceParamsCfgForm.ui \ NewMeasureAnalysisDlg.ui\ - ParticleInjectTimeView/ParticleInjectTimeAnalysis.ui + ParticleInjectTimeView/ParticleInjectTimeAnalysis.ui\ + CountRateAnalysis/CountRateAnalysis.ui +