EnergySpectrumAnalyer/src/DataProcessWorkPool.h
2026-07-16 17:54:53 +08:00

286 lines
9.7 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef DATAPROCESSWORKPOOL_H
#define DATAPROCESSWORKPOOL_H
#include <QRunnable>
#include <QString>
#include <QObject>
#include "AnalysisTypeDefine.h"
#include <QMap>
#include <QVariant>
#include <QEventLoop>
#include <array>
#include "GvfToCsv/GvfToCsv.h"
class EnergyScaleDataModel;
class MeasureAnalysisProjectModel;
struct ChannelSelectionData {
QString channelName; // 通道名,如"通道1"
QVector<int> x; // 框选范围内的道址
QVector<int> y; // 对应计数
};
namespace DataProcessWorkPool
{
class DataProcessTask : public QRunnable
{
public:
virtual QString GetTaskName() = 0;
void SetFinishedNotifier(QObject* finished_notifier, const char* finished_process, const QString& project_name);
const QString& GetProjectName() const;
const char* GetFinishedNotifierProcess() const;
QObject* GetFinishedNotifier() const;
virtual bool IsValidSetWorkParameters() const;
void StartTask();
virtual void run() override final;
protected:
void updateTaskResultData(const QVariant& task_result_data);
private:
virtual bool processTask() = 0;
private:
QObject* _finished_notifier { nullptr };
const char* _finished_notifier_process { nullptr };
QString _project_name;
QVariant _task_result_data;
};
class ParticleDataTask : public DataProcessTask
{
public:
void SetAllChannelParticleDataFilename(const QString& all_channel_particle_data_filename);
const QString& GetAllChannelParticleDataFilename() const;
virtual bool IsValidSetWorkParameters() const override;
private:
virtual bool processTask() final;
virtual bool processEveryChannelParticleData() = 0;
private:
QString _all_channel_particle_data_filename;
};
class EveryChannelParticleCountDataTask : public ParticleDataTask
{
public:
QString GetTaskName();
void SetAllChannelCountResultDir(const QString& dir_path);
const QString& GetAllChannelCountResultDir() const;
void SetEveryChannelCountResultDir(const QString&dir_path);
const QString& GetEveryChannelCountResultDir() const;
virtual bool IsValidSetWorkParameters() const;
private:
virtual bool processEveryChannelParticleData() override;
private:
QString _all_ch_count_dir;
QString _every_ch_count_dir;
};
class ParticleDataSortTask : public ParticleDataTask
{
public:
QString GetTaskName();
void SetSortedResultDir(const QString& sorted_result_dir);
const QString& GetSortedResultDir() const;
virtual bool IsValidSetWorkParameters() const override;
private:
virtual bool processEveryChannelParticleData() override;
private:
QString _sorted_result_dir;
};
class ParticleDataSortByMinimysTask : public ParticleDataSortTask
{
virtual bool processEveryChannelParticleData() override;
};
class CoincidenceEventAnalysisTask : public DataProcessTask
{
public:
QString GetTaskName();
private:
virtual bool processTask() override;
};
//自动寻峰
class AutoFindPeaksTask : public DataProcessTask
{
public:
QString GetTaskName();
void SetAnalysisType(AnalysisType analysis_type);
void SetDataFileList(const QMap<QString, QVariant>& data_files_set);
void SetResultDir(const QString& result_dir);
void SetFindPeakSetpWinWidth(int step_win_width);
virtual bool IsValidSetWorkParameters() const override;
private:
virtual bool processTask() override;
private:
AnalysisType _analysis_type;
QMap<QString, QVariant> _data_files_set;
QString _result_dir;
int _step_win_width = 7;
};
//手动寻峰
class ManualFindPeaksTask : public DataProcessTask
{
public:
QString GetTaskName();
void SetAnalysisType(AnalysisType analysis_type);
// void SetDataFileList(const QMap<QString, QVariant>& data_files_set);
void SetDataMap(const QMap<QString,ChannelSelectionData>& data_set);
void SetResultDir(const QString& result_dir);
void SetFindPeakSetpWinWidth(int step_win_width);
virtual bool IsValidSetWorkParameters() const override;
private:
virtual bool processTask() override;
private:
AnalysisType _analysis_type;
// QMap<QString, QVariant> _data_files_set;
QString _result_dir;
QMap<QString,ChannelSelectionData> _dataManual;
int _step_win_width = 7;
};
class ChannelEnergyScaleFittingTask : public DataProcessTask
{
public:
typedef QMap<QString, QMap<int, QList<double> > > FitDataMap;
public:
QString GetTaskName();
void SetData(const FitDataMap& channel_energy_scale_fit_data_map, const QMap<QString, int>& fit_degree_map);
void SetResultDir(const QString& result_dir);
virtual bool IsValidSetWorkParameters() const override;
private:
virtual bool processTask() override;
private:
QString _result_dir;
FitDataMap _channel_energy_scale_fit_data_map;
QMap<QString, int> _fit_degree_map;
};
class EnergyScaleParticleDataTask : public DataProcessTask
{
public:
QString GetTaskName();
private:
virtual bool processTask() override;
};
class EnergyCountProcessTask : public DataProcessTask
{
public:
QString GetTaskName();
private:
virtual bool processTask() override;
};
class EnergyScaleCoincidenceDataTask : public DataProcessTask
{
public:
QString GetTaskName();
private:
virtual bool processTask() override;
};
class EnergyScaleaAntiCoincidenceDataTask : public DataProcessTask
{
public:
QString GetTaskName();
private:
virtual bool processTask() override;
};
class GvfToCsvDataTask : public DataProcessTask
{
public:
QString GetTaskName() override;
void setGvfName(const QString& gvfName);
void setCsvName(const QString& csvName);
QString getError() const { return m_error; }
QString getResultCsvPath() const { return m_resultCsvPath; }
private:
bool processTask() override;
QString m_gvfName;
QString m_csvName;
QString m_resultCsvPath;
QString m_error;
bool m_conversionSuccess = false;
};
class RealtimeGvfDataWorker : public QObject
{
Q_OBJECT
public:
explicit RealtimeGvfDataWorker(QObject *parent = nullptr);
~RealtimeGvfDataWorker();
// 设置GVF解析器
void setGvfParser(GvfToCsv *parser);
// 同步初始计数数据(开始测量前调用一次)
void syncInitialData(
const QHash<uint, std::array<unsigned long long, 4096>> &addrCounts,
const QHash<uint, QHash<double, unsigned long long>> &energyCounts,
const QHash<double, unsigned long long> &allChannelEnergyCounts,
const QHash<uint, QString> &addrCountFilenames,
const QHash<uint, QString> &energyCountFilenames);
signals:
// 处理完成信号回到主线程更新UI
void particleDataWritten(); // 粒子数据CSV写入完成
void addressCountUpdated(); // 道址计数更新完成
void energyCountUpdated(); // 能量计数更新完成
void addressCountViewNeedRefresh(); // 需要刷新道址计数谱
void energyCountViewNeedRefresh(); // 需要刷新能量计数谱
// 道址计数有新通道文件生成(通知主线程更新项目模型和节点)
void newAddressCountChannelFile(uint channelNum, const QString &filename);
// 能量计数有新通道文件生成
void newEnergyCountChannelFile(uint channelNum, const QString &filename);
// 全通道能量计数文件更新
void allChannelEnergyCountFileUpdated(const QString &filename);
// 粒子能量数据写入完成(通知主线程更新节点状态)
void particleEnergyDataUpdated(const QString &energySpectrumFilename);
public slots:
// 处理一批GVF数据在子线程中执行
void processGvfData(const QByteArray &data,
const QString &projectDir,
const QString &energyScaleFilename,
const QString &projectName);
private:
void changeParticleData(QList<ParticleData> &dataList, const QString &projectDir);
void changeChannelParticleCount(QList<ParticleData> &data, const QString &projectDir);
void changeParticleEnergyData(QList<ParticleData> &dataList, const QString &projectDir,
const QString &energyScaleFilename, const QString &projectName);
void changeEnergyCountData(QList<ParticleData> &dataList, const QString &projectDir,
const QString &energyScaleFilename, const QString &projectName);
GvfToCsv *_gvfToCsv = nullptr;
// 通道道址计数缓存
QHash<uint, std::array<unsigned long long, 4096>> channel_address_counts;
// 通道能量计数缓存
QHash<uint, QHash<double, unsigned long long>> channel_energy_counts;
// 全通道能量计数缓存
QHash<double, unsigned long long> all_channel_energy_counts;
// 文件路径缓存
QHash<uint, QString> particle_count_filename_list;
QHash<uint, QString> energy_count_filename_list;
QMutex m_channelCountMutex;
QMutex m_energyDataMutex;
QMutex m_energyCountMutex;
};
}
#endif // DATAPROCESSWORKPOOL_H