#include "getTransmissionData.h" #include "getTransmissionData.cuh" #include "AuroraDefs.h" #include "CudaMatrix.h" #include "Function.h" #include "Function1D.h" #include "Function2D.h" #include "common/dataBlockCreation/removeDataFromArrays.h" #include "log/notify.h" #include "src//config/config.h" #include "src/common/getGeometryInfo.h" #include "src/common/temperatureCalculation/extractTasTemperature.h" #include "src/common/dataBlockCreation/getAScanBlockPreprocessed.h" #include "src/common/precalculateChannelList.h" #include "src/transmissionReconstruction/dataFilter/sensitivityCalculations.h" #include "src/transmissionReconstruction/dataFilter/estimateNoiseValueFromAScans.h" #include "Matrix.h" #include "Function3D.h" #include "transmissionReconstruction/dataFilter/dataFilter.h" #include "transmissionReconstruction/dataPreperation.h" #include "transmissionReconstruction/detection/detection.h" #include #include #include #include #include #include #include #include #include #include #include "Function1D.cuh" #include "Function2D.cuh" #include using namespace Recon; using namespace Aurora; namespace { struct BlockOfTransmissionData { Matrix tofData; Matrix attData; Matrix senderBlock; Matrix receiverBlock; Matrix waterTempBlock; MetaInfos metaInfos; CudaMatrix ascanBlock; CudaMatrix ascanBlockRef; Matrix dists; Matrix distRefBlock; Matrix waterTempRefBlock; }; std::map BLOCK_OF_TRANSIMISSIONDARA_BUFFER; std::mutex CREATE_BUFFER_MUTEX; std::condition_variable CREATE_BUFFER_CONDITION; std::mutex PROCESS_BUFFER_MUTEX; std::condition_variable PROCESS_BUFFER_CONDITION; int BUFFER_COUNT = 0; int BUFFER_SIZE = 4;//<=8 void printTime() { struct timeval tpend; gettimeofday(&tpend,NULL); int secofday = (tpend.tv_sec + 3600 * 8 ) % 86400; int hours = secofday / 3600; int minutes = (secofday - hours * 3600 ) / 60; int seconds = secofday % 60; int milliseconds = tpend.tv_usec/1000; std::cout<< hours << ":" < lock(CREATE_BUFFER_MUTEX); BLOCK_OF_TRANSIMISSIONDARA_BUFFER[std::to_string(aIndex)] = buffer; std::cout<<"Add: "< lock(CREATE_BUFFER_MUTEX); CREATE_BUFFER_CONDITION.wait(lock, []{return BUFFER_COUNT 2 % i.e. detection folder exists and is not empty // % Load transmission detection data // writeReconstructionLog('Loading transmission detection data. All available data from given motor positions are taken.', 1); // [tofDataTotal, attDataTotal, senderList, receiverList, waterTempList, dataInfo] = loadTransmissionDetectionData(transParams.pathSaveDetection, transParams.pathData, motorPos, expInfo.rootMeasUniqueID); TasTemps tasTemps; tasTemps.waterTempPreCalc_rl = extractTasTemperature(aTemp.tasTemperature, aRlList, aMotorPos, aTemp.jumoTemp, transParams::minTemperature, transParams::maxTemperature); tasTemps.waterTempPreCalc_sl = extractTasTemperature(aTemp.tasTemperature, aSlList, aMotorPos, aTemp.jumoTemp, transParams::minTemperature, transParams::maxTemperature); tasTemps.waterTempRefPreCalc_rl = extractTasTemperature(aTempRef.tasTemperature, aRlList, aMotoPosRef, aTempRef.jumoTemp, transParams::minTemperature, transParams::maxTemperature); tasTemps.waterTempRefPreCalc_sl = extractTasTemperature(aTempRef.tasTemperature, aSlList, aMotoPosRef, aTempRef.jumoTemp, transParams::minTemperature, transParams::maxTemperature); aGeom.sensData = precalcSensitivity(aSlList, aSnList, aRlList, aRnList, aMotorPos, aGeom); aGeomRef.sensData = aGeom.sensData; Matrix rmsNoise, rmsNoiseRef; if (transParams::applyCalib) { rmsNoise = estimateNoiseValueFromAScans(aSnList, aRnList, aGeom, aExpInfo, aParser); rmsNoiseRef = estimateNoiseValueFromAScans(aSnList, aRnList, aGeom, aExpInfo, aParserRef); } size_t numScans = aMotorPos.getDataSize() * aSlList.getDataSize() * aSnList.getDataSize() * aRlList.getDataSize() * aRnList.getDataSize(); Matrix tofDataTotal = Matrix::fromRawData(new float[numScans], 1, numScans) + NAN; Matrix attDataTotal = Matrix::fromRawData(new float[numScans], 1, numScans) + NAN; Matrix waterTempList = zeros(1,numScans,1); Matrix senderList = zeros(3,numScans,1); Matrix receiverList = zeros(3,numScans,1); Matrix snrValues = zeros(1,numScans,1); Matrix snrValuesRef = zeros(1,numScans,1); Matrix mpBlockTotal; Matrix slBlockTotal; Matrix snBlockTotal; Matrix rlBlockTotal; Matrix rnBlockTotal; if(transParams::saveDetection || transParams::outlierOnTasDetection || transParams::saveDebugInfomation) { mpBlockTotal = zeros(1,numScans,1); slBlockTotal = zeros(1,numScans,1); snBlockTotal = zeros(1,numScans,1); rlBlockTotal = zeros(1,numScans,1); rnBlockTotal = zeros(1,numScans,1); } std::thread speedUpThread = std::thread(createThreadForGetBlockOfTransmissionData,aMotorPos,aMotoPosRef,aSlList,aSnList,aRlList,aRnList,tasTemps,aTemp.expectedSOSWater,aGeom,aGeomRef,rmsNoise,rmsNoiseRef,aExpInfo,aExpInfoRef,aPreComputes,aParser, aParserRef); int numData = 0; int numPossibleScans = 0; sched_param sch; int policy; pthread_getschedparam(pthread_self(), &policy, &sch); sch.sched_priority = 50; if (pthread_setschedparam(pthread_self(), SCHED_FIFO, &sch)) { std::cerr << "Failed to set thread priority" << std::endl; } for(int i=0; i lock(PROCESS_BUFFER_MUTEX); PROCESS_BUFFER_CONDITION.wait(lock, [index]{return BLOCK_OF_TRANSIMISSIONDARA_BUFFER.find(std::to_string(index)) != BLOCK_OF_TRANSIMISSIONDARA_BUFFER.end();}); lock.unlock(); auto blockData = BLOCK_OF_TRANSIMISSIONDARA_BUFFER[std::to_string(index)]; cudaSetDevice(index % BUFFER_SIZE); DetectResult detect = transmissionDetection( blockData.ascanBlock, blockData.ascanBlockRef, blockData.dists.toDeviceMatrix(), blockData.distRefBlock.toDeviceMatrix(), blockData.waterTempBlock, blockData.waterTempRefBlock, aTemp.expectedSOSWater[0]); blockData.attData = detect.att; blockData.tofData = detect.tof; BlockOfTransmissionData transmissionBlock=blockData; size_t numUsedData = transmissionBlock.senderBlock.getDimSize(1); if(transParams::applyCalib) { cblas_scopy(numUsedData, transmissionBlock.metaInfos.snrValues.getData(), 1, snrValues.getData() + numData, 1); cblas_scopy(numUsedData, transmissionBlock.metaInfos.snrValuesRef.getData(), 1, snrValuesRef.getData() + numData, 1); } int rows = transmissionBlock.senderBlock.getDimSize(0); cblas_scopy(numUsedData * rows, transmissionBlock.senderBlock.getData(), 1, senderList.getData() + numData*rows, 1); cblas_scopy(numUsedData * rows, transmissionBlock.receiverBlock.getData(), 1, receiverList.getData() + numData*rows, 1); cblas_scopy(numUsedData, transmissionBlock.tofData.getData(), 1, tofDataTotal.getData() + numData, 1); cblas_scopy(numUsedData, transmissionBlock.attData.getData(), 1, attDataTotal.getData() + numData, 1); cblas_scopy(numUsedData, transmissionBlock.waterTempBlock.getData(), 1, waterTempList.getData() + numData, 1); // if(transParams::saveDetection || transParams::outlierOnTasDetection || transParams::saveDebugInfomation) // { // cblas_scopy(numUsedData, transmissionBlock.metaInfos.mpBlock.getData(), 1, mpBlockTotal.getData() + numData, 1); // cblas_scopy(numUsedData, transmissionBlock.metaInfos.slBlock.getData(), 1, slBlockTotal.getData() + numData, 1); // cblas_scopy(numUsedData, transmissionBlock.metaInfos.snBlock.getData(), 1, snBlockTotal.getData() + numData, 1); // cblas_scopy(numUsedData, transmissionBlock.metaInfos.rlBlock.getData(), 1, rlBlockTotal.getData() + numData, 1); // cblas_scopy(numUsedData, transmissionBlock.metaInfos.rnBlock.getData(), 1, rnBlockTotal.getData() + numData, 1); // } numData += numUsedData; std::unique_lock lockBufferCount(CREATE_BUFFER_MUTEX); BLOCK_OF_TRANSIMISSIONDARA_BUFFER.erase(std::to_string(index)); --BUFFER_COUNT; lockBufferCount.unlock(); std::cout<<"Remove: "<