#include "DataProcessWorkPool.h" #include #include #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 particle_data_filename_list; try { QMap> 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 channel_id = row[1].get(); uint address = row[2].get(); unsigned long long time = row[3].get(); // 板卡和通道号计算,通道号 = 板卡号 * 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 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::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 particle_data_filename_list; try { QMap> 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 channel_id = row[1].get(); uint address = row[2].get(); unsigned long long time = row[3].get(); // 板卡和通道号计算,通道号 = 板卡号 * 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 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::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; }