#include "DetectorApp.h" #include #include #include "yaml-cpp/yaml.h" DetectorApp::DetectorApp() : m_resources(nullptr) { } DetectorApp::~DetectorApp() { for(std::size_t i=0; i(); m_outputFileName = data["OutputDataFile"].as(); m_deadChannelFileName = data["DeadChannelFile"].as(); m_nthreads = data["NumberOfThreads"].as(); ArrayType type = StringToArrayType(data["ArrayType"].as()); std::cout << "Creating " << m_nthreads << " detector arrays..." << std::endl; for(uint64_t i=0; iSetDeadChannelMap(m_deadChannelFileName); } std::cout << "Allocating " << m_nthreads << " threads..." << std::endl; m_resources = std::make_unique>(m_nthreads); std::cout << "Opening input data file " << m_inputFileName << "..." << std::endl; m_fileReader.Open(m_inputFileName, "SimTree"); if(!m_fileReader.IsOpen() || !m_fileReader.IsTree()) { std::cerr << "Unable to open input data file " << m_inputFileName << std::endl; return false; } m_nentries = m_fileReader.GetSize(); std::cout << "Detected " << m_nentries << " events in the file..." << std::endl; //Little bit of integer division mangling to make sure we read every event in file uint64_t quotient = m_nentries / m_nthreads; uint64_t remainder = m_nentries % m_nthreads; m_chunkSamples.push_back(quotient + remainder); for(uint64_t i=1; i> junk >> m_inputFileName; input >> junk >> m_outputFileName; input >> junk >> m_deadChannelFileName; input >> junk >> m_nthreads; input >> junk >> typeName; std::cout << "Creating " << m_nthreads << " detector arrays..." << std::endl; ArrayType type = StringToArrayType(typeName); for(uint64_t i=0; iSetDeadChannelMap(m_deadChannelFileName); } std::cout << "Done" << std::endl; std::cout << "Allocating " << m_nthreads << " threads..." << std::endl; m_resources = std::make_unique>(m_nthreads); std::cout << "Done" << std::endl; std::cout << "Opening input data file " << m_inputFileName << "..." << std::endl; m_fileReader.Open(m_inputFileName, "SimTree"); if(!m_fileReader.IsOpen() || !m_fileReader.IsTree()) { std::cerr << "Unable to open input data file " << m_inputFileName << std::endl; return false; } m_nentries = m_fileReader.GetSize(); std::cout << "Done. Detected " << m_nentries << " events in the file." << std::endl; //Little bit of integer division mangling to make sure we read every event in file uint64_t quotient = m_nentries / m_nthreads; uint64_t remainder = m_nentries % m_nthreads; m_chunkSamples.push_back(quotient + remainder); for(uint64_t i=1; iPushJob({[this](DetectorArray* array, uint64_t chunkSamples) { if(system == nullptr) return; std::vector data; DetectorResult result; for(uint64_t i=0; iIsDetected(nucleus); if(result.detectFlag) { nucleus.isDetected = true; nucleus.detectedKE = result.energy_deposited; nucleus.detectedTheta = result.direction.Theta(); nucleus.detectedPhi = result.direction.Phi(); nucleus.detectedPos = result.direction; } } m_fileWriter.PushData(data); } }, {m_detectorList[i], m_chunkSamples[i]} //arguments to function, in order } ); } uint64_t size = m_fileReader.GetSize(); uint64_t count = 0; double percent = 0.05; uint64_t flushVal = size*percent; uint64_t flushCount = 0; while(true) { if(count == flushVal) { count = 0; ++flushCount; std::cout<<"\rPercent of data written to disk: "<IsFinished() && m_fileWriter.GetQueueSize() == 0) break; else if(m_fileWriter.Write()) ++count; } std::cout << std::endl; }