184 lines
6.7 KiB
C++
184 lines
6.7 KiB
C++
/* 数据存储和处理类
|
||
*
|
||
* 存储内容有:
|
||
* 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 bEnergy:true,以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
|