EFISH E-field Reconstruction
Decoder-DeepONet (DDON) · Stable model: v1.0
DDON is designed for vertically polarized EFISH signals.
MAT:
Profile_Px.Px = \([z,\,P_x]\), size \((109,2)\): normalized \(z\) and normalized EFISH \(P_x\).
Profile_Px.u, size \((109,1)\): phase-mismatch parameter \(u\).
Profile_Px.Ex, size \((109,1)\): normalized benchmark electric field \(E_x\) (optional).
CSV: exactly 109 points of normalized \(z\) and normalized EFISH \(P\).
Note:
The input profiles \(P(z)\), \(E(z)\), and coordinate \(z\) should be pre-normalized and interpolated (to 109 points) following the preprocessing procedure in README.md.
MATLAB preprocessing sample
% Raw experimental data:
% z_raw : measurement position
% Px_raw : measured EFISH profile
% zR : Rayleigh range
% delta_k : wave-vector mismatch
z_over_zR = z_raw ./ zR;
% Recommended 109-point DDON grid
z_grid = [-50:2:-24, -22:1:-16, -15:0.5:-1.5, ...
-1:0.2:1, 1.5:0.5:15, 16:1:22, 24:2:50]';
% Interpolate EFISH profile and normalize
Px = interp1(z_over_zR, Px_raw, z_grid, 'linear', 0);
Px = Px ./ max(Px);
% Normalize coordinate
z = z_grid ./ 50;
% Physical phase-mismatch parameter (do not normalize manually)
u = delta_k * zR;
% Prepare MAT structure
Profile_Px.Px = [z(:), Px(:)]; % 109 x 2
Profile_Px.u = u * ones(109,1); % 109 x 1
% Optional benchmark electric field:
% Ex = interp1(zE_over_zR, Ex_raw, z_grid, 'linear', 0);
% Ex = Ex ./ max(Ex);
% Profile_Px.Ex = Ex(:); % 109 x 1
save('Efish_vertical.mat', 'Profile_Px');
Prediction
Local Python Package
If you want to run DDON locally, especially for predictions of multiple EFISH profiles, install the lightweight ONNX package:
pip install ddon-efish
Example using a MATLAB MAT file:
from ddon import DDON
from scipy.io import loadmat
import numpy as np
mat = loadmat(
"Efish_vertical.mat",
squeeze_me=True,
struct_as_record=False
)
Profile = mat["Profile_Px"]
values = np.asarray(Profile.Px) # [z, Px], shape (109, 2)
u = np.asarray(Profile.u).reshape(-1)[0]
model = DDON()
E = model.predict(values=values, u=u)
print(E)