#include "getTransmissionData.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 using namespace Recon; using namespace Aurora; namespace { struct BlockOfTransmissionData { Matrix tofData; Matrix attData; Matrix senderBlock; Matrix receiverBlock; Matrix waterTempBlock; MetaInfos metaInfos; Matrix ascanBlock; Matrix 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 = 3; Matrix prepareAScansForTransmissionDetection(const Matrix& aAscanBlock, const Matrix& aGainBlock) { Matrix result = aAscanBlock / repmat(aGainBlock, aAscanBlock.getDimSize(0), 1); result = result - repmat(mean(result,FunctionDirection::Column), result.getDimSize(0), 1); return result; } BlockOfTransmissionData getBlockOfTransmissionData(const Matrix& aMp, const Matrix& aMpRef, const Matrix& aSl, const Matrix& aSn, const Matrix& aRlList, const Matrix& aRnList, const TasTemps& aTasTemps, const Matrix& aExpectedSOSWater, GeometryInfo aGeom, GeometryInfo& aGeomRef, const Matrix& aSnrRmsNoise, const Matrix& aSnrRmsNoiseRef, const MeasurementInfo& aExpInfo, const MeasurementInfo& aExpInfoRef, const PreComputes& aPreComputes, Parser* aParser, Parser* aParserRef) { BlockOfTransmissionData result; MetaInfos metaInfos; auto blockData = getAscanBlockPreprocessed(aParser, aMp, aSl, aSn, aRlList, aRnList, aGeom, aExpInfo, true, true); auto blockDataRef = getAscanBlockPreprocessed(aParserRef, aMpRef, aSl, aSn, aRlList, aRnList, aGeomRef, aExpInfoRef, true, true); Matrix ascanBlock = prepareAScansForTransmissionDetection(blockData.ascanBlockPreprocessed, blockData.gainBlock); Matrix ascanBlockRef = prepareAScansForTransmissionDetection(blockDataRef.ascanBlockPreprocessed, blockDataRef.gainBlock); blockData.ascanBlockPreprocessed = Matrix(); blockDataRef.ascanBlockPreprocessed = Matrix(); if(aExpInfo.Hardware == "USCT3dv3") { Matrix channelList = precalculateChannelList(aRlList, aRnList, aExpInfo, aPreComputes); double* channelListSizeData = Aurora::malloc(2); channelListSizeData[0] = channelList.getDimSize(0); channelListSizeData[1] = channelList.getDimSize(1); Matrix channelListSize = Matrix::New(channelListSizeData, 2, 1); Matrix ind = sub2ind(channelListSize, {blockData.rlBlock, blockData.rnBlock}); size_t channelListBlockSize = ind.getDataSize(); double* channelListBlockData = Aurora::malloc(channelListBlockSize); for(size_t i=0; i 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 double[numScans], 1, numScans) + NAN; Matrix attDataTotal = Matrix::fromRawData(new double[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)]; DetectResult detect = transmissionDetection( blockData.ascanBlock, blockData.ascanBlockRef, blockData.dists, blockData.distRefBlock, 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_dcopy(numUsedData, transmissionBlock.metaInfos.snrValues.getData(), 1, snrValues.getData() + numData, 1); cblas_dcopy(numUsedData, transmissionBlock.metaInfos.snrValuesRef.getData(), 1, snrValuesRef.getData() + numData, 1); } int rows = transmissionBlock.senderBlock.getDimSize(0); cblas_dcopy(numUsedData * rows, transmissionBlock.senderBlock.getData(), 1, senderList.getData() + numData*rows, 1); cblas_dcopy(numUsedData * rows, transmissionBlock.receiverBlock.getData(), 1, receiverList.getData() + numData*rows, 1); cblas_dcopy(numUsedData, transmissionBlock.tofData.getData(), 1, tofDataTotal.getData() + numData, 1); cblas_dcopy(numUsedData, transmissionBlock.attData.getData(), 1, attDataTotal.getData() + numData, 1); cblas_dcopy(numUsedData, transmissionBlock.waterTempBlock.getData(), 1, waterTempList.getData() + numData, 1); if(transParams::saveDetection || transParams::outlierOnTasDetection || transParams::saveDebugInfomation) { cblas_dcopy(numUsedData, transmissionBlock.metaInfos.mpBlock.getData(), 1, mpBlockTotal.getData() + numData, 1); cblas_dcopy(numUsedData, transmissionBlock.metaInfos.slBlock.getData(), 1, slBlockTotal.getData() + numData, 1); cblas_dcopy(numUsedData, transmissionBlock.metaInfos.snBlock.getData(), 1, snBlockTotal.getData() + numData, 1); cblas_dcopy(numUsedData, transmissionBlock.metaInfos.rlBlock.getData(), 1, rlBlockTotal.getData() + numData, 1); cblas_dcopy(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: "<