209 lines
8.5 KiB
C++
209 lines
8.5 KiB
C++
|
|
#include "DataProcessWorkPool.h"
|
||
|
|
#include <QThreadPool>
|
||
|
|
#include <QDir>
|
||
|
|
#include "csv.hpp"
|
||
|
|
#include "MeasureAnalysisProjectModel.h"
|
||
|
|
#include "OutputInfoDefine.h"
|
||
|
|
|
||
|
|
using namespace DataProcessWorkPool;
|
||
|
|
|
||
|
|
void EveryChannelParticleDataTask::SetAllChannelParticleDataFilename(const QString& all_channel_particle_data_filename)
|
||
|
|
{
|
||
|
|
this->_all_channel_particle_data_filename = all_channel_particle_data_filename;
|
||
|
|
}
|
||
|
|
void EveryChannelParticleDataTask::SetFinishedNotifier(QObject* finished_notifier, const char* finished_process, const QString& project_name)
|
||
|
|
{
|
||
|
|
this->_finished_notifier = finished_notifier;
|
||
|
|
this->_finished_notifier_process = finished_process;
|
||
|
|
this->_project_name = project_name;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
const QString& EveryChannelParticleDataTask::GetAllChannelParticleDataFilename() const
|
||
|
|
{
|
||
|
|
return this->_all_channel_particle_data_filename;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
const QString& EveryChannelParticleDataTask::GetProjectName() const
|
||
|
|
{
|
||
|
|
return this->_project_name;
|
||
|
|
}
|
||
|
|
|
||
|
|
const char* EveryChannelParticleDataTask::GetFinishedNotifierProcess() const
|
||
|
|
{
|
||
|
|
return this->_finished_notifier_process;
|
||
|
|
}
|
||
|
|
|
||
|
|
QObject* EveryChannelParticleDataTask::GetFinishedNotifier() const
|
||
|
|
{
|
||
|
|
return this->_finished_notifier;
|
||
|
|
}
|
||
|
|
|
||
|
|
bool EveryChannelParticleDataTask::IsValidSetWorkParameters() const
|
||
|
|
{
|
||
|
|
return (!GetAllChannelParticleDataFilename().isEmpty()) &&
|
||
|
|
(GetFinishedNotifier() != nullptr) &&
|
||
|
|
(!GetProjectName().isEmpty()) &&
|
||
|
|
(GetFinishedNotifierProcess() != nullptr);
|
||
|
|
}
|
||
|
|
|
||
|
|
void EveryChannelParticleDataTask::StartTask()
|
||
|
|
{
|
||
|
|
QThreadPool::globalInstance()->start(this);
|
||
|
|
}
|
||
|
|
|
||
|
|
void EveryChannelParticleDataTask::run()
|
||
|
|
{
|
||
|
|
if (!IsValidSetWorkParameters()) {
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (!processEveryChannelParticleData()) {
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
QMetaObject::invokeMethod(_finished_notifier, _finished_notifier_process, Qt::QueuedConnection, Q_ARG(QString, _project_name));
|
||
|
|
}
|
||
|
|
|
||
|
|
bool EveryChannelParticleDataSeparateTask::processEveryChannelParticleData()
|
||
|
|
{
|
||
|
|
bool ret_ok = true;
|
||
|
|
const QString& result_data_output_dir_path = GetResultDataDir();
|
||
|
|
QDir result_data_output_dir(result_data_output_dir_path);
|
||
|
|
result_data_output_dir.mkpath(result_data_output_dir_path);
|
||
|
|
|
||
|
|
const QString& all_channel_particle_data_filename = GetAllChannelParticleDataFilename();
|
||
|
|
QMap<uint, QString> particle_data_filename_list;
|
||
|
|
|
||
|
|
try {
|
||
|
|
QMap<uint, std::shared_ptr<std::ofstream>> ch_particle_data_of_list;
|
||
|
|
|
||
|
|
csv::CSVFormat format;
|
||
|
|
format.delimiter(',').quote('"').trim({' ', '\t'}).variable_columns(csv::VariableColumnPolicy::THROW);
|
||
|
|
csv::CSVReader reader(all_channel_particle_data_filename.toStdString());
|
||
|
|
for (auto& row : reader) {
|
||
|
|
if (row.size() != 4) {
|
||
|
|
ret_ok = false;
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
uint board_id = row[0].get<uint>();
|
||
|
|
uint channel_id = row[1].get<uint>();
|
||
|
|
uint address = row[2].get<uint>();
|
||
|
|
unsigned long long time = row[3].get<unsigned long long>();
|
||
|
|
|
||
|
|
// 板卡和通道号计算,通道号 = 板卡号 * 4 + 通道号
|
||
|
|
int channel_num = (board_id) * 4 + (channel_id + 1);
|
||
|
|
QString particle_data_filename = result_data_output_dir.filePath(QString("ParticleData_ch_%1.csv").arg(channel_num));
|
||
|
|
if (!particle_data_filename_list.contains(channel_num)) {
|
||
|
|
particle_data_filename_list.insert(channel_num, particle_data_filename);
|
||
|
|
}
|
||
|
|
|
||
|
|
if ( !ch_particle_data_of_list.contains(channel_num) ) {
|
||
|
|
std::shared_ptr<std::ofstream> out(
|
||
|
|
new std::ofstream(particle_data_filename.toStdString(), std::ios::out | std::ios::app),
|
||
|
|
[](std::ofstream* p){p->close();}
|
||
|
|
);
|
||
|
|
*out << QStringLiteral(u"板卡号,通道号,地址,时间计数") << std::endl;
|
||
|
|
ch_particle_data_of_list.insert(channel_num, out);
|
||
|
|
}
|
||
|
|
auto ch_particle_data_of = ch_particle_data_of_list.value(channel_num);
|
||
|
|
auto writer = csv::make_csv_writer(*ch_particle_data_of);
|
||
|
|
writer << std::vector<std::string>{std::to_string(board_id), std::to_string(channel_id), std::to_string(address), std::to_string(time)};
|
||
|
|
}
|
||
|
|
} catch (const std::runtime_error& e) {
|
||
|
|
QString error = QString(QStringLiteral(u"处理%1发生运行时异常:%2")).arg(all_channel_particle_data_filename).arg(e.what());
|
||
|
|
LOG_ERROR(error)
|
||
|
|
ret_ok = false;
|
||
|
|
} catch (const std::exception& e) {
|
||
|
|
QString error = QString(QStringLiteral(u"处理%1异常:%2")).arg(all_channel_particle_data_filename).arg(e.what());
|
||
|
|
LOG_ERROR(error)
|
||
|
|
ret_ok = false;
|
||
|
|
} catch (...) {
|
||
|
|
QString error = QString(QStringLiteral(u"处理%1未知异常.")).arg(all_channel_particle_data_filename);
|
||
|
|
LOG_ERROR(error)
|
||
|
|
ret_ok = false;
|
||
|
|
}
|
||
|
|
|
||
|
|
const QString& project_name = GetProjectName();
|
||
|
|
MeasureAnalysisProjectModel* project_model = MeasureAnalysisProjectModelList::GetProjectModel(project_name);
|
||
|
|
if (project_model == nullptr) {
|
||
|
|
ret_ok = false;
|
||
|
|
}
|
||
|
|
for (auto it = particle_data_filename_list.begin(); it != particle_data_filename_list.end(); ++it) {
|
||
|
|
project_model->SetChannelParticleDataFilename(it.key(), it.value());
|
||
|
|
}
|
||
|
|
|
||
|
|
return ret_ok;
|
||
|
|
}
|
||
|
|
|
||
|
|
bool EveryChannelParticleCountDataTask::processEveryChannelParticleData()
|
||
|
|
{
|
||
|
|
bool ret_ok = true;
|
||
|
|
const QString& result_data_output_dir_path = GetResultDataDir();
|
||
|
|
QDir result_data_output_dir(result_data_output_dir_path);
|
||
|
|
result_data_output_dir.mkpath(result_data_output_dir_path);
|
||
|
|
|
||
|
|
const QString& all_channel_particle_data_filename = GetAllChannelParticleDataFilename();
|
||
|
|
QMap<uint, QString> particle_data_filename_list;
|
||
|
|
|
||
|
|
try {
|
||
|
|
QMap<uint, std::shared_ptr<std::ofstream>> ch_particle_data_of_list;
|
||
|
|
|
||
|
|
csv::CSVFormat format;
|
||
|
|
format.delimiter(',').quote('"').trim({' ', '\t'}).variable_columns(csv::VariableColumnPolicy::THROW);
|
||
|
|
csv::CSVReader reader(all_channel_particle_data_filename.toStdString());
|
||
|
|
for (auto& row : reader) {
|
||
|
|
if (row.size() != 4) {
|
||
|
|
ret_ok = false;
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
uint board_id = row[0].get<uint>();
|
||
|
|
uint channel_id = row[1].get<uint>();
|
||
|
|
uint address = row[2].get<uint>();
|
||
|
|
unsigned long long time = row[3].get<unsigned long long>();
|
||
|
|
|
||
|
|
// 板卡和通道号计算,通道号 = 板卡号 * 4 + 通道号
|
||
|
|
int channel_num = (board_id) * 4 + (channel_id + 1);
|
||
|
|
QString particle_data_filename = result_data_output_dir.filePath(QString("ParticleCountData_ch_%1.csv").arg(channel_num));
|
||
|
|
if (!particle_data_filename_list.contains(channel_num)) {
|
||
|
|
particle_data_filename_list.insert(channel_num, particle_data_filename);
|
||
|
|
}
|
||
|
|
|
||
|
|
if ( !ch_particle_data_of_list.contains(channel_num) ) {
|
||
|
|
std::shared_ptr<std::ofstream> out(
|
||
|
|
new std::ofstream(particle_data_filename.toStdString(), std::ios::out | std::ios::app),
|
||
|
|
[](std::ofstream* p){p->close();}
|
||
|
|
);
|
||
|
|
ch_particle_data_of_list.insert(channel_num, out);
|
||
|
|
}
|
||
|
|
auto ch_particle_data_of = ch_particle_data_of_list.value(channel_num);
|
||
|
|
auto writer = csv::make_csv_writer(*ch_particle_data_of);
|
||
|
|
writer << std::vector<std::string>{std::to_string(board_id), std::to_string(channel_id), std::to_string(address), std::to_string(time)};
|
||
|
|
}
|
||
|
|
} catch (const std::runtime_error& e) {
|
||
|
|
QString error = QString(QStringLiteral(u"处理%1发生运行时异常:%2")).arg(all_channel_particle_data_filename).arg(e.what());
|
||
|
|
LOG_ERROR(error)
|
||
|
|
ret_ok = false;
|
||
|
|
} catch (const std::exception& e) {
|
||
|
|
QString error = QString(QStringLiteral(u"处理%1异常:%2")).arg(all_channel_particle_data_filename).arg(e.what());
|
||
|
|
LOG_ERROR(error)
|
||
|
|
ret_ok = false;
|
||
|
|
} catch (...) {
|
||
|
|
QString error = QString(QStringLiteral(u"处理%1未知异常.")).arg(all_channel_particle_data_filename);
|
||
|
|
LOG_ERROR(error)
|
||
|
|
ret_ok = false;
|
||
|
|
}
|
||
|
|
|
||
|
|
const QString& project_name = GetProjectName();
|
||
|
|
MeasureAnalysisProjectModel* project_model = MeasureAnalysisProjectModelList::GetProjectModel(project_name);
|
||
|
|
if (project_model == nullptr) {
|
||
|
|
ret_ok = false;
|
||
|
|
}
|
||
|
|
for (auto it = particle_data_filename_list.begin(); it != particle_data_filename_list.end(); ++it) {
|
||
|
|
project_model->SetChannelParticleDataFilename(it.key(), it.value());
|
||
|
|
}
|
||
|
|
|
||
|
|
return ret_ok;
|
||
|
|
}
|