141 lines
3.7 KiB
C++
141 lines
3.7 KiB
C++
|
|
#include "ParticleInjectTimeAnalysis.h"
|
|||
|
|
#include "ui_ParticleInjectTimeAnalysis.h"
|
|||
|
|
#include <QVBoxLayout>
|
|||
|
|
#include <QPushButton>
|
|||
|
|
#include <QMessageBox>
|
|||
|
|
#include <QwtPlotCurve>
|
|||
|
|
#include <QwtPlotMarker>
|
|||
|
|
#include <QwtPlotZoneItem>
|
|||
|
|
#include <QwtText>
|
|||
|
|
#include <cmath>
|
|||
|
|
#include <QtMath>
|
|||
|
|
#include "CustomQwtPlot.h"
|
|||
|
|
#include <QDebug>
|
|||
|
|
ParticleInjectTimeAnalysis::ParticleInjectTimeAnalysis(QWidget *parent) :
|
|||
|
|
MeasureAnalysisView(parent),
|
|||
|
|
ui(new Ui::ParticleInjectTimeAnalysis)
|
|||
|
|
{
|
|||
|
|
ui->setupUi(this);
|
|||
|
|
InitUi();
|
|||
|
|
// 获取当前可执行文件的路径
|
|||
|
|
QString Path = QCoreApplication::applicationDirPath();
|
|||
|
|
m_AllData = getParticleInjectTimeData(Path + "/data.csv");
|
|||
|
|
setData(m_AllData);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
ParticleInjectTimeAnalysis::~ParticleInjectTimeAnalysis()
|
|||
|
|
{
|
|||
|
|
delete ui;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void ParticleInjectTimeAnalysis::InitViewWorkspace(const QString &project_name)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void ParticleInjectTimeAnalysis::SetAnalyzeDataFilename(const QMap<QString, QVariant> &data_files_set)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void ParticleInjectTimeAnalysis::setData(QVector<ParticleInjectTime> data)
|
|||
|
|
{
|
|||
|
|
int energyStart = ui->label_energyStart->text().toInt();
|
|||
|
|
int energyEnd = ui->label_energyEnd->text().toInt();
|
|||
|
|
|
|||
|
|
QVector<double> x;
|
|||
|
|
QVector<double> 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, "粒子时间");
|
|||
|
|
|
|||
|
|
// 刷新绘图
|
|||
|
|
plot->replot();
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
QVector<ParticleInjectTime> ParticleInjectTimeAnalysis::getParticleInjectTimeData(QString path)
|
|||
|
|
{
|
|||
|
|
QVector<ParticleInjectTime> 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 <<lineNumber; continue; }
|
|||
|
|
|
|||
|
|
records.append(rec);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
file.close();
|
|||
|
|
return records;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void ParticleInjectTimeAnalysis::InitUi()
|
|||
|
|
{
|
|||
|
|
plot = new CustomQwtPlot();
|
|||
|
|
plot->SetXaxisDragScale(true);
|
|||
|
|
ui->verticalLayout->addWidget(plot);
|
|||
|
|
}
|