AOT-biomaps 2.9.216__py3-none-any.whl → 2.9.218__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.
- AOT_biomaps/AOT_Experiment/_mainExperiment.py +29 -14
- AOT_biomaps/AOT_Recon/AOT_PotentialFunctions/RelativeDifferences.py +10 -14
- AOT_biomaps/__init__.py +3 -1
- {aot_biomaps-2.9.216.dist-info → aot_biomaps-2.9.218.dist-info}/METADATA +1 -1
- {aot_biomaps-2.9.216.dist-info → aot_biomaps-2.9.218.dist-info}/RECORD +7 -7
- {aot_biomaps-2.9.216.dist-info → aot_biomaps-2.9.218.dist-info}/WHEEL +0 -0
- {aot_biomaps-2.9.216.dist-info → aot_biomaps-2.9.218.dist-info}/top_level.txt +0 -0
|
@@ -293,25 +293,40 @@ class Experiment(ABC):
|
|
|
293
293
|
if AOsignalPath.endswith(".cdh"):
|
|
294
294
|
with open(AOsignalPath, "r") as file:
|
|
295
295
|
cdh_content = file.readlines()
|
|
296
|
+
|
|
297
|
+
cdf_path = AOsignalPath.replace(".cdh", ".cdf")
|
|
296
298
|
|
|
297
|
-
#
|
|
298
|
-
|
|
299
|
-
|
|
299
|
+
# Extraire les paramètres depuis le fichier .cdh
|
|
300
|
+
n_scans = int([line.split(":")[1].strip() for line in cdh_content if "Number of events" in line][0])
|
|
301
|
+
n_acquisitions_per_event = int([line.split(":")[1].strip() for line in cdh_content if "Number of acquisitions per event" in line][0])
|
|
300
302
|
num_elements = int([line.split(":")[1].strip() for line in cdh_content if "Number of US transducers" in line][0])
|
|
301
303
|
|
|
302
|
-
# Initialisation
|
|
303
|
-
|
|
304
|
+
# Initialisation des structures
|
|
305
|
+
AO_signal = np.zeros((n_acquisitions_per_event, n_scans), dtype=np.float32)
|
|
306
|
+
active_lists = []
|
|
307
|
+
angles = []
|
|
308
|
+
|
|
309
|
+
# Lecture du fichier binaire
|
|
310
|
+
with open(cdf_path, "rb") as file:
|
|
311
|
+
for j in trange(n_scans, desc="Lecture des événements"):
|
|
312
|
+
# Lire l'activeList : 48 caractères hex = 24 bytes
|
|
313
|
+
active_list_bytes = file.read(24)
|
|
314
|
+
active_list_hex = active_list_bytes.hex()
|
|
315
|
+
active_lists.append(active_list_hex)
|
|
316
|
+
|
|
317
|
+
# Lire l'angle (1 byte signé)
|
|
318
|
+
angle_byte = file.read(1)
|
|
319
|
+
angle = np.frombuffer(angle_byte, dtype=np.int8)[0]
|
|
320
|
+
angles.append(angle)
|
|
304
321
|
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
AOsignal_matrix[:, event] = signal # Remplir par colonne
|
|
322
|
+
# Lire le signal AO (float32)
|
|
323
|
+
data = np.frombuffer(file.read(n_acquisitions_per_event * 4), dtype=np.float32)
|
|
324
|
+
if len(data) != n_acquisitions_per_event:
|
|
325
|
+
raise ValueError(f"Erreur à l'événement {j} : attendu {n_acquisitions_per_event}, obtenu {len(data)}")
|
|
326
|
+
AO_signal[:, j] = data
|
|
311
327
|
|
|
312
|
-
|
|
328
|
+
return AO_signal
|
|
313
329
|
|
|
314
|
-
return AOsignal_matrix
|
|
315
330
|
|
|
316
331
|
elif AOsignalPath.endswith(".npy"):
|
|
317
332
|
return np.load(AOsignalPath) # Supposé déjà au bon format
|
|
@@ -348,7 +363,7 @@ class Experiment(ABC):
|
|
|
348
363
|
f"Number of acquisitions per event: {AO_signal.shape[0]}\n"
|
|
349
364
|
f"Start time (s): 0\n"
|
|
350
365
|
f"Duration (s): 1\n"
|
|
351
|
-
f"Acquisition frequency (Hz): {
|
|
366
|
+
f"Acquisition frequency (Hz): {self.params.acoustic['f_saving']}\n"
|
|
352
367
|
f"Data mode: histogram\n"
|
|
353
368
|
f"Data type: AOT\n"
|
|
354
369
|
f"Number of US transducers: {self.params.acoustic['num_elements']}"
|
|
@@ -9,26 +9,24 @@ def _Omega_RELATIVE_DIFFERENCE_CPU(theta_flat, index, values, gamma):
|
|
|
9
9
|
theta_k = theta_flat[k_idx]
|
|
10
10
|
diff = theta_k - theta_j
|
|
11
11
|
abs_diff = np.abs(diff)
|
|
12
|
-
|
|
13
12
|
denom = theta_k + theta_j + gamma * abs_diff + 1e-8
|
|
14
13
|
num = diff ** 2
|
|
15
|
-
|
|
14
|
+
psi_pair = num / denom
|
|
15
|
+
psi_pair = values * psi_pair
|
|
16
16
|
# First derivative ∂U/∂θ_j
|
|
17
17
|
dpsi = (2 * diff * denom - num * (1 + gamma * np.sign(diff))) / (denom ** 2)
|
|
18
18
|
grad_pair = values * (-dpsi) # Note the negative sign: U contains ψ(θ_k, θ_j), seeking ∂/∂θ_j
|
|
19
|
-
|
|
20
19
|
# Second derivative ∂²U/∂θ_j² (numerically stable, approximate treatment)
|
|
21
20
|
d2psi = (2 * denom ** 2 - 4 * diff * denom * (1 + gamma * np.sign(diff))
|
|
22
21
|
+ 2 * num * (1 + gamma * np.sign(diff)) ** 2) / (denom ** 3 + 1e-8)
|
|
23
22
|
hess_pair = values * d2psi
|
|
24
|
-
|
|
25
23
|
grad_U = np.zeros_like(theta_flat)
|
|
26
24
|
hess_U = np.zeros_like(theta_flat)
|
|
27
|
-
|
|
28
25
|
np.add.at(grad_U, j_idx, grad_pair)
|
|
29
26
|
np.add.at(hess_U, j_idx, hess_pair)
|
|
30
|
-
|
|
31
|
-
|
|
27
|
+
# Compute U_value
|
|
28
|
+
U_value = 0.5 * np.sum(psi_pair)
|
|
29
|
+
return grad_U, hess_U, U_value
|
|
32
30
|
|
|
33
31
|
def _Omega_RELATIVE_DIFFERENCE_GPU(theta_flat, index, values, device, gamma):
|
|
34
32
|
j_idx, k_idx = index
|
|
@@ -38,26 +36,24 @@ def _Omega_RELATIVE_DIFFERENCE_GPU(theta_flat, index, values, device, gamma):
|
|
|
38
36
|
abs_diff = torch.abs(diff)
|
|
39
37
|
denom = theta_k + theta_j + gamma * abs_diff + 1e-8
|
|
40
38
|
num = diff ** 2
|
|
41
|
-
|
|
39
|
+
psi_pair = num / denom
|
|
40
|
+
psi_pair = values * psi_pair
|
|
42
41
|
# Compute gradient contributions
|
|
43
42
|
dpsi = (2 * diff * denom - num * (1 + gamma * torch.sign(diff))) / (denom ** 2)
|
|
44
43
|
grad_pair = values * (-dpsi)
|
|
45
|
-
|
|
46
44
|
# Compute Hessian contributions
|
|
47
45
|
d2psi = (2 * denom ** 2 - 4 * diff * denom * (1 + gamma * torch.sign(diff))
|
|
48
46
|
+ 2 * num * (1 + gamma * torch.sign(diff)) ** 2) / (denom ** 3 + 1e-8)
|
|
49
47
|
hess_pair = values * d2psi
|
|
50
|
-
|
|
51
48
|
# Initialize gradient and Hessian on the correct device
|
|
52
49
|
grad_U = torch.zeros_like(theta_flat, device=device)
|
|
53
50
|
hess_U = torch.zeros_like(theta_flat, device=device)
|
|
54
|
-
|
|
55
51
|
# Accumulate gradient contributions
|
|
56
52
|
grad_U.index_add_(0, j_idx, grad_pair)
|
|
57
53
|
grad_U.index_add_(0, k_idx, -grad_pair)
|
|
58
|
-
|
|
59
54
|
# Accumulate Hessian contributions
|
|
60
55
|
hess_U.index_add_(0, j_idx, hess_pair)
|
|
61
56
|
hess_U.index_add_(0, k_idx, hess_pair)
|
|
62
|
-
|
|
63
|
-
|
|
57
|
+
# Compute U_value
|
|
58
|
+
U_value = 0.5 * psi_pair.sum()
|
|
59
|
+
return grad_U, hess_U, U_value
|
AOT_biomaps/__init__.py
CHANGED
|
@@ -82,7 +82,7 @@ from .AOT_Recon.AOT_PotentialFunctions.RelativeDifferences import *
|
|
|
82
82
|
from .Config import config
|
|
83
83
|
from .Settings import *
|
|
84
84
|
|
|
85
|
-
__version__ = '2.9.
|
|
85
|
+
__version__ = '2.9.218'
|
|
86
86
|
__process__ = config.get_process()
|
|
87
87
|
|
|
88
88
|
def initialize(process=None):
|
|
@@ -250,6 +250,8 @@ def initialize(process=None):
|
|
|
250
250
|
|
|
251
251
|
|
|
252
252
|
|
|
253
|
+
|
|
254
|
+
|
|
253
255
|
|
|
254
256
|
|
|
255
257
|
|
|
@@ -1,6 +1,6 @@
|
|
|
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=HMYPFvrPIjzAVomxi4zg2354At0P_OdheBIYMQ7S8PE,4306
|
|
4
4
|
AOT_biomaps/AOT_Acoustic/AcousticEnums.py,sha256=s5kXa6jKzbS4btwbubrVcynLOr0yg5tth5vL_FGfbMk,1802
|
|
5
5
|
AOT_biomaps/AOT_Acoustic/AcousticTools.py,sha256=al7xXKMY5e-qQQ7nrQVPVAmqYiB320OluNlY6ti8iKc,7539
|
|
6
6
|
AOT_biomaps/AOT_Acoustic/FocusedWave.py,sha256=3kGKKDx_3Msy5COYqIwzROPORGWvNjw8UsDanBfkMXE,11037
|
|
@@ -12,7 +12,7 @@ AOT_biomaps/AOT_Acoustic/_mainAcoustic.py,sha256=RdmhRF1i0KAlpsP7_wnZ7F4J27br3eU
|
|
|
12
12
|
AOT_biomaps/AOT_Experiment/Focus.py,sha256=B2nBawmv-NG2AWJx9zgQ8GlN6aFB9FwTSqX-M-phKXg,3193
|
|
13
13
|
AOT_biomaps/AOT_Experiment/Tomography.py,sha256=LoQ304X9pUwpGn_BqNx1JijRFBFtI5Vz2R7bFIKyYKM,20954
|
|
14
14
|
AOT_biomaps/AOT_Experiment/__init__.py,sha256=H9zMLeBLA6uhbaHohAa-2u5mDDxqJi8oE5c6tShdQp8,308
|
|
15
|
-
AOT_biomaps/AOT_Experiment/_mainExperiment.py,sha256=
|
|
15
|
+
AOT_biomaps/AOT_Experiment/_mainExperiment.py,sha256=1iB1gqWuPFE_jPUPQI9bb380qPmMP1FLE3SSLMlB5xw,24678
|
|
16
16
|
AOT_biomaps/AOT_Optic/Absorber.py,sha256=jEodzRy7gkEH-wbazVasRQiri0dU16BfapmR-qnTSvM,867
|
|
17
17
|
AOT_biomaps/AOT_Optic/Laser.py,sha256=uzQwxswjU0kZWix3CmZLoWmhsBa3VhN27STprNv-xB8,2986
|
|
18
18
|
AOT_biomaps/AOT_Optic/OpticEnums.py,sha256=b349_JyjHqQohmjK4Wke-A_HLGaqb3_BKbyUqFC4jxY,499
|
|
@@ -35,9 +35,9 @@ AOT_biomaps/AOT_Recon/AOT_Optimizers/PDHG.py,sha256=5w4klYKAct9_gnlyocIiJfDrQUdz
|
|
|
35
35
|
AOT_biomaps/AOT_Recon/AOT_Optimizers/__init__.py,sha256=tNGVulINaqQZzcs5cvCMAT5ypGdoFWRnxtl9y7ePECk,106
|
|
36
36
|
AOT_biomaps/AOT_Recon/AOT_PotentialFunctions/Huber.py,sha256=dRd1t5OBag_gVmfji3L0QrA1GJ_702LcCkLH32Bot0M,3285
|
|
37
37
|
AOT_biomaps/AOT_Recon/AOT_PotentialFunctions/Quadratic.py,sha256=wTbzcXxMdEl9ReEXrL43DOJQecokBwJYU_s2kQUASZY,2545
|
|
38
|
-
AOT_biomaps/AOT_Recon/AOT_PotentialFunctions/RelativeDifferences.py,sha256=
|
|
38
|
+
AOT_biomaps/AOT_Recon/AOT_PotentialFunctions/RelativeDifferences.py,sha256=ZlWaKsNPCMfy4fWxYFT2pSoKMbysQkJH4N1WbbWncq4,2493
|
|
39
39
|
AOT_biomaps/AOT_Recon/AOT_PotentialFunctions/__init__.py,sha256=RwrJdLOFbAFBFnRxo5xdlOyeZgtQRDaRWDN9-uCGUiY,84
|
|
40
|
-
aot_biomaps-2.9.
|
|
41
|
-
aot_biomaps-2.9.
|
|
42
|
-
aot_biomaps-2.9.
|
|
43
|
-
aot_biomaps-2.9.
|
|
40
|
+
aot_biomaps-2.9.218.dist-info/METADATA,sha256=uTjKv1z3cj_E1nhqYtF1stF8OyJjSb5QJzQMo3aYGHU,663
|
|
41
|
+
aot_biomaps-2.9.218.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
42
|
+
aot_biomaps-2.9.218.dist-info/top_level.txt,sha256=6STF-lT4kaAnBHJYCripmN5mZABoHjMuY689JdiDphk,12
|
|
43
|
+
aot_biomaps-2.9.218.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|