AOT-biomaps 2.9.339__py3-none-any.whl → 2.9.373__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of AOT-biomaps might be problematic. Click here for more details.
- AOT_biomaps/AOT_Acoustic/AcousticTools.py +17 -0
- AOT_biomaps/AOT_Acoustic/StructuredWave.py +15 -1
- AOT_biomaps/AOT_Acoustic/_mainAcoustic.py +42 -15
- AOT_biomaps/AOT_Experiment/ExperimentTools.py +15 -25
- AOT_biomaps/AOT_Experiment/Tomography.py +61 -48
- AOT_biomaps/AOT_Recon/AnalyticRecon.py +321 -179
- AOT_biomaps/AOT_Recon/ReconTools.py +162 -1
- AOT_biomaps/AOT_Recon/_mainRecon.py +117 -10
- AOT_biomaps/__init__.py +35 -1
- {aot_biomaps-2.9.339.dist-info → aot_biomaps-2.9.373.dist-info}/METADATA +1 -1
- {aot_biomaps-2.9.339.dist-info → aot_biomaps-2.9.373.dist-info}/RECORD +13 -13
- {aot_biomaps-2.9.339.dist-info → aot_biomaps-2.9.373.dist-info}/WHEEL +0 -0
- {aot_biomaps-2.9.339.dist-info → aot_biomaps-2.9.373.dist-info}/top_level.txt +0 -0
|
@@ -7,6 +7,8 @@ from numba import njit, prange
|
|
|
7
7
|
from torch_sparse import coalesce
|
|
8
8
|
from scipy.signal.windows import hann
|
|
9
9
|
from itertools import groupby
|
|
10
|
+
import cupy as cp
|
|
11
|
+
from cupyx.scipy.ndimage import map_coordinates
|
|
10
12
|
|
|
11
13
|
def load_recon(hdr_path):
|
|
12
14
|
"""
|
|
@@ -528,4 +530,163 @@ def get_phase_deterministic(profile):
|
|
|
528
530
|
elif idx == 4 :
|
|
529
531
|
phase = 3*np.pi/2
|
|
530
532
|
|
|
531
|
-
return phase
|
|
533
|
+
return phase
|
|
534
|
+
|
|
535
|
+
def add_sincos_cpu(R, decimation, theta):
|
|
536
|
+
decimation = np.asarray(decimation)
|
|
537
|
+
theta = np.asarray(theta)
|
|
538
|
+
|
|
539
|
+
ScanParam = np.stack([decimation, theta], axis=1)
|
|
540
|
+
uniq, ia, ib = np.unique(ScanParam, axis=0, return_index=True, return_inverse=True)
|
|
541
|
+
|
|
542
|
+
theta_u = uniq[:,1]
|
|
543
|
+
decim_u = uniq[:,0]
|
|
544
|
+
|
|
545
|
+
theta0 = np.unique(theta_u)
|
|
546
|
+
N0 = len(theta0)
|
|
547
|
+
|
|
548
|
+
Rg = np.asarray(R)
|
|
549
|
+
Nz = Rg.shape[0]
|
|
550
|
+
Nk = N0 + (Rg.shape[1] - N0)//4
|
|
551
|
+
|
|
552
|
+
Iout = np.zeros((Nz, Nk), dtype=np.complex64)
|
|
553
|
+
# fx = 0 (onde plane)
|
|
554
|
+
Iout[:, :N0] = Rg[:, :N0]
|
|
555
|
+
|
|
556
|
+
k = N0
|
|
557
|
+
for i in range(N0, len(ia)):
|
|
558
|
+
idx = np.where(ib == i)[0]
|
|
559
|
+
h1, h2, h3, h4 = Rg[:, idx].T
|
|
560
|
+
Iout[:, k] = ((h1 - h2) - 1j*(h3 - h4)) / 2
|
|
561
|
+
k += 1
|
|
562
|
+
|
|
563
|
+
return Iout, theta_u, decim_u
|
|
564
|
+
|
|
565
|
+
def fourierz_gpu(z, X):
|
|
566
|
+
dz = float(z[1] - z[0])
|
|
567
|
+
Nz = X.shape[0]
|
|
568
|
+
|
|
569
|
+
return cp.fft.fftshift(
|
|
570
|
+
cp.fft.fft(
|
|
571
|
+
cp.fft.ifftshift(X, axes=0),
|
|
572
|
+
axis=0
|
|
573
|
+
),
|
|
574
|
+
axes=0
|
|
575
|
+
) * (Nz * dz)
|
|
576
|
+
|
|
577
|
+
def ifourierz_gpu(z, X):
|
|
578
|
+
dz = float(z[1] - z[0])
|
|
579
|
+
Nz = X.shape[0]
|
|
580
|
+
|
|
581
|
+
return cp.fft.ifftshift(
|
|
582
|
+
cp.fft.ifft(
|
|
583
|
+
cp.fft.fftshift(X, axes=0),
|
|
584
|
+
axis=0
|
|
585
|
+
),
|
|
586
|
+
axes=0
|
|
587
|
+
) * (1 / dz)
|
|
588
|
+
|
|
589
|
+
def ifourierx_gpu(F_fx_z, dx):
|
|
590
|
+
"""
|
|
591
|
+
Inverse Fourier along X (axis=1), Matlab-compatible
|
|
592
|
+
F_fx_z : (Nz, Nx) complex cupy array
|
|
593
|
+
dx : scalar (spacing in x)
|
|
594
|
+
"""
|
|
595
|
+
|
|
596
|
+
return (
|
|
597
|
+
cp.fft.ifftshift(
|
|
598
|
+
cp.fft.ifft(
|
|
599
|
+
cp.fft.fftshift(F_fx_z, axes=1),
|
|
600
|
+
axis=1
|
|
601
|
+
),
|
|
602
|
+
axes=1
|
|
603
|
+
) * (1.0 / dx)
|
|
604
|
+
)
|
|
605
|
+
|
|
606
|
+
def EvalDelayLawOS_center(X_m, theta, DelayLAWS, ActiveLIST, c):
|
|
607
|
+
"""
|
|
608
|
+
Retourne le centre de rotation C pour chaque angle
|
|
609
|
+
X_m : positions des éléments de la sonde
|
|
610
|
+
DelayLAWS : delays en secondes (chaque colonne = angle, chaque ligne = élément)
|
|
611
|
+
ActiveLIST : masque des éléments actifs (1 = actif)
|
|
612
|
+
c : vitesse du son
|
|
613
|
+
"""
|
|
614
|
+
Nangle = DelayLAWS.shape[1]
|
|
615
|
+
C = np.zeros((Nangle, 2))
|
|
616
|
+
|
|
617
|
+
ct = DelayLAWS * c # convert seconds to distance
|
|
618
|
+
|
|
619
|
+
for i in range(Nangle):
|
|
620
|
+
active_idx = np.where(ActiveLIST[:, i] == 1)[0]
|
|
621
|
+
if len(active_idx) == 0:
|
|
622
|
+
continue
|
|
623
|
+
|
|
624
|
+
|
|
625
|
+
angle_i = np.round(theta[i], 5)
|
|
626
|
+
# unit vector orthogonal to wavefront
|
|
627
|
+
u = np.array([np.sin(angle_i), np.cos(angle_i)])
|
|
628
|
+
|
|
629
|
+
# initial positions X0, Z0
|
|
630
|
+
X0 = X_m - u[0] * ct[:, i]
|
|
631
|
+
Z0 = 0 - u[1] * ct[:, i]
|
|
632
|
+
|
|
633
|
+
if Z0[-1] - Z0[0] != 0:
|
|
634
|
+
C[i, 0] = (Z0[-1]*X0[0] - Z0[0]*X0[-1]) / (Z0[-1] - Z0[0])
|
|
635
|
+
C[i, 1] = 0
|
|
636
|
+
|
|
637
|
+
return C
|
|
638
|
+
|
|
639
|
+
def rotate_theta_gpu(X, Z, Iin, theta, C):
|
|
640
|
+
"""
|
|
641
|
+
GPU equivalent of RotateTheta.m
|
|
642
|
+
X, Z, Iin : cupy arrays (Nz, Nx)
|
|
643
|
+
theta : scalar (float)
|
|
644
|
+
C : (2,) array-like
|
|
645
|
+
"""
|
|
646
|
+
|
|
647
|
+
# --- Translation ---
|
|
648
|
+
X_rel = X - C[0]
|
|
649
|
+
Z_rel = Z - C[1]
|
|
650
|
+
|
|
651
|
+
c = cp.cos(theta)
|
|
652
|
+
s = cp.sin(theta)
|
|
653
|
+
|
|
654
|
+
# --- Rotation (Matlab convention) ---
|
|
655
|
+
Xout = c * X_rel + s * Z_rel
|
|
656
|
+
Zout = -s * X_rel + c * Z_rel
|
|
657
|
+
|
|
658
|
+
# Back to original frame
|
|
659
|
+
Xout += C[0]
|
|
660
|
+
Zout += C[1]
|
|
661
|
+
|
|
662
|
+
# --- Conversion coordonnées -> indices ---
|
|
663
|
+
# Grille régulière supposée
|
|
664
|
+
dx = X[0, 1] - X[0, 0]
|
|
665
|
+
dz = Z[1, 0] - Z[0, 0]
|
|
666
|
+
|
|
667
|
+
x0 = X[0, 0]
|
|
668
|
+
z0 = Z[0, 0]
|
|
669
|
+
|
|
670
|
+
ix = (Xout - x0) / dx
|
|
671
|
+
iz = (Zout - z0) / dz
|
|
672
|
+
|
|
673
|
+
# --- Interpolation bilinéaire GPU ---
|
|
674
|
+
# map_coordinates attend (ndim, Npoints)
|
|
675
|
+
coords = cp.stack([iz.ravel(), ix.ravel()])
|
|
676
|
+
|
|
677
|
+
Iout = map_coordinates(
|
|
678
|
+
Iin,
|
|
679
|
+
coords,
|
|
680
|
+
order=1, # bilinear
|
|
681
|
+
mode='constant',
|
|
682
|
+
cval=0.0
|
|
683
|
+
)
|
|
684
|
+
|
|
685
|
+
return Iout.reshape(Iin.shape)
|
|
686
|
+
|
|
687
|
+
def filter_radon_gpu(fz, Fc):
|
|
688
|
+
FILTER = cp.abs(fz)
|
|
689
|
+
FILTER = cp.where(cp.abs(fz) > Fc, 0, FILTER)
|
|
690
|
+
FILTER *= cp.exp(-2 * cp.abs(fz / Fc)**10)
|
|
691
|
+
return FILTER
|
|
692
|
+
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
from AOT_biomaps.Config import config
|
|
2
|
-
from AOT_biomaps.AOT_Experiment.Tomography import Tomography
|
|
2
|
+
from AOT_biomaps.AOT_Experiment.Tomography import Tomography, hex_to_binary_profile
|
|
3
3
|
from .ReconEnums import ReconType
|
|
4
|
-
from .ReconTools import mse, ssim
|
|
4
|
+
from .ReconTools import mse, ssim, get_phase_deterministic
|
|
5
5
|
|
|
6
6
|
import os
|
|
7
7
|
import numpy as np
|
|
8
8
|
import matplotlib.pyplot as plt
|
|
9
9
|
from abc import ABC, abstractmethod
|
|
10
|
+
from tqdm import trange
|
|
10
11
|
|
|
11
12
|
|
|
12
13
|
class Recon(ABC):
|
|
@@ -166,10 +167,18 @@ class Recon(ABC):
|
|
|
166
167
|
ssim_value = ssim(self.experiment.OpticImage.phantom, theta, data_range=data_range)
|
|
167
168
|
self.SSIM.append(ssim_value)
|
|
168
169
|
|
|
169
|
-
|
|
170
|
-
|
|
170
|
+
def show(self, withTumor=True, savePath=None, scale='same'):
|
|
171
|
+
"""
|
|
172
|
+
Display the reconstructed images.
|
|
173
|
+
Args:
|
|
174
|
+
withTumor (bool): If True, displays reconPhantom. If False, displays reconLaser. Default is True.
|
|
175
|
+
savePath (str): Path to save the figure. If None, the figure is not saved. Default is None.
|
|
176
|
+
scale (str): Scale for the aspect ratio of the plots. Default is 'same'. Options are 'same' or 'auto'.
|
|
177
|
+
"""
|
|
171
178
|
if withTumor:
|
|
172
|
-
if self.reconPhantom is None
|
|
179
|
+
if self.reconPhantom is None:
|
|
180
|
+
raise ValueError("Reconstructed phantom with tumor is empty. Run reconstruction first.")
|
|
181
|
+
if isinstance(self.reconPhantom, (list, tuple)) and len(self.reconPhantom) == 0:
|
|
173
182
|
raise ValueError("Reconstructed phantom with tumor is empty. Run reconstruction first.")
|
|
174
183
|
if isinstance(self.reconPhantom, list):
|
|
175
184
|
image = self.reconPhantom[-1]
|
|
@@ -179,12 +188,19 @@ class Recon(ABC):
|
|
|
179
188
|
fig, axs = plt.subplots(1, 1, figsize=(10, 10))
|
|
180
189
|
else:
|
|
181
190
|
fig, axs = plt.subplots(1, 2, figsize=(20, 10))
|
|
191
|
+
if scale == 'same':
|
|
192
|
+
vmin = 0
|
|
193
|
+
vmax = 1
|
|
194
|
+
elif scale == 'auto':
|
|
195
|
+
vmin = np.min(self.experiment.OpticImage.phantom)
|
|
196
|
+
vmax = np.max(self.experiment.OpticImage.phantom)
|
|
197
|
+
|
|
182
198
|
# Phantom original
|
|
183
199
|
im1 = axs[1].imshow(
|
|
184
200
|
self.experiment.OpticImage.phantom,
|
|
185
201
|
cmap='hot',
|
|
186
|
-
vmin=
|
|
187
|
-
vmax=
|
|
202
|
+
vmin=vmin,
|
|
203
|
+
vmax=vmax,
|
|
188
204
|
extent=(
|
|
189
205
|
self.experiment.params.general['Xrange'][0],
|
|
190
206
|
self.experiment.params.general['Xrange'][1],
|
|
@@ -197,12 +213,18 @@ class Recon(ABC):
|
|
|
197
213
|
axs[1].set_xlabel("x (mm)", fontsize=12)
|
|
198
214
|
axs[1].set_ylabel("z (mm)", fontsize=12)
|
|
199
215
|
axs[1].tick_params(axis='both', which='major', labelsize=8)
|
|
216
|
+
if scale == 'same':
|
|
217
|
+
vmin = 0
|
|
218
|
+
vmax = 1
|
|
219
|
+
elif scale == 'auto':
|
|
220
|
+
vmin = np.min(image)
|
|
221
|
+
vmax = np.max(image)
|
|
200
222
|
# Phantom reconstruit
|
|
201
223
|
im0 = axs[0].imshow(
|
|
202
224
|
image,
|
|
203
225
|
cmap='hot',
|
|
204
|
-
vmin=
|
|
205
|
-
vmax=
|
|
226
|
+
vmin=vmin,
|
|
227
|
+
vmax=vmax,
|
|
206
228
|
extent=(
|
|
207
229
|
self.experiment.params.general['Xrange'][0],
|
|
208
230
|
self.experiment.params.general['Xrange'][1],
|
|
@@ -217,7 +239,9 @@ class Recon(ABC):
|
|
|
217
239
|
axs[0].tick_params(axis='both', which='major', labelsize=8)
|
|
218
240
|
axs[0].tick_params(axis='y', which='both', left=False, right=False, labelleft=False)
|
|
219
241
|
else:
|
|
220
|
-
if self.reconLaser is None
|
|
242
|
+
if self.reconLaser is None:
|
|
243
|
+
raise ValueError("Reconstructed laser without tumor is empty. Run reconstruction first.")
|
|
244
|
+
if isinstance(self.reconLaser, (list, tuple)) and len(self.reconLaser) == 0:
|
|
221
245
|
raise ValueError("Reconstructed laser without tumor is empty. Run reconstruction first.")
|
|
222
246
|
if isinstance(self.reconLaser, list):
|
|
223
247
|
image = self.reconLaser[-1]
|
|
@@ -284,4 +308,87 @@ class Recon(ABC):
|
|
|
284
308
|
|
|
285
309
|
plt.show()
|
|
286
310
|
|
|
311
|
+
def parse_and_demodulate(self, withTumor=True):
|
|
287
312
|
|
|
313
|
+
if withTumor:
|
|
314
|
+
AOsignal = self.experiment.AOsignal_withTumor
|
|
315
|
+
else:
|
|
316
|
+
AOsignal = self.experiment.AOsignal_withoutTumor
|
|
317
|
+
delta_x = self.experiment.params.general['dx'] # en m
|
|
318
|
+
n_piezos = self.experiment.params.acoustic['num_elements']
|
|
319
|
+
demodulated_data = {}
|
|
320
|
+
structured_buffer = {}
|
|
321
|
+
|
|
322
|
+
for i in trange(len(self.experiment.AcousticFields), desc="Demodulating AO signals"):
|
|
323
|
+
label = self.experiment.AcousticFields[i].getName_field()
|
|
324
|
+
|
|
325
|
+
parts = label.split("_")
|
|
326
|
+
hex_pattern = parts[0]
|
|
327
|
+
angle_code = parts[-1]
|
|
328
|
+
|
|
329
|
+
# Angle
|
|
330
|
+
if angle_code.startswith("1"):
|
|
331
|
+
angle_deg = -int(angle_code[1:])
|
|
332
|
+
else:
|
|
333
|
+
angle_deg = int(angle_code)
|
|
334
|
+
angle_rad = np.deg2rad(angle_deg)
|
|
335
|
+
|
|
336
|
+
# Onde Plane (f_s = 0)
|
|
337
|
+
if set(hex_pattern.lower().replace(" ", "")) == {'f'}:
|
|
338
|
+
fs_key = 0.0 # fs_key est en mm^-1 (0.0 mm^-1)
|
|
339
|
+
demodulated_data[(fs_key, angle_rad)] = np.array(AOsignal[:,i])
|
|
340
|
+
continue
|
|
341
|
+
|
|
342
|
+
# Onde Structurée
|
|
343
|
+
profile = hex_to_binary_profile(hex_pattern, n_piezos)
|
|
344
|
+
|
|
345
|
+
# Calcul FS (Fréquence de Structuration)
|
|
346
|
+
ft_prof = np.fft.fft(profile)
|
|
347
|
+
# On regarde uniquement la partie positive non DC
|
|
348
|
+
idx_max = np.argmax(np.abs(ft_prof[1:len(profile)//2])) + 1
|
|
349
|
+
freqs = np.fft.fftfreq(len(profile), d=delta_x)
|
|
350
|
+
|
|
351
|
+
# freqs est en m^-1 car delta_x est en mètres.
|
|
352
|
+
fs_m_inv = abs(freqs[idx_max])
|
|
353
|
+
|
|
354
|
+
# *** CORRECTION 1: Conversion de f_s en mm^-1 (mm^-1 est utilisé dans iRadon) ***
|
|
355
|
+
fs_key = fs_m_inv / 1000.0 # Fréquence spatiale en mm^-1
|
|
356
|
+
|
|
357
|
+
|
|
358
|
+
if fs_key == 0: continue
|
|
359
|
+
|
|
360
|
+
# Calcul de la Phase (Shift)
|
|
361
|
+
phase = get_phase_deterministic(profile)
|
|
362
|
+
|
|
363
|
+
# Stockage par (fs, theta) et phase
|
|
364
|
+
key = (fs_key, angle_rad)
|
|
365
|
+
if key not in structured_buffer:
|
|
366
|
+
structured_buffer[key] = {}
|
|
367
|
+
|
|
368
|
+
# La moyenne est nécessaire si plusieurs acquisitions ont la même phase (pour le SNR)
|
|
369
|
+
if phase in structured_buffer[key]:
|
|
370
|
+
structured_buffer[key][phase] = (structured_buffer[key][phase] + np.array(AOsignal[:,i])) / 2
|
|
371
|
+
else:
|
|
372
|
+
structured_buffer[key][phase] = np.array(AOsignal[:,i])
|
|
373
|
+
|
|
374
|
+
|
|
375
|
+
|
|
376
|
+
for (fs, theta), phases in structured_buffer.items():
|
|
377
|
+
s0 = phases.get(0.0, 0)
|
|
378
|
+
s_pi_2 = phases.get(np.pi/2, 0)
|
|
379
|
+
s_pi = phases.get(np.pi, 0)
|
|
380
|
+
s_3pi_2 = phases.get(3*np.pi/2, 0)
|
|
381
|
+
|
|
382
|
+
# Assurer que les zéros sont des vecteurs de la bonne taille
|
|
383
|
+
example = next(val for val in phases.values() if not isinstance(val, int))
|
|
384
|
+
if isinstance(s0, int): s0 = np.zeros_like(example)
|
|
385
|
+
if isinstance(s_pi, int): s_pi = np.zeros_like(example)
|
|
386
|
+
if isinstance(s_pi_2, int): s_pi_2 = np.zeros_like(example)
|
|
387
|
+
if isinstance(s_3pi_2, int): s_3pi_2 = np.zeros_like(example)
|
|
388
|
+
|
|
389
|
+
real = s0 - s_pi
|
|
390
|
+
imag = s_pi_2 - s_3pi_2
|
|
391
|
+
|
|
392
|
+
demodulated_data[(fs, theta)] = (real - 1j * imag) / (2/np.pi)
|
|
393
|
+
|
|
394
|
+
return demodulated_data
|
AOT_biomaps/__init__.py
CHANGED
|
@@ -85,7 +85,7 @@ from .AOT_Recon.AOT_PotentialFunctions.RelativeDifferences import *
|
|
|
85
85
|
from .Config import config
|
|
86
86
|
from .Settings import *
|
|
87
87
|
|
|
88
|
-
__version__ = '2.9.
|
|
88
|
+
__version__ = '2.9.373'
|
|
89
89
|
__process__ = config.get_process()
|
|
90
90
|
|
|
91
91
|
def initialize(process=None):
|
|
@@ -183,6 +183,40 @@ def initialize(process=None):
|
|
|
183
183
|
|
|
184
184
|
|
|
185
185
|
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
|
|
186
220
|
|
|
187
221
|
|
|
188
222
|
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
AOT_biomaps/Config.py,sha256=ghEOP1n8aO1pR-su13wMeAZAxZRfry5hH67NbtZ8SqI,3614
|
|
2
2
|
AOT_biomaps/Settings.py,sha256=v8fPhnvvcfBJP29m1RLOTEr3jndGLGwbUiORXmsj2Bo,2853
|
|
3
|
-
AOT_biomaps/__init__.py,sha256=
|
|
3
|
+
AOT_biomaps/__init__.py,sha256=fgpEUPXUQbaCtMxY_uHJtjrQTvQBwltYoAQtHk1zCuM,4408
|
|
4
4
|
AOT_biomaps/AOT_Acoustic/AcousticEnums.py,sha256=s5kXa6jKzbS4btwbubrVcynLOr0yg5tth5vL_FGfbMk,1802
|
|
5
|
-
AOT_biomaps/AOT_Acoustic/AcousticTools.py,sha256=
|
|
5
|
+
AOT_biomaps/AOT_Acoustic/AcousticTools.py,sha256=7kuWIIGyzZPQrzRI0zVvdwNUp7qKUE67yCYOMzSb0Ug,8283
|
|
6
6
|
AOT_biomaps/AOT_Acoustic/FocusedWave.py,sha256=3kGKKDx_3Msy5COYqIwzROPORGWvNjw8UsDanBfkMXE,11037
|
|
7
7
|
AOT_biomaps/AOT_Acoustic/IrregularWave.py,sha256=yZhtxkR6zlciRcEpdTR0BAhvgQl40XHKFaF8f4VXarE,3035
|
|
8
8
|
AOT_biomaps/AOT_Acoustic/PlaneWave.py,sha256=xza-rj5AUWDecLkGDxRcULrwZVWeBvGnEP2d51TyR04,1447
|
|
9
|
-
AOT_biomaps/AOT_Acoustic/StructuredWave.py,sha256=
|
|
9
|
+
AOT_biomaps/AOT_Acoustic/StructuredWave.py,sha256=DRTjD-zrmX12FHrvwOeEo-Rk1fHYm9gfCcebz4WhtXc,18930
|
|
10
10
|
AOT_biomaps/AOT_Acoustic/__init__.py,sha256=t9M2rRqa_L9pk7W2FeELTkHEMuP4DBr4gBRldMqsQbg,491
|
|
11
|
-
AOT_biomaps/AOT_Acoustic/_mainAcoustic.py,sha256=
|
|
12
|
-
AOT_biomaps/AOT_Experiment/ExperimentTools.py,sha256=
|
|
11
|
+
AOT_biomaps/AOT_Acoustic/_mainAcoustic.py,sha256=M0CKApSCuKiCupj9pf9uOEhuuzJVNSlLvhgTpBQN5Q8,46128
|
|
12
|
+
AOT_biomaps/AOT_Experiment/ExperimentTools.py,sha256=aFvJw6J_jfFVTDFnG7J3a61SHEgORdZKZS0UI82VMaY,2637
|
|
13
13
|
AOT_biomaps/AOT_Experiment/Focus.py,sha256=B2nBawmv-NG2AWJx9zgQ8GlN6aFB9FwTSqX-M-phKXg,3193
|
|
14
|
-
AOT_biomaps/AOT_Experiment/Tomography.py,sha256=
|
|
14
|
+
AOT_biomaps/AOT_Experiment/Tomography.py,sha256=9mJDwV9WVphoX8drL7MgN3WhS6fjYwS6HWQD3x1CrVs,37625
|
|
15
15
|
AOT_biomaps/AOT_Experiment/__init__.py,sha256=H9zMLeBLA6uhbaHohAa-2u5mDDxqJi8oE5c6tShdQp8,308
|
|
16
16
|
AOT_biomaps/AOT_Experiment/_mainExperiment.py,sha256=zSfuNrsz7nhiKrGIdK6CAXjlI2T6qYC5-JXHFgPNzhc,24674
|
|
17
17
|
AOT_biomaps/AOT_Optic/Absorber.py,sha256=jEodzRy7gkEH-wbazVasRQiri0dU16BfapmR-qnTSvM,867
|
|
@@ -21,14 +21,14 @@ AOT_biomaps/AOT_Optic/__init__.py,sha256=HSUVhfz0NzwHHZZ9KP9Xyfu33IgP_rYJX86J-gE
|
|
|
21
21
|
AOT_biomaps/AOT_Optic/_mainOptic.py,sha256=Wk63CcgWbU-ygMfjNK80islaUbGGJpTXgZY3_C2KQNY,8179
|
|
22
22
|
AOT_biomaps/AOT_Recon/AOT_biomaps_kernels.cubin,sha256=JWy-bdtBTZdnNlDbJGZKwXyF-2u1wICtmlOC_YxEL6o,82528
|
|
23
23
|
AOT_biomaps/AOT_Recon/AlgebraicRecon.py,sha256=CGBXZyYEZ3TOTFOKSt-h7NGuFbuI9PNr3YTWTbSLxDo,46832
|
|
24
|
-
AOT_biomaps/AOT_Recon/AnalyticRecon.py,sha256=
|
|
24
|
+
AOT_biomaps/AOT_Recon/AnalyticRecon.py,sha256=z4VJtqL-atoZLflG7vQKHNeTXXjhYG_us8l0xfo5XsU,14514
|
|
25
25
|
AOT_biomaps/AOT_Recon/BayesianRecon.py,sha256=RnnPa-tTcvirwiNPnCRZnSM4NWeEEltYET-piBbp34g,12671
|
|
26
26
|
AOT_biomaps/AOT_Recon/DeepLearningRecon.py,sha256=RfVcEsi4GeGqJn0_SPxwQPQx6IQjin79WKh2UarMRLI,1383
|
|
27
27
|
AOT_biomaps/AOT_Recon/PrimalDualRecon.py,sha256=JbFhxiyUoSTnlJgHbOWIfUUwhwfZoi39RJMnfkagegY,16504
|
|
28
28
|
AOT_biomaps/AOT_Recon/ReconEnums.py,sha256=KAf55RqHAr2ilt6pxFrUBGQOn-7HA8NP6TyL-1FNiXo,19714
|
|
29
|
-
AOT_biomaps/AOT_Recon/ReconTools.py,sha256
|
|
29
|
+
AOT_biomaps/AOT_Recon/ReconTools.py,sha256=CV2BwdEwvNd3B02G5LYoKsRGlONwIupuv617S2AOWZE,25322
|
|
30
30
|
AOT_biomaps/AOT_Recon/__init__.py,sha256=xs_argJqXKFl76xP7-jiUc1ynOEEtY7XZ0gDxD5uVZc,246
|
|
31
|
-
AOT_biomaps/AOT_Recon/_mainRecon.py,sha256=
|
|
31
|
+
AOT_biomaps/AOT_Recon/_mainRecon.py,sha256=hubU5SWEeAv94k_DNbdze4wfUeBw-4smboqRyzlmy_k,18058
|
|
32
32
|
AOT_biomaps/AOT_Recon/AOT_Optimizers/DEPIERRO.py,sha256=qA1n722GLQJH3V8HcLr5q_GxEwBS_NRlIT3E6JZk-Ag,9479
|
|
33
33
|
AOT_biomaps/AOT_Recon/AOT_Optimizers/LS.py,sha256=bCu1rKzFXPbYQ7jV3L3E_jVQpb6LIEC5MIlN1-mCNdY,22814
|
|
34
34
|
AOT_biomaps/AOT_Recon/AOT_Optimizers/MAPEM.py,sha256=vQLCB0L4FSXJKn2_6kdIdWrI6WZ82KuqUh7CSqBGVuo,25766
|
|
@@ -42,7 +42,7 @@ AOT_biomaps/AOT_Recon/AOT_PotentialFunctions/__init__.py,sha256=RwrJdLOFbAFBFnRx
|
|
|
42
42
|
AOT_biomaps/AOT_Recon/AOT_SparseSMatrix/SparseSMatrix_CSR.py,sha256=RACc2P5oxmp0uPLAGnNj9mEtAxa_OlepNgCawKij3jI,12062
|
|
43
43
|
AOT_biomaps/AOT_Recon/AOT_SparseSMatrix/SparseSMatrix_SELL.py,sha256=ti3dZQsb_Uu62C7Bn65Z-yf-R5NKCFsmnBT5GlLd_HY,15138
|
|
44
44
|
AOT_biomaps/AOT_Recon/AOT_SparseSMatrix/__init__.py,sha256=8nou-hqjQjuCTLhoL5qv4EM_lMPFviAZAZKSPhi84jE,67
|
|
45
|
-
aot_biomaps-2.9.
|
|
46
|
-
aot_biomaps-2.9.
|
|
47
|
-
aot_biomaps-2.9.
|
|
48
|
-
aot_biomaps-2.9.
|
|
45
|
+
aot_biomaps-2.9.373.dist-info/METADATA,sha256=pJCjnmUoIHGqV_s_popa7BNlrTn4LPP3h7mxRqlUiTQ,700
|
|
46
|
+
aot_biomaps-2.9.373.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
47
|
+
aot_biomaps-2.9.373.dist-info/top_level.txt,sha256=6STF-lT4kaAnBHJYCripmN5mZABoHjMuY689JdiDphk,12
|
|
48
|
+
aot_biomaps-2.9.373.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|