AOT-biomaps 2.9.216__tar.gz → 2.9.218__tar.gz

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.

Files changed (48) hide show
  1. {aot_biomaps-2.9.216 → aot_biomaps-2.9.218}/AOT_biomaps/AOT_Experiment/_mainExperiment.py +29 -14
  2. {aot_biomaps-2.9.216 → aot_biomaps-2.9.218}/AOT_biomaps/AOT_Recon/AOT_PotentialFunctions/RelativeDifferences.py +10 -14
  3. {aot_biomaps-2.9.216 → aot_biomaps-2.9.218}/AOT_biomaps/__init__.py +3 -1
  4. {aot_biomaps-2.9.216 → aot_biomaps-2.9.218}/AOT_biomaps.egg-info/PKG-INFO +1 -1
  5. {aot_biomaps-2.9.216 → aot_biomaps-2.9.218}/PKG-INFO +1 -1
  6. {aot_biomaps-2.9.216 → aot_biomaps-2.9.218}/setup.py +3 -1
  7. {aot_biomaps-2.9.216 → aot_biomaps-2.9.218}/AOT_biomaps/AOT_Acoustic/AcousticEnums.py +0 -0
  8. {aot_biomaps-2.9.216 → aot_biomaps-2.9.218}/AOT_biomaps/AOT_Acoustic/AcousticTools.py +0 -0
  9. {aot_biomaps-2.9.216 → aot_biomaps-2.9.218}/AOT_biomaps/AOT_Acoustic/FocusedWave.py +0 -0
  10. {aot_biomaps-2.9.216 → aot_biomaps-2.9.218}/AOT_biomaps/AOT_Acoustic/IrregularWave.py +0 -0
  11. {aot_biomaps-2.9.216 → aot_biomaps-2.9.218}/AOT_biomaps/AOT_Acoustic/PlaneWave.py +0 -0
  12. {aot_biomaps-2.9.216 → aot_biomaps-2.9.218}/AOT_biomaps/AOT_Acoustic/StructuredWave.py +0 -0
  13. {aot_biomaps-2.9.216 → aot_biomaps-2.9.218}/AOT_biomaps/AOT_Acoustic/__init__.py +0 -0
  14. {aot_biomaps-2.9.216 → aot_biomaps-2.9.218}/AOT_biomaps/AOT_Acoustic/_mainAcoustic.py +0 -0
  15. {aot_biomaps-2.9.216 → aot_biomaps-2.9.218}/AOT_biomaps/AOT_Experiment/Focus.py +0 -0
  16. {aot_biomaps-2.9.216 → aot_biomaps-2.9.218}/AOT_biomaps/AOT_Experiment/Tomography.py +0 -0
  17. {aot_biomaps-2.9.216 → aot_biomaps-2.9.218}/AOT_biomaps/AOT_Experiment/__init__.py +0 -0
  18. {aot_biomaps-2.9.216 → aot_biomaps-2.9.218}/AOT_biomaps/AOT_Optic/Absorber.py +0 -0
  19. {aot_biomaps-2.9.216 → aot_biomaps-2.9.218}/AOT_biomaps/AOT_Optic/Laser.py +0 -0
  20. {aot_biomaps-2.9.216 → aot_biomaps-2.9.218}/AOT_biomaps/AOT_Optic/OpticEnums.py +0 -0
  21. {aot_biomaps-2.9.216 → aot_biomaps-2.9.218}/AOT_biomaps/AOT_Optic/__init__.py +0 -0
  22. {aot_biomaps-2.9.216 → aot_biomaps-2.9.218}/AOT_biomaps/AOT_Optic/_mainOptic.py +0 -0
  23. {aot_biomaps-2.9.216 → aot_biomaps-2.9.218}/AOT_biomaps/AOT_Recon/AOT_Optimizers/DEPIERRO.py +0 -0
  24. {aot_biomaps-2.9.216 → aot_biomaps-2.9.218}/AOT_biomaps/AOT_Recon/AOT_Optimizers/LS.py +0 -0
  25. {aot_biomaps-2.9.216 → aot_biomaps-2.9.218}/AOT_biomaps/AOT_Recon/AOT_Optimizers/MAPEM.py +0 -0
  26. {aot_biomaps-2.9.216 → aot_biomaps-2.9.218}/AOT_biomaps/AOT_Recon/AOT_Optimizers/MLEM.py +0 -0
  27. {aot_biomaps-2.9.216 → aot_biomaps-2.9.218}/AOT_biomaps/AOT_Recon/AOT_Optimizers/PDHG.py +0 -0
  28. {aot_biomaps-2.9.216 → aot_biomaps-2.9.218}/AOT_biomaps/AOT_Recon/AOT_Optimizers/__init__.py +0 -0
  29. {aot_biomaps-2.9.216 → aot_biomaps-2.9.218}/AOT_biomaps/AOT_Recon/AOT_PotentialFunctions/Huber.py +0 -0
  30. {aot_biomaps-2.9.216 → aot_biomaps-2.9.218}/AOT_biomaps/AOT_Recon/AOT_PotentialFunctions/Quadratic.py +0 -0
  31. {aot_biomaps-2.9.216 → aot_biomaps-2.9.218}/AOT_biomaps/AOT_Recon/AOT_PotentialFunctions/__init__.py +0 -0
  32. {aot_biomaps-2.9.216 → aot_biomaps-2.9.218}/AOT_biomaps/AOT_Recon/AlgebraicRecon.py +0 -0
  33. {aot_biomaps-2.9.216 → aot_biomaps-2.9.218}/AOT_biomaps/AOT_Recon/AnalyticRecon.py +0 -0
  34. {aot_biomaps-2.9.216 → aot_biomaps-2.9.218}/AOT_biomaps/AOT_Recon/BayesianRecon.py +0 -0
  35. {aot_biomaps-2.9.216 → aot_biomaps-2.9.218}/AOT_biomaps/AOT_Recon/DeepLearningRecon.py +0 -0
  36. {aot_biomaps-2.9.216 → aot_biomaps-2.9.218}/AOT_biomaps/AOT_Recon/PrimalDualRecon.py +0 -0
  37. {aot_biomaps-2.9.216 → aot_biomaps-2.9.218}/AOT_biomaps/AOT_Recon/ReconEnums.py +0 -0
  38. {aot_biomaps-2.9.216 → aot_biomaps-2.9.218}/AOT_biomaps/AOT_Recon/ReconTools.py +0 -0
  39. {aot_biomaps-2.9.216 → aot_biomaps-2.9.218}/AOT_biomaps/AOT_Recon/__init__.py +0 -0
  40. {aot_biomaps-2.9.216 → aot_biomaps-2.9.218}/AOT_biomaps/AOT_Recon/_mainRecon.py +0 -0
  41. {aot_biomaps-2.9.216 → aot_biomaps-2.9.218}/AOT_biomaps/Config.py +0 -0
  42. {aot_biomaps-2.9.216 → aot_biomaps-2.9.218}/AOT_biomaps/Settings.py +0 -0
  43. {aot_biomaps-2.9.216 → aot_biomaps-2.9.218}/AOT_biomaps.egg-info/SOURCES.txt +0 -0
  44. {aot_biomaps-2.9.216 → aot_biomaps-2.9.218}/AOT_biomaps.egg-info/dependency_links.txt +0 -0
  45. {aot_biomaps-2.9.216 → aot_biomaps-2.9.218}/AOT_biomaps.egg-info/requires.txt +0 -0
  46. {aot_biomaps-2.9.216 → aot_biomaps-2.9.218}/AOT_biomaps.egg-info/top_level.txt +0 -0
  47. {aot_biomaps-2.9.216 → aot_biomaps-2.9.218}/README.md +0 -0
  48. {aot_biomaps-2.9.216 → aot_biomaps-2.9.218}/setup.cfg +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
- # Extraction des paramètres
298
- n_events = int([line.split(":")[1].strip() for line in cdh_content if "Number of events" in line][0])
299
- n_acquisitions = int([line.split(":")[1].strip() for line in cdh_content if "Number of acquisitions per event" in line][0])
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 avec la bonne forme : (n_acquisitions, n_events)
303
- AOsignal_matrix = np.zeros((n_acquisitions, n_events), dtype=np.float32)
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
- with open(AOsignalPath.replace(".cdh", ".cdf"), "rb") as file:
306
- hex_length = (num_elements + 3) // 4
307
- for event in range(n_events):
308
- file.read(hex_length // 2) # Sauter l'en-tête de l'événement
309
- signal = np.frombuffer(file.read(n_acquisitions * 4), dtype=np.float32)
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
- AOsignal_matrix = AOsignal_matrix
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): {1/self.AcousticFields[0].kgrid.dt}\n"
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
- return grad_U, hess_U
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
- return grad_U, hess_U
57
+ # Compute U_value
58
+ U_value = 0.5 * psi_pair.sum()
59
+ return grad_U, hess_U, U_value
@@ -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.216'
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
  Metadata-Version: 2.4
2
2
  Name: AOT_biomaps
3
- Version: 2.9.216
3
+ Version: 2.9.218
4
4
  Summary: Acousto-Optic Tomography
5
5
  Home-page: https://github.com/LucasDuclos/AcoustoOpticTomography
6
6
  Author: Lucas Duclos
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: AOT_biomaps
3
- Version: 2.9.216
3
+ Version: 2.9.218
4
4
  Summary: Acousto-Optic Tomography
5
5
  Home-page: https://github.com/LucasDuclos/AcoustoOpticTomography
6
6
  Author: Lucas Duclos
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
2
2
 
3
3
  setup(
4
4
  name='AOT_biomaps',
5
- version='2.9.216',
5
+ version='2.9.218',
6
6
  packages=find_packages(),
7
7
  include_package_data=True,
8
8
  install_requires=[
@@ -225,6 +225,8 @@ setup(
225
225
 
226
226
 
227
227
 
228
+
229
+
228
230
 
229
231
 
230
232
 
File without changes
File without changes