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
|