reconstructionSAFT 1

This commit is contained in:
kradchen
2023-06-14 11:37:24 +08:00
parent bd1a2fdbe4
commit e57938ca5d
2 changed files with 82 additions and 57 deletions

View File

@@ -1,11 +1,13 @@
#include "reconstructionSAFT.h"
#include "Function1D.h"
#include "Function2D.h"
#include "Function3D.h"
#include "Matrix.h"
#include "SAFTStructs.h"
#include "SAFT_ATT.h"
#include "SAFT_TOFI.h"
#include "common/dataBlockCreation/removeDataFromArrays.h"
#include "config/config.h"
#include <algorithm>
@@ -73,7 +75,7 @@ namespace Recon {
Matrix_t receiverIdx{nullptr,
2,
{1, receiverIndex.getDataSize(), 1},
{ 1,receiverIndex.getDataSize(), 1},
receiverIndex.getDataSize()};
unsigned short *temp1 = new unsigned short[receiverIndex.getDataSize()];
std::copy(receiverIndex.getData(),
@@ -83,7 +85,7 @@ namespace Recon {
Matrix_t senderIdx{nullptr,
2,
{1, senderIndex.getDataSize(), 1},
{senderIndex.getDataSize(),1, 1},
senderIndex.getDataSize()};
temp1 = new unsigned short[senderIndex.getDataSize()];
std::copy(senderIndex.getData(),
@@ -118,8 +120,9 @@ namespace Recon {
Matrix_t _SAFT_mode{&SAFT_mode, 1, {1, 1, 1}, 1};
params.push_back(_SAFT_mode);
int saftVariant_v[3]{(int)reflectParams::saftVariant[0],(int)reflectParams::saftVariant[1],(int)reflectParams::saftVariant[2]};
Matrix_t saftVariant{saftVariant_v,2,{1,3,1},3};
int saftVariant_v[6]{(int)reflectParams::saftVariant[0],(int)reflectParams::saftVariant[1],(int)reflectParams::saftVariant[2],
(int)reflectParams::saftVariant[3],(int)reflectParams::saftVariant[4],(int)reflectParams::saftVariant[5]};
Matrix_t saftVariant{saftVariant_v,2,{1,6,1},3};
params.push_back(saftVariant);
Matrix_t SpeedMap3D{nullptr,
@@ -197,9 +200,9 @@ namespace Recon {
params.push_back(blockXYZ);
Matrix_t gpus{nullptr,
(size_t)reconParams::gpuSelectionList.getDims(),
{(size_t)reconParams::gpuSelectionList.getDimSize(0), (size_t)reconParams::gpuSelectionList.getDimSize(1),
(size_t)reconParams::gpuSelectionList.getDimSize(2)},
2,
{1, (size_t)reconParams::gpuSelectionList.getDataSize(),
1},
reconParams::gpuSelectionList.getDataSize()};
int *gdata = new int[reconParams::gpuSelectionList.getDataSize()]{0};
std::copy(reconParams::gpuSelectionList.getData(), reconParams::gpuSelectionList.getData() + reconParams::gpuSelectionList.getDataSize(),
@@ -229,67 +232,43 @@ namespace Recon {
recontructSAFT(const Aurora::Matrix &AScans, const Aurora::Matrix &senderPos,
const Aurora::Matrix &receiverPos, const Aurora::Matrix &mpIndex,
int SAFT_mode, TransRecos &transRecos, Aurora::Matrix &Env) {
auto TimeInterval = 1 / (reflectParams::aScanReconstructionFrequency);
double TimeInterval = 1.0 / (reflectParams::aScanReconstructionFrequency);
std::vector<int> motorPosAvailable;
std::unique_copy(mpIndex.getData(), mpIndex.getData() + mpIndex.getDataSize(),
std::back_inserter(motorPosAvailable));
for (auto mp : motorPosAvailable) {
std::vector<int> mpIdxs;
for (size_t i = 0; i < mpIndex.getDataSize(); i++) {
if (mpIndex[i] == mp)
mpIdxs.push_back(i);
}
auto senderPosGeom = Aurora::zeros(senderPos.getDimSize(0), mpIdxs.size());
auto receiverPosGeom =
Aurora::zeros(receiverPos.getDimSize(0), mpIdxs.size());
std::vector<int> idsSender;
std::vector<int> idsReceiver;
int addCount_s = 0;
int addCount_r = 0;
auto mpIdxs = mpIndex == mp;
size_t countMp = Aurora::sum(mpIdxs).getScalar();
for (auto mpIdx : mpIdxs) {
int flag = compareColumn(senderPosGeom, addCount_s, senderPos, mpIdx);
// old one, add ids
if (flag >= 0) {
idsSender.push_back(flag);
}
// found new unique one
else {
senderPosGeom(addCount_s, Aurora::$) = senderPos(mpIdx, Aurora::$);
idsSender.push_back(addCount_s++);
}
int flag2 =
compareColumn(receiverPosGeom, addCount_r, receiverPos, mpIdx);
// old one, add ids
if (flag2 >= 0) {
idsReceiver.push_back(flag2);
}
// found new unique one
else {
receiverPosGeom(addCount_r, Aurora::$) = receiverPos(mpIdx, Aurora::$);
idsReceiver.push_back(addCount_r++);
}
}
auto numUsedData = mpIdxs.size();
auto senderPos_s = Aurora::transpose(removeDataFromArrays(senderPos, mpIdxs));
auto receiverPos_s = Aurora::transpose(removeDataFromArrays(receiverPos, mpIdxs));
Aurora::Matrix idsSender ;
auto senderPosGeom = Aurora::uniqueByRows(receiverPos_s, idsSender);
idsSender = Aurora::transpose(idsSender);
Aurora::Matrix idsReceiver ;
auto receiverPosGeom = Aurora::uniqueByRows(receiverPos_s, idsReceiver);
idsReceiver = Aurora::transpose(idsReceiver);
auto numUsedData = countMp;
int count = numUsedData / reflectParams::blockSizeReco;
auto blockIdxs = Aurora::zeros(1, count + 2);
for (size_t i = 0; i < count + 1; i++) {
blockIdxs[i] = i * reflectParams::blockSizeReco;
blockIdxs[i] = i * reflectParams::blockSizeReco;
}
blockIdxs[count + 1] = numUsedData;
for (size_t i = 0; i < count + 1; i++) {
size_t length = blockIdxs[i + 1] - blockIdxs[i];
size_t begin = blockIdxs[i];
size_t end = blockIdxs[i + 1];
auto _AScans = Aurora::zeros(AScans.getDimSize(0), length);
auto receiverIndex = Aurora::zeros(1, length);
auto senderIndex = Aurora::zeros(1, length);
for (size_t j = begin, k = 0; j < end; j++, k++) {
_AScans(Aurora::$, k) = AScans(Aurora::$, mpIdxs[j]);
receiverIndex[k] = idsReceiver[j];
senderIndex[k] = idsSender[j];
}
Env = callSAFT(_AScans, receiverIndex, senderIndex, receiverPosGeom,
size_t length = blockIdxs[i + 1] - blockIdxs[i];
size_t begin = blockIdxs[i];
size_t end = blockIdxs[i + 1];
auto _AScans = Aurora::zeros(AScans.getDimSize(0), length);
auto receiverIndex = Aurora::zeros(1, length);
auto senderIndex = Aurora::zeros(1, length);
for (size_t j = begin, k = 0; j < end; j++, k++) {
_AScans(Aurora::$, k) = AScans(Aurora::$, mpIdxs[j]);
receiverIndex[k] = idsReceiver[j];
senderIndex[k] = idsSender[j];
}
Env = callSAFT(_AScans, receiverIndex, senderIndex, receiverPosGeom,
senderPosGeom, SAFT_mode, TimeInterval, transRecos, Env);
}
}