retardance_pr_p, azimuth_p, theta_p = wo.scattering_potential_tensor_to_3D_orientation_PN(
    f_tensor, material_type='positive', reg_ret_pr=reg_ret_pr)
retardance_pr_n, azimuth_n, theta_n = wo.scattering_potential_tensor_to_3D_orientation_PN(
    f_tensor, material_type='negative', reg_ret_pr=reg_ret_pr)
retardance_pr = np.array([retardance_pr_p, retardance_pr_n])
azimuth = np.array([azimuth_p, azimuth_n])
theta = np.array([theta_p, theta_n])

p_mat_map = wo.optic_sign_probability(mat_map, mat_map_thres=0.04)
phase = wo.phase_inc_correction(f_tensor[0], retardance_pr[0], theta[0])
phase_PT, absorption_PT, retardance_pr_PT = [
    wo.unit_conversion_from_scattering_potential_to_permittivity(
        SP_array, lambda_illu, n_media=n_media, imaging_mode='3D')
    for SP_array in [phase, f_tensor[1].copy(), retardance_pr]
]
retardance_pr_PT = np.array([((-1)**i) * wo.wavelet_softThreshold(
    ((-1)**i) * retardance_pr_PT[i], 'db8', 0.0002, level=1)
                             for i in range(2)])
orientation_continuity_map = wo.orientation_3D_continuity_map(
    azimuth[0],
    theta[0],
    psz_ps_ratio=z_step / ps,
    avg_px_size=10,
    reg_ret_pr=1e-1)
retardance_pr_PT *= orientation_continuity_map[np.newaxis, ...]

# save results to zarr array
writer = WaveorderWriter(output_path, hcs=False, hcs_meta=None, verbose=True)
writer.create_zarr_root('uPTI_physical.zarr')

position = 0
chan_names_phys = [
retardance_pr_p, azimuth_p, theta_p = wo.scattering_potential_tensor_to_3D_orientation_PN(
    f_tensor, material_type='positive', reg_ret_pr=reg_ret_pr)
retardance_pr_n, azimuth_n, theta_n = wo.scattering_potential_tensor_to_3D_orientation_PN(
    f_tensor, material_type='negative', reg_ret_pr=reg_ret_pr)
retardance_pr = np.array([retardance_pr_p, retardance_pr_n])
azimuth = np.array([azimuth_p, azimuth_n])
theta = np.array([theta_p, theta_n])

p_mat_map = wo.optic_sign_probability(mat_map, mat_map_thres=0.09)
phase = wo.phase_inc_correction(f_tensor[0], retardance_pr[0], theta[0])
phase_PT, absorption_PT, retardance_pr_PT = [
    wo.unit_conversion_from_scattering_potential_to_permittivity(
        SP_array, lambda_illu, n_media=n_media, imaging_mode='3D')
    for SP_array in [phase, f_tensor[1].copy(), retardance_pr]
]
retardance_pr_PT = np.array([((-1)**i) * wo.wavelet_softThreshold(
    ((-1)**i) * retardance_pr_PT[i], 'db8', 0.004, level=1) for i in range(2)])

# save results to zarr array
writer = WaveorderWriter(output_path, hcs=False, hcs_meta=None, verbose=True)
writer.create_zarr_root('uPTI_physical.zarr')

position = 0
chan_names_phys = [
    'Phase3D', 'Retardance3D', 'Orientation', 'Inclination', 'Optic_sign'
]
phys_data_array = np.transpose(
    np.array([
        phase_PT,
        np.abs(retardance_pr_PT[0]), azimuth[0], theta[0], p_mat_map
    ]), (0, 3, 1, 2))[np.newaxis, ...]
data_shape_phys = phys_data_array.shape