#include "getTransmissionData.h" #include "Function.h" #include "Function1D.h" #include "Function2D.h" #include "common/dataBlockCreation/removeDataFromArrays.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 "MatlabReader.h" #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; }; 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); 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 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); } size_t vectorSize = aMotorPos.getDataSize() * (aSlList.getDataSize() / transParams::senderTASSize) * (aSnList.getDataSize() / transParams::senderElementSize); std::vector blockOfTransmissionDatas(vectorSize); int numData = 0; int numPossibleScans = 0; for(int i=0; i