AnalysisSystemForRadionucli.../DataStore.h
2024-06-04 15:25:02 +08:00

184 lines
6.7 KiB
C++
Raw Permalink 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.

/* 数据存储和处理类
*
* 存储内容有:
* 1、当前分析的谱文件指针
* 2、比较谱计数数组
* 3、用户核素库
* 4、用户核素射线信息
* 5、曲线颜色信息
* 6、用户数据库登录信息
*
* 处理信息有:
* 1、各曲线数据的生成
* 2、分析结果保存到本地文件
* 3、分析结果保存到数据库
*/
#ifndef DATASTORE_H
#define DATASTORE_H
#include <QSqlQuery>
#include "GammaAnalyAlgLib.h"
#include <QDebug>
#include <QFile>
using namespace std;
class AnalyseFlow;
#define SOFT_NAME QLatin1String("armd")
#ifdef Q_OS_UNIX
#define STRING_END QLatin1String("\n")
#else
#define STRING_END QLatin1String("\r\n")
#endif
#define T_NUL_LIB_LOCAL QLatin1String("libdata")
#define T_NUL_LINE_LOCAL QLatin1String("lines")
#define T_RELEVANT_LOCAL QLatin1String("relevant")
#define T_NUL_LIB_REMOTE QLatin1String("CONFIGURATION.GARDS_NUCL_LIB")
#define T_NUL_LINE_REMOTE QLatin1String("CONFIGURATION.GARDS_NUCL_LINES_LIB")
#define T_RELEVANT_REMOTE QLatin1String("CONFIGURATION.GARDS_RELEVANT_NUCLIDE")
#define CHANNEL "channel"
#define ENERGY "energy"
#define ENERGY_CAL QLatin1String("energy")
#define EFFICIENCY_CAL QLatin1String("efficiency")
#define RESOLUTION_CAL QLatin1String("Resolution")
#define TOTALEFFICIENCY_CAL QLatin1String("TotalEfficiency")
enum LineColorIndex{
Color_spec, // [0]:原谱曲线颜色
Color_peak, // [1]:拟合峰曲线颜色
Color_lc, // [2]:LC曲线颜色
Color_base, // [3]:BaseLine
Color_scac, // [4]:SCac曲线颜色
Color_compare, // [5]:比较谱曲线颜色
Color_fitbase, // [6]:拟合基线颜色
Color_Strip, // [7]:两谱和曲线
};
typedef void(*ThrCallBack)();
class DataStore : public QObject
{
Q_OBJECT
public:
~DataStore();
// 调用算法分析谱数据
bool AnalyseData(QString strPath, ThrCallBack callFuc);
/* 判断该谱的分析参数是否改变,返回
* 0 --> 未改变,不需要重新分析
* 1 --> 分析参数、能量刻度、分辨率刻度中的一项或多项发生改变,需从头开始分析
* -1 --> 效率刻度改变,从核素识别开始需重新分析 */
int SettingChanged(PHDFile *phd);
// 加载比较谱数据
bool LoadCompareData(QString filepath);
void SetPHD(PHDFile *phd); // 设置当前谱文件
void SetQuery(const QSqlQuery &query, bool bRemote = false);
// 从数据查询核素识别中所需的核素射线信息
QMap<QString, NuclideLines> GetNuclideLines(const QStringList nuclideList);
// 获取当前谱的核素射线信息
QMap<QString, NuclideLines> GetNuclideLines();
// 由能量求对应道默认从数组下标0开始
int GetChannelByEnergy(double energy, int startIndex = 0);
// 由道求能量,主要用于非整数道
double GetEnergyByFloatChan(double x);
// 返回对应道上的峰序号,若无则返回-1
int FindNearPeak(const vector<PeakInfo> &vPeak, int channel, bool *bFind = 0);
// 根据道channel或能量energy获取重要性因子
double GetSignificance(int channel);
double GetSignificance(double energy);
// 得到主界面中Detailed Information中的数据
QVector<QString> DetailedInfo();
/** *********************************************** 分析结果存储相关函数 **************************************************** **/
// 根据提供的路径path生成IMS2.0格式的谱文件成功返回true失败返回false
bool SavePHD(PHDFile* phd, const QString &path);
// 以 format 指定的格式,保存分析结果到指定路径 path成功返回true失败返回false
bool SaveResultToFile(PHDFile* phd, const QString &path, QString format);
/* 保存分析到数据库
* @param paths保存失败保存成功依次存储 Lc、Scac、Baseline、Spectrum 在 Ftp 服务器端的文件名称)
* 当 Spectrum 已存在于数据时paths 中只有前三项,没有 Spectrum 文件名称 */
bool SaveResultToDB(PHDFile* phd, QStringList &paths);
// 生成IMS2.0格式的谱文件内容
static QString MakeUpSpectrum(PHDFile *phd);
/* 生成基线控制点信息内容,共六个部分:
* 1、#AnalyseRange一行用空格隔开的两个数值
* 2、#XCtrl多行每行五个数值
* 3、#YCtrl多行每行五个数值
* 4、#YSlope多行每行五个数值
* 5、#Baseline多行每行五个数值
* 6、#StepCounts多行每行五个数值
* 每个部分以‘#’跟对应的字符串开始,下一行为该部分的内容 */
static QString BaseCtrlToString(const BaseControls &baseCtrl);
/* 将数组以固定格式组合成字符串
* 字符串首行为‘#号跟type指示的字符串
* 第二行开始,每行五个数值 */
static QString LcScacToString(const stdvec &vData, QString type);
// 获取谱文件 phd 的交互分析报告内容bLog为false或交互分析日志内容bLog为true
static QString GetReportContent(PHDFile *phd, bool bLog = false);
/** ******************************************************** 曲线点集计算 ******************************************************* **/
/* @return 峰点集的集合,每个峰一个点集
* @param vecPeak峰信息列表
* @param vBase全谱基线
* @param color峰曲线的颜色
* @param start曲线开始道
* @param end曲线结束道
* @param bEnergytrue以Energy为横坐标false以Channel为横坐标 */
private:
DataStore();
public:
QSqlQuery m_query; // 用于数据库查询
PHDFile* m_phd; // 当前谱文件指针
bool m_bFromDB; // 是否来自远程数据库
bool m_bRewriteAll; // 写文件时,是否覆盖所有文件
int m_nCount; // 当前谱总道数
int m_nSChan; // 当前谱开始道
double m_dStep; // 峰曲线光滑处理时每隔 m_dStep 道取一个点
stdvec m_vCount; // 当前谱计数
QVector<long> m_vecCompare; // 比较谱计数
QString m_analyst; // 分析员名称
QString m_userId; // 分析员ID
QString m_roleId; // 分析员角色ID
QStringList m_userlib; // 当前谱用户核素库
QStringList m_userlib_P; // P 类型谱用户核素库
QStringList m_userlib_G; // G 类型谱用户核素库
QMap<QString, NuclideLines> m_mapNucLineP; // 存储 P 类型谱用户核素射线能量
QMap<QString, NuclideLines> m_mapNucLineG; // 存储 G 类型谱用户核素射线能量
static DataStore* m_dataStore; // 数据存储和处理类指针
static DataStore *GetDataStore();
};
#endif // DATASTORE_H