/* 数据存储和处理类 * * 存储内容有: * 1、当前分析的谱文件指针 * 2、比较谱计数数组 * 3、用户核素库 * 4、用户核素射线信息 * 5、曲线颜色信息 * 6、用户数据库登录信息 * * 处理信息有: * 1、各曲线数据的生成 * 2、分析结果保存到本地文件 * 3、分析结果保存到数据库 */ #ifndef DATASTORE_H #define DATASTORE_H #include #include "GammaAnalyAlgLib.h" #include #include 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 GetNuclideLines(const QStringList nuclideList); // 获取当前谱的核素射线信息 QMap GetNuclideLines(); // 由能量求对应道,默认从数组下标0开始 int GetChannelByEnergy(double energy, int startIndex = 0); // 由道求能量,主要用于非整数道 double GetEnergyByFloatChan(double x); // 返回对应道上的峰序号,若无则返回-1 int FindNearPeak(const vector &vPeak, int channel, bool *bFind = 0); // 根据道(channel)或能量(energy)获取重要性因子 double GetSignificance(int channel); double GetSignificance(double energy); // 得到主界面中Detailed Information中的数据 QVector 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 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 m_mapNucLineP; // 存储 P 类型谱用户核素射线能量 QMap m_mapNucLineG; // 存储 G 类型谱用户核素射线能量 static DataStore* m_dataStore; // 数据存储和处理类指针 static DataStore *GetDataStore(); }; #endif // DATASTORE_H