#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); plot->setAxisTitle(QwtPlot::xBottom, "粒子序号"); plot->setAxisTitle(QwtPlot::yLeft, "粒子时间"); 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); if (!ok) { qWarning() << "道址格式错误,行" << rec.dEnergy << lineNumber; continue; } rec.dTime = fields[3].toLongLong(&ok); if (!ok) { qWarning() << "时间计数格式错误,行" << fields[3] << rec.dTime <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, QString(QStringLiteral(u"道址"))); plot->setAxisTitle(QwtPlot::yLeft, QString(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); }