From 82e1e1d7a1ebf4c65b03bd57195ad69776d962a3 Mon Sep 17 00:00:00 2001 From: Braden Date: Sun, 17 Mar 2024 10:34:35 -0600 Subject: [PATCH 01/16] Removed unused output hdf file --- .../screen_distortion_data_100_100.h5 | Bin 354408 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 opencsp/app/sofast/calibration/test/data/output/CalibrationScreenPosition/screen_distortion_data_100_100.h5 diff --git a/opencsp/app/sofast/calibration/test/data/output/CalibrationScreenPosition/screen_distortion_data_100_100.h5 b/opencsp/app/sofast/calibration/test/data/output/CalibrationScreenPosition/screen_distortion_data_100_100.h5 deleted file mode 100644 index 45bd931f606d5cc7167302046ba552e812fd61d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 354408 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 Date: Mon, 18 Mar 2024 11:11:17 -0600 Subject: [PATCH 02/16] Migrated surface_params to directly use Surface2Dxxx. Saving not implimented yet. Fixing merge conflicts. --- .../example_single_facet_data_process.py | 18 ++-- opencsp/app/sofast/lib/ProcessSofastFringe.py | 91 +++++-------------- .../lib/deflectometry/ParamsSlopeSolver.py | 5 + .../ParamsSlopeSolverParaboloid.py | 10 ++ .../deflectometry/ParamsSlopeSolverPlano.py | 11 +++ .../common/lib/deflectometry/SlopeSolver.py | 65 ++----------- 6 files changed, 67 insertions(+), 133 deletions(-) create mode 100644 opencsp/common/lib/deflectometry/ParamsSlopeSolver.py create mode 100644 opencsp/common/lib/deflectometry/ParamsSlopeSolverParaboloid.py create mode 100644 opencsp/common/lib/deflectometry/ParamsSlopeSolverPlano.py diff --git a/example/sofast_fringe/example_single_facet_data_process.py b/example/sofast_fringe/example_single_facet_data_process.py index fc062b9a1..7f2516d48 100644 --- a/example/sofast_fringe/example_single_facet_data_process.py +++ b/example/sofast_fringe/example_single_facet_data_process.py @@ -3,17 +3,18 @@ import matplotlib +from opencsp.app.sofast.lib.DisplayShape import DisplayShape as Display +from opencsp.app.sofast.lib.DefinitionFacet import DefinitionFacet from opencsp.app.sofast.lib.ImageCalibrationScaling import ImageCalibrationScaling from opencsp.app.sofast.lib.MeasurementSofastFringe import ( MeasurementSofastFringe as Measurement, ) from opencsp.app.sofast.lib.ProcessSofastFringe import ProcessSofastFringe as Sofast +from opencsp.app.sofast.lib.SpatialOrientation import SpatialOrientation from opencsp.app.sofast.lib.visualize_setup import visualize_setup from opencsp.common.lib.camera.Camera import Camera from opencsp.common.lib.csp.Facet import Facet -from opencsp.app.sofast.lib.DisplayShape import DisplayShape as Display -from opencsp.app.sofast.lib.DefinitionFacet import DefinitionFacet -from opencsp.app.sofast.lib.SpatialOrientation import SpatialOrientation +from opencsp.common.lib.deflectometry.Surface2DParabolic import Surface2DParabolic from opencsp.common.lib.opencsp_path.opencsp_root_path import opencsp_code_dir import opencsp.common.lib.render.figure_management as fm import opencsp.common.lib.render_control.RenderControlAxis as rca @@ -52,9 +53,8 @@ def example_driver(): facet_data = DefinitionFacet.load_from_json(file_facet) # Define surface definition (parabolic surface) - surface_data = dict( - surface_type='parabolic', - initial_focal_lengths_xy=(300.0, 300), + surface = Surface2DParabolic( + initial_focal_lengths_xy=(300., 300.), robust_least_squares=True, downsample=10, ) @@ -66,10 +66,10 @@ def example_driver(): sofast = Sofast(measurement, camera, display) # Process - sofast.process_optic_singlefacet(facet_data, surface_data) + sofast.process_optic_singlefacet(facet_data, surface) # Calculate focal length from parabolic fit - if surface_data['surface_type'] == 'parabolic': + if surface is Surface2DParabolic: surf_coefs = sofast.data_characterization_facet[0].surf_coefs_facet focal_lengths_xy = [1 / 4 / surf_coefs[2], 1 / 4 / surf_coefs[5]] print('Parabolic fit focal lengths:') @@ -101,7 +101,7 @@ def example_driver(): fig_record.save(dir_save, 'slope_magnitude', 'png') # Save data - sofast.save_to_hdf(f'{dir_save}/data_singlefacet.h5') + # sofast.save_to_hdf(f'{dir_save}/data_singlefacet.h5') if __name__ == '__main__': diff --git a/opencsp/app/sofast/lib/ProcessSofastFringe.py b/opencsp/app/sofast/lib/ProcessSofastFringe.py index c8790bd0f..61813fac7 100644 --- a/opencsp/app/sofast/lib/ProcessSofastFringe.py +++ b/opencsp/app/sofast/lib/ProcessSofastFringe.py @@ -7,23 +7,22 @@ import numpy as np -from opencsp.app.sofast.lib.MeasurementSofastFringe import ( - MeasurementSofastFringe as Measurement, -) -from opencsp.app.sofast.lib.ParamsSofastFringe import ParamsSofastFringe -from opencsp.common.lib.camera.Camera import Camera -from opencsp.common.lib.csp.Facet import Facet -from opencsp.common.lib.csp.FacetEnsemble import FacetEnsemble -from opencsp.common.lib.csp.MirrorPoint import MirrorPoint import opencsp.app.sofast.lib.calculation_data_classes as cdc -from opencsp.app.sofast.lib.DisplayShape import DisplayShape as Display from opencsp.app.sofast.lib.DefinitionEnsemble import DefinitionEnsemble from opencsp.app.sofast.lib.DefinitionFacet import DefinitionFacet +from opencsp.app.sofast.lib.DisplayShape import DisplayShape as Display import opencsp.app.sofast.lib.image_processing as ip +from opencsp.app.sofast.lib.MeasurementSofastFringe import MeasurementSofastFringe as Measurement +from opencsp.app.sofast.lib.ParamsSofastFringe import ParamsSofastFringe import opencsp.app.sofast.lib.process_optics_geometry as po +from opencsp.app.sofast.lib.SpatialOrientation import SpatialOrientation +from opencsp.common.lib.camera.Camera import Camera +from opencsp.common.lib.csp.Facet import Facet +from opencsp.common.lib.csp.FacetEnsemble import FacetEnsemble +from opencsp.common.lib.csp.MirrorPoint import MirrorPoint from opencsp.common.lib.deflectometry.SlopeSolver import SlopeSolver from opencsp.common.lib.deflectometry.SlopeSolverData import SlopeSolverData -from opencsp.app.sofast.lib.SpatialOrientation import SpatialOrientation +from opencsp.common.lib.deflectometry.Surface2DAbstract import Surface2DAbstract from opencsp.common.lib.geometry.RegionXY import RegionXY from opencsp.common.lib.geometry.TransformXYZ import TransformXYZ from opencsp.common.lib.geometry.Uxyz import Uxyz @@ -192,7 +191,7 @@ def __init__( self.data_facet_def: list[DefinitionFacet] = None self.data_ensemble_def: DefinitionEnsemble = None - self.data_surface_params: list[dict] = None + self.data_surfaces: list[Surface2DAbstract] = None self.data_geometry_general: cdc.CalculationDataGeometryGeneral = None self.data_image_processing_general: cdc.CalculationImageProcessingGeneral = None @@ -209,38 +208,6 @@ def help(self) -> None: """Prints Sofast doc string""" print(self.__doc__) - @staticmethod - def _check_surface_data(surf_data: dict) -> None: - """Checks that all necessary fields are present in surface data dict""" - if 'surface_type' not in surf_data.keys(): - raise ValueError('Missing "surface_type" key in surface_data dictionary.') - - if surf_data['surface_type'] == 'parabolic': - fields_exp = [ - 'surface_type', - 'initial_focal_lengths_xy', - 'robust_least_squares', - 'downsample', - ] - elif surf_data['surface_type'] == 'plano': - fields_exp = ['surface_type', 'robust_least_squares', 'downsample'] - else: - raise ValueError( - f'Given surface type {surf_data["surface_type"]} is not supported.' - ) - - for k in surf_data.keys(): - if k in fields_exp: - idx = fields_exp.index(k) - fields_exp.pop(idx) - else: - raise ValueError( - f'Unrecognized field, {k}, in surface_data dictionary.' - ) - - if len(fields_exp) > 0: - raise ValueError(f'Missing fields in surface_data dictionary: {fields_exp}') - def process_optic_undefined(self, surface_data: dict) -> None: """ Processes optic geometry, screen intersection points, and solves @@ -265,7 +232,7 @@ def process_optic_undefined(self, surface_data: dict) -> None: self._solve_slopes([surface_data]) def process_optic_singlefacet( - self, facet_data: DefinitionFacet, surface_data: dict + self, facet_data: DefinitionFacet, surface: Surface2DAbstract ) -> None: """ Processes optic geometry, screen intersection points, and solves @@ -275,13 +242,9 @@ def process_optic_singlefacet( ---------- facet_data : DefinitionFacet Facet data object. - surface_data : dict - See Sofast documentation or Sofast.help() for more details. - + surface_data : Surface2DAbstract + Surface type definition. """ - # Check input data - self._check_surface_data(surface_data) - # Process optic/setup geometry self._process_optic_singlefacet_geometry(facet_data) @@ -289,7 +252,7 @@ def process_optic_singlefacet( self._process_display() # Solve slopes - self._solve_slopes([surface_data]) + self._solve_slopes([surface]) def process_optic_multifacet( self, @@ -563,16 +526,14 @@ def _process_display(self) -> None: v_screen_points_facet ) - def _solve_slopes(self, surface_data: list[dict]) -> None: + def _solve_slopes(self, surfaces: list[Surface2DAbstract]) -> None: """ Solves slopes of each active pixel for each facet. Parameters ---------- - surface_data : list[dict] - List containing one dictionary for each facet being processed. - See SlopeSolver documentation for details. - + surface_data : list[Surface2DAbstract] + List of surface definition classes. """ # Check inputs if self.data_geometry_facet is None: @@ -610,7 +571,7 @@ def _solve_slopes(self, surface_data: list[dict]) -> None: 'dist_optic_screen': self.data_geometry_facet[ facet_idx ].measure_point_screen_distance, - 'surface_data': surface_data[facet_idx], + 'surface': surfaces[facet_idx], 'debug': self.params.slope_solver_data_debug, } @@ -627,7 +588,7 @@ def _solve_slopes(self, surface_data: list[dict]) -> None: self.data_characterization_facet.append(slope_solver.get_data()) # Save input surface parameters data - self.data_surface_params = [s.copy() for s in surface_data] + self.data_surfaces = surfaces def _calculate_facet_pointing( self, reference: Literal['average'] | int = 'average' @@ -820,16 +781,10 @@ def save_to_hdf(self, file: str) -> None: ) # Surface definition - # TODO: make surface_params a data class - for idx_facet, surface_params in enumerate(self.data_surface_params): - data = list(surface_params.values()) - datasets = list(surface_params.keys()) - datasets = [ - f'DataSofastInput/optic_definition/facet_{idx_facet:03d}/surface_definition/' - + d - for d in datasets - ] - save_hdf5_datasets(data, datasets, file) + for idx_facet, surface in enumerate(self.data_surfaces): + prefix = [ + f'DataSofastInput/optic_definition/facet_{idx_facet:03d}/'] + surface.save_as_hdf5(file) # Calculations, one per facet for idx_facet in range(self.num_facets): diff --git a/opencsp/common/lib/deflectometry/ParamsSlopeSolver.py b/opencsp/common/lib/deflectometry/ParamsSlopeSolver.py new file mode 100644 index 000000000..f75e85122 --- /dev/null +++ b/opencsp/common/lib/deflectometry/ParamsSlopeSolver.py @@ -0,0 +1,5 @@ +from abc import ABC + + +class ParamsSlopeSolver(ABC): + pass diff --git a/opencsp/common/lib/deflectometry/ParamsSlopeSolverParaboloid.py b/opencsp/common/lib/deflectometry/ParamsSlopeSolverParaboloid.py new file mode 100644 index 000000000..3dec4258c --- /dev/null +++ b/opencsp/common/lib/deflectometry/ParamsSlopeSolverParaboloid.py @@ -0,0 +1,10 @@ +from dataclasses import dataclass + + +@dataclass +class ParamsSlopeSolverParaboloid: + """SlopeSolver input parameters class for parabolic surface type + """ + initial_focal_lengths_xy: tuple[float, float] + robust_least_squares: bool + downsample: int diff --git a/opencsp/common/lib/deflectometry/ParamsSlopeSolverPlano.py b/opencsp/common/lib/deflectometry/ParamsSlopeSolverPlano.py new file mode 100644 index 000000000..4d95768f6 --- /dev/null +++ b/opencsp/common/lib/deflectometry/ParamsSlopeSolverPlano.py @@ -0,0 +1,11 @@ +from dataclasses import dataclass + +from opencsp.common.lib.deflectometry.ParamsSlopeSolver import ParamsSlopeSolver + + +@dataclass +class ParamsSlopeSolverPlano(ParamsSlopeSolver): + """SlopeSolver input parameters class for plano (perfectly flat) surface type + """ + robust_least_squares: bool + downsample: int diff --git a/opencsp/common/lib/deflectometry/SlopeSolver.py b/opencsp/common/lib/deflectometry/SlopeSolver.py index 2439a9d39..b88579ea6 100644 --- a/opencsp/common/lib/deflectometry/SlopeSolver.py +++ b/opencsp/common/lib/deflectometry/SlopeSolver.py @@ -7,14 +7,16 @@ from opencsp.common.lib.deflectometry.SlopeSolverDataDebug import SlopeSolverDataDebug from opencsp.common.lib.deflectometry.SlopeSolverData import SlopeSolverData import opencsp.common.lib.deflectometry.slope_fitting_2d as sf2 -from opencsp.common.lib.deflectometry.Surface2DParabolic import Surface2DParabolic -from opencsp.common.lib.deflectometry.Surface2DPlano import Surface2DPlano +from opencsp.common.lib.deflectometry.Surface2DAbstract import Surface2DAbstract from opencsp.common.lib.geometry.Uxyz import Uxyz from opencsp.common.lib.geometry.Vxyz import Vxyz from opencsp.common.lib.geometry.TransformXYZ import TransformXYZ class SlopeSolver: + """Class that solves for the surface slopes of optics in deflectometry + systems.""" + def __init__( self, v_optic_cam_optic: Vxyz, @@ -24,9 +26,9 @@ def __init__( v_optic_screen_optic: Vxyz, v_align_point_optic: Vxyz, dist_optic_screen: float, - surface_data: dict, + surface: Surface2DAbstract, debug: SlopeSolverDataDebug = SlopeSolverDataDebug(), - ): + ) -> 'SlopeSolver': """ Initializes the slope solving object. @@ -46,62 +48,13 @@ def __init__( Position of align point in optic coordinates. dist_optic_screen : float Measured optic to screen distance. - surface_data : dict - Dictionary containing surface data information to use when - solving slopes. The data fields depend on the surface fit being - performed. The following options are supported: - - 1) Parabolic fit - surface_type - initial_focal_lengths_xy - robust_least_squares - downsample - 2) Plano fit - surface_type - robust_least_squares - downsample - 3) Spherical fit (will raise NotImplementedError) - surface_type - radius - robust_least_squares - downsample - - Data field descriptions - ----------------------- - surface_type : str {'parabolic', 'plano', 'spherical'} - The type of surface being characterized - initial_focal_lengths_xy : list[tuple(float, float)] - The focal lengths to use as the starting point for the - fitting algorithm. - robust_least_squares : bool - To use robust least squares fitting, or just least squares - fitting. - downsample : int - The amount to downsample data for surface fitting - radius : float - The initial radius to use as the starting point for the - fitting algorithm. + surface : Surface2DAbstract + 2D surface definition class. debug: SlopeSolverDataDebug SlopeSolverDataDebug object for debugging. - """ - # Instantiate surface fit object depending on fit type - surface_data_copy = surface_data.copy() - self.surface_type = surface_data_copy.pop('surface_type') - if self.surface_type == 'parabolic': - self.surface = Surface2DParabolic(**surface_data_copy) - elif self.surface_type == 'plano': - self.surface = Surface2DPlano(**surface_data_copy) - elif self.surface_type == 'spherical': - raise NotImplementedError( - 'Currently, "spherical" surface type is not implemented.' - ) - else: - raise ValueError( - f'Given surface_type "{self.surface_type:s}" not supported.' - ) - # Store inputs in class + self.surface = surface self.v_optic_cam_optic = v_optic_cam_optic self.u_active_pixel_pointing_optic = u_active_pixel_pointing_optic self.u_measure_pixel_pointing_optic = u_measure_pixel_pointing_optic From fa166af736c61bf4cfa0bcc2ad4501855960aebd Mon Sep 17 00:00:00 2001 From: Braden Date: Mon, 18 Mar 2024 14:02:27 -0600 Subject: [PATCH 03/16] Added HDF5 IO abstract classes to hdf5_tools Fixed merge conflicts in hdf5 tools --- opencsp/common/lib/tool/hdf5_tools.py | 40 +++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/opencsp/common/lib/tool/hdf5_tools.py b/opencsp/common/lib/tool/hdf5_tools.py index 32f9ce0df..abda26bfa 100644 --- a/opencsp/common/lib/tool/hdf5_tools.py +++ b/opencsp/common/lib/tool/hdf5_tools.py @@ -1,6 +1,8 @@ +from abc import abstractmethod, ABC +import os + import h5py import numpy as np -import os import opencsp.common.lib.tool.file_tools as ft import opencsp.common.lib.tool.image_tools as it @@ -205,8 +207,7 @@ def unzip(hdf5_path_name_ext: str, destination_dir: str, dataset_format='npy'): aspect_ratio = max(shape[0], shape[1]) / min(shape[0], shape[1]) if (shape[0] >= 10 and shape[1] >= 10) and (aspect_ratio < 10.001): dataset_path_name_ext = _create_dataset_path( - hdf5_dir, possible_images[i][0], ".png" - ) + hdf5_dir, possible_images[i][0], ".png") # assumed grayscale or RGB if (len(shape) == 2) or (shape[2] in [1, 3]): img = it.numpy_to_image(np_image) @@ -252,3 +253,36 @@ def unzip(hdf5_path_name_ext: str, destination_dir: str, dataset_format='npy'): np.savetxt(dataset_path_name + ".csv", squeezed, delimiter=",") return hdf5_dir + + +class HDF5_SaveAbstract(ABC): + """Abstract class for saving to HDF5 format""" + + @abstractmethod + def save_to_hdf(self, file: str, prefix: str = ''): + """Saves data to given file. Data is stored as: PREFIX + Folder/Field_1 + + Parameters + ---------- + file : str + HDF file to save to + prefix : str + Prefix to append to folder path within HDF file (folders must be separated by "/") + """ + + +class HDF5_IO_Abstract(HDF5_SaveAbstract): + """Abstract class for loading from HDF5 format""" + + @classmethod + @abstractmethod + def load_from_hdf(cls, file: str, prefix: str = ''): + """Loads data from given file. Assumes data is stored as: PREFIX + Folder/Field_1 + + Parameters + ---------- + file : str + HDF file to save to + prefix : str + Prefix to append to folder path within HDF file (folders must be separated by "/") + """ From 2f7de790df34d73b8daae208ea0fa54c2f8d7f8d Mon Sep 17 00:00:00 2001 From: Braden Date: Mon, 18 Mar 2024 14:02:48 -0600 Subject: [PATCH 04/16] Added save/load methods to Surface2D... classes Fixed merge conflict in test_Surface2D.py --- .../lib/deflectometry/Surface2DAbstract.py | 5 +-- .../lib/deflectometry/Surface2DParabolic.py | 33 +++++++++++++++++++ .../lib/deflectometry/Surface2DPlano.py | 30 +++++++++++++++++ .../lib/deflectometry/test/test_Surface2D.py | 30 ++++++++++------- 4 files changed, 85 insertions(+), 13 deletions(-) diff --git a/opencsp/common/lib/deflectometry/Surface2DAbstract.py b/opencsp/common/lib/deflectometry/Surface2DAbstract.py index 4218d4e60..34ebc5d90 100644 --- a/opencsp/common/lib/deflectometry/Surface2DAbstract.py +++ b/opencsp/common/lib/deflectometry/Surface2DAbstract.py @@ -1,4 +1,4 @@ -from abc import abstractmethod, ABC +from abc import abstractmethod import matplotlib.pyplot as plt import numpy as np @@ -6,9 +6,10 @@ from opencsp.common.lib.geometry.Uxyz import Uxyz from opencsp.common.lib.geometry.Vxyz import Vxyz +from opencsp.common.lib.tool.hdf5_tools import HDF5_IO_Abstract -class Surface2DAbstract(ABC): +class Surface2DAbstract(HDF5_IO_Abstract): """Representation of 2d surface for SOFAST processing""" def __init__(self): diff --git a/opencsp/common/lib/deflectometry/Surface2DParabolic.py b/opencsp/common/lib/deflectometry/Surface2DParabolic.py index 9e44bd9b7..bcb8801b8 100644 --- a/opencsp/common/lib/deflectometry/Surface2DParabolic.py +++ b/opencsp/common/lib/deflectometry/Surface2DParabolic.py @@ -5,6 +5,7 @@ from opencsp.common.lib.deflectometry.Surface2DAbstract import Surface2DAbstract from opencsp.common.lib.geometry.Uxyz import Uxyz from opencsp.common.lib.geometry.Vxyz import Vxyz +from opencsp.common.lib.tool.hdf5_tools import save_hdf5_datasets, load_hdf5_datasets class Surface2DParabolic(Surface2DAbstract): @@ -327,3 +328,35 @@ def shift_all(self, v_align_optic_step: Vxyz) -> None: self.v_optic_cam_optic += v_align_optic_step self.v_screen_points_optic += v_align_optic_step self.v_optic_screen_optic += v_align_optic_step + + def save_to_hdf(self, file: str, prefix: str = ''): + data = [ + self.initial_focal_lengths_xy, + self.robust_least_squares, + self.downsample, + 'parabolic' + ] + datasets = [ + prefix + 'ParamsSurface/initial_focal_lengths_xy', + prefix + 'ParamsSurface/robust_least_squares', + prefix + 'ParamsSurface/downsample', + prefix + 'ParamsSurface/surface_type', + ] + save_hdf5_datasets(data, datasets, file) + + @classmethod + def load_from_hdf(cls, file: str, prefix: str = ''): + # Check surface type + data = load_hdf5_datasets([prefix + 'ParamsSurface/surface_type'], file) + if data['surface_type'] != 'parabolic': + raise ValueError( + f'Surface2DParabolic cannot load surface type, {data["surface_type"]:s}') + + # Load + datasets = [ + prefix + 'ParamsSurface/initial_focal_lengths_xy', + prefix + 'ParamsSurface/robust_least_squares', + prefix + 'ParamsSurface/downsample', + ] + data = load_hdf5_datasets(datasets, file) + return cls(**data) diff --git a/opencsp/common/lib/deflectometry/Surface2DPlano.py b/opencsp/common/lib/deflectometry/Surface2DPlano.py index 41d97851d..2a2a00803 100644 --- a/opencsp/common/lib/deflectometry/Surface2DPlano.py +++ b/opencsp/common/lib/deflectometry/Surface2DPlano.py @@ -5,6 +5,7 @@ from opencsp.common.lib.deflectometry.Surface2DAbstract import Surface2DAbstract from opencsp.common.lib.geometry.Uxyz import Uxyz from opencsp.common.lib.geometry.Vxyz import Vxyz +from opencsp.common.lib.tool.hdf5_tools import save_hdf5_datasets, load_hdf5_datasets class Surface2DPlano(Surface2DAbstract): @@ -230,3 +231,32 @@ def shift_all(self, v_align_optic_step: Vxyz) -> None: self.u_active_pixel_pointing_optic += v_align_optic_step self.u_measure_pixel_pointing_optic += v_align_optic_step self.v_optic_screen_optic += v_align_optic_step + + def save_to_hdf(self, file: str, prefix: str = ''): + data = [ + self.robust_least_squares, + self.downsample, + 'parabolic' + ] + datasets = [ + prefix + 'ParamsSurface/robust_least_squares', + prefix + 'ParamsSurface/downsample', + prefix + 'ParamsSurface/surface_type', + ] + save_hdf5_datasets(data, datasets, file) + + @classmethod + def load_from_hdf(cls, file: str, prefix: str = ''): + # Check surface type + data = load_hdf5_datasets([prefix + 'ParamsSurface/surface_type'], file) + if data['surface_type'] != 'parabolic': + raise ValueError( + f'Surface2DPlano cannot load surface type, {data["surface_type"]:s}') + + # Load + datasets = [ + prefix + 'ParamsSurface/robust_least_squares', + prefix + 'ParamsSurface/downsample', + ] + data = load_hdf5_datasets(datasets, file) + return cls(**data) diff --git a/opencsp/common/lib/deflectometry/test/test_Surface2D.py b/opencsp/common/lib/deflectometry/test/test_Surface2D.py index 1d6bdf6bb..d34c67eb7 100644 --- a/opencsp/common/lib/deflectometry/test/test_Surface2D.py +++ b/opencsp/common/lib/deflectometry/test/test_Surface2D.py @@ -1,6 +1,6 @@ """Unit test suite to test Surface2D type classes """ - +from os.path import dirname, join import unittest import numpy as np @@ -10,12 +10,17 @@ from opencsp.common.lib.deflectometry.Surface2DPlano import Surface2DPlano from opencsp.common.lib.geometry.Uxyz import Uxyz from opencsp.common.lib.geometry.Vxyz import Vxyz +import opencsp.common.lib.tool.file_tools as ft class Test2DSurface(unittest.TestCase): @classmethod - def setup_class(cls): + def setUpClass(cls): + # Generate test data cls.data_test = [generate_2DParabolic(), generate_2DPlano()] + # Save location + cls.dir_save = join(dirname(__file__), 'data/output') + ft.create_directories_if_necessary(cls.dir_save) def test_intersect(self): """Tests the intersection of rays with fit surface.""" @@ -93,6 +98,17 @@ def test_fit_normal(self): # Test np.testing.assert_allclose(n_design.data, data_exp.data) + def test_io(self): + """Test saving to HDF5""" + prefix = 'test_folder/' + for idx, surf in enumerate(self.data_test): + surf_cur: Surface2DAbstract = surf[0] + file = join(self.dir_save, f'test_surface_{idx:d}.h5') + # Test saving + surf_cur.save_to_hdf(file, prefix) + # Test loading + surf_cur.load_from_hdf(file, prefix) + def generate_2DParabolic() -> ( tuple[Surface2DParabolic, Vxyz, np.ndarray, np.ndarray, np.ndarray, Uxyz, Uxyz] @@ -246,12 +262,4 @@ def generate_2DPlano() -> ( if __name__ == '__main__': - Test = Test2DSurface() - Test.setup_class() - - Test.test_intersect() - Test.test_calculate_slopes() - Test.test_fit_slopes() - Test.test_fit_surf() - Test.test_design_normal() - Test.test_fit_normal() + unittest.main() From a12b184a35333d1baee644bc451a85be817723f2 Mon Sep 17 00:00:00 2001 From: Braden Date: Mon, 18 Mar 2024 14:07:53 -0600 Subject: [PATCH 05/16] Single facet stable --- example/sofast_fringe/example_single_facet_data_process.py | 2 +- opencsp/app/sofast/lib/ProcessSofastFringe.py | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/example/sofast_fringe/example_single_facet_data_process.py b/example/sofast_fringe/example_single_facet_data_process.py index 7f2516d48..83ee8f3a2 100644 --- a/example/sofast_fringe/example_single_facet_data_process.py +++ b/example/sofast_fringe/example_single_facet_data_process.py @@ -101,7 +101,7 @@ def example_driver(): fig_record.save(dir_save, 'slope_magnitude', 'png') # Save data - # sofast.save_to_hdf(f'{dir_save}/data_singlefacet.h5') + sofast.save_to_hdf(f'{dir_save}/data_singlefacet.h5') if __name__ == '__main__': diff --git a/opencsp/app/sofast/lib/ProcessSofastFringe.py b/opencsp/app/sofast/lib/ProcessSofastFringe.py index 61813fac7..1d6dfc025 100644 --- a/opencsp/app/sofast/lib/ProcessSofastFringe.py +++ b/opencsp/app/sofast/lib/ProcessSofastFringe.py @@ -28,7 +28,6 @@ from opencsp.common.lib.geometry.Uxyz import Uxyz from opencsp.common.lib.geometry.Vxy import Vxy from opencsp.common.lib.geometry.Vxyz import Vxyz -from opencsp.common.lib.tool.hdf5_tools import save_hdf5_datasets class ProcessSofastFringe: @@ -782,9 +781,9 @@ def save_to_hdf(self, file: str) -> None: # Surface definition for idx_facet, surface in enumerate(self.data_surfaces): - prefix = [ - f'DataSofastInput/optic_definition/facet_{idx_facet:03d}/'] - surface.save_as_hdf5(file) + surface.save_to_hdf( + file, + f'DataSofastInput/optic_definition/facet_{idx_facet:03d}/') # Calculations, one per facet for idx_facet in range(self.num_facets): From 1ffe71de6187e738f58199644014abb64f073005 Mon Sep 17 00:00:00 2001 From: Braden Date: Mon, 18 Mar 2024 14:58:42 -0600 Subject: [PATCH 06/16] Aded missing documentation to process_multifacet_geometry --- .../app/sofast/lib/process_optics_geometry.py | 33 ++++++++++++++++++- opencsp/common/lib/tool/hdf5_tools.py | 2 +- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/opencsp/app/sofast/lib/process_optics_geometry.py b/opencsp/app/sofast/lib/process_optics_geometry.py index ed2597954..aed019f9a 100644 --- a/opencsp/app/sofast/lib/process_optics_geometry.py +++ b/opencsp/app/sofast/lib/process_optics_geometry.py @@ -305,7 +305,7 @@ def process_undefined_geometry( list[cdc.CalculationImageProcessingFacet], cdc.CalculationError, ]: - """Processes optic geometry for undefined deflectrometry measurement + """Processes optic geometry for undefined deflectometry measurement Parameters ---------- @@ -409,6 +409,37 @@ def process_multifacet_geometry( list[cdc.CalculationImageProcessingFacet], cdc.CalculationError, ]: + """Processes optic geometry for multifacet deflectometry measurement + + Parameters + ---------- + facet_data : DefinitionFacet + Facet definition object + ensemble_data : DefinitionEnsemble + Ensemble definition object + mask_raw : ndarray + Raw calculated mask + v_meas_pt_ensemble : Vxyz + Measure point lcoation on ensemble, meters + orientation : SpatialOrientation + SpatialOrientation object + camera : Camera + Camera object + optic_screen_dist : float + Optic to screen distance, meters + params : ParamsOpticGeometry, optional + ParamsOpticGeometry object, by default ParamsOpticGeometry() + debug : DebugOpticsGeometry, optional + DebugOpticsGeometry object, by default DebugOpticsGeometry() + + Returns + ------- + calculation_data_classes.CalculationDataGeometryGeneral + calculation_data_classes.CalculationImageProcessingGeneral + list[calculation_data_classes.CalculationDataGeometryFacet] + list[calculation_data_classes.CalculationImageProcessingFacet] + calculation_data_classes.CalculationError] + """ if debug.debug_active: print( 'Image processing debug on, but is not yet supported for undefined mirrors.' diff --git a/opencsp/common/lib/tool/hdf5_tools.py b/opencsp/common/lib/tool/hdf5_tools.py index abda26bfa..389144b80 100644 --- a/opencsp/common/lib/tool/hdf5_tools.py +++ b/opencsp/common/lib/tool/hdf5_tools.py @@ -259,7 +259,7 @@ class HDF5_SaveAbstract(ABC): """Abstract class for saving to HDF5 format""" @abstractmethod - def save_to_hdf(self, file: str, prefix: str = ''): + def save_to_hdf(self, file: str, prefix: str = '') -> None: """Saves data to given file. Data is stored as: PREFIX + Folder/Field_1 Parameters From ace06201777415a4e07f59e272b8274c905b5c61 Mon Sep 17 00:00:00 2001 From: Braden Date: Mon, 18 Mar 2024 15:03:59 -0600 Subject: [PATCH 07/16] Migrated SofastFringe to use logging and Surface2Dxx classes only. Fixed merge conflicts in multifacet example and ProcessSofastFringe --- .../example_multi_facet_data_process.py | 39 ++++--- .../example_single_facet_data_process.py | 18 +-- .../example_undefined_facet_data_process.py | 26 +++-- opencsp/app/sofast/lib/ProcessSofastFringe.py | 106 +++++++----------- 4 files changed, 86 insertions(+), 103 deletions(-) diff --git a/example/sofast_fringe/example_multi_facet_data_process.py b/example/sofast_fringe/example_multi_facet_data_process.py index 0f2f78e85..b536549aa 100644 --- a/example/sofast_fringe/example_multi_facet_data_process.py +++ b/example/sofast_fringe/example_multi_facet_data_process.py @@ -1,25 +1,27 @@ -import os -from os.path import join +from os.path import join, dirname import matplotlib +from opencsp.app.sofast.lib.DisplayShape import DisplayShape as Display +from opencsp.app.sofast.lib.DefinitionEnsemble import DefinitionEnsemble +from opencsp.app.sofast.lib.DefinitionFacet import DefinitionFacet from opencsp.app.sofast.lib.ImageCalibrationScaling import ImageCalibrationScaling from opencsp.app.sofast.lib.MeasurementSofastFringe import ( MeasurementSofastFringe as Measurement, ) from opencsp.app.sofast.lib.ProcessSofastFringe import ProcessSofastFringe as Sofast +from opencsp.app.sofast.lib.SpatialOrientation import SpatialOrientation from opencsp.app.sofast.lib.visualize_setup import visualize_setup from opencsp.common.lib.camera.Camera import Camera from opencsp.common.lib.csp.FacetEnsemble import FacetEnsemble -from opencsp.app.sofast.lib.DisplayShape import DisplayShape as Display -from opencsp.app.sofast.lib.DefinitionEnsemble import DefinitionEnsemble -from opencsp.app.sofast.lib.DefinitionFacet import DefinitionFacet -from opencsp.app.sofast.lib.SpatialOrientation import SpatialOrientation +from opencsp.common.lib.deflectometry.Surface2DParabolic import Surface2DParabolic from opencsp.common.lib.opencsp_path.opencsp_root_path import opencsp_code_dir import opencsp.common.lib.render.figure_management as fm import opencsp.common.lib.render_control.RenderControlAxis as rca import opencsp.common.lib.render_control.RenderControlFigure as rcfg import opencsp.common.lib.render_control.RenderControlMirror as rcm +import opencsp.common.lib.tool.log_tools as lt +import opencsp.common.lib.tool.file_tools as ft def example_driver(): @@ -44,9 +46,11 @@ def example_driver(): file_ensemble = join(sample_data_dir, 'Ensemble_lab_6x4.json') # Define save dir - dir_save = join(os.path.dirname(__file__), 'data/output/facet_ensemble') - if not os.path.exists(dir_save): - os.makedirs(dir_save) + dir_save = join(dirname(__file__), 'data/output/facet_ensemble') + ft.create_directories_if_necessary(dir_save) + + # Set up logger + lt.logger(join(dir_save, 'log.txt')) # Load data camera = Camera.load_from_hdf(file_camera) @@ -58,12 +62,9 @@ def example_driver(): # Define facet data facet_data = [DefinitionFacet.load_from_json(file_facet)] * ensemble_data.num_facets - # Define surface data (plano) - # surface_data = [dict(surface_type='plano', robust_least_squares=False, downsample=20)] * ensemble_data.num_facets - # Define surface data (parabolic) + # Define surface data surface_data = [ - dict( - surface_type='parabolic', + Surface2DParabolic( initial_focal_lengths_xy=(100.0, 100.0), robust_least_squares=False, downsample=20, @@ -88,12 +89,10 @@ def example_driver(): # Calculate focal length from parabolic fit for idx in range(sofast.num_facets): - if surface_data[idx]['surface_type'] == 'parabolic': - surf_coefs = sofast.data_characterization_facet[idx].surf_coefs_facet - focal_lengths_xy = [1 / 4 / surf_coefs[2], 1 / 4 / surf_coefs[5]] - print('Parabolic fit focal lengths:') - print(f' X {focal_lengths_xy[0]:.3f} m') - print(f' Y {focal_lengths_xy[1]:.3f} m') + surf_coefs = sofast.data_characterization_facet[idx].surf_coefs_facet + focal_lengths_xy = [1 / 4 / surf_coefs[2], 1 / 4 / surf_coefs[5]] + lt.info(f'Facet {idx:d} xy focal lengths (meters): ' + f'{focal_lengths_xy[0]:.3f}, {focal_lengths_xy[1]:.3f}') # Get optic representation ensemble: FacetEnsemble = sofast.get_optic() diff --git a/example/sofast_fringe/example_single_facet_data_process.py b/example/sofast_fringe/example_single_facet_data_process.py index 83ee8f3a2..c2798b6c2 100644 --- a/example/sofast_fringe/example_single_facet_data_process.py +++ b/example/sofast_fringe/example_single_facet_data_process.py @@ -19,6 +19,8 @@ import opencsp.common.lib.render.figure_management as fm import opencsp.common.lib.render_control.RenderControlAxis as rca import opencsp.common.lib.render_control.RenderControlFigure as rcfg +import opencsp.common.lib.tool.log_tools as lt +import opencsp.common.lib.tool.file_tools as ft def example_driver(): @@ -42,8 +44,10 @@ def example_driver(): # Define save dir dir_save = join(os.path.dirname(__file__), 'data/output/single_facet') - if not os.path.exists(dir_save): - os.makedirs(dir_save) + ft.create_directories_if_necessary(dir_save) + + # Set up logger + lt.logger(join(dir_save, 'log.txt')) # Load data camera = Camera.load_from_hdf(file_camera) @@ -69,12 +73,10 @@ def example_driver(): sofast.process_optic_singlefacet(facet_data, surface) # Calculate focal length from parabolic fit - if surface is Surface2DParabolic: - surf_coefs = sofast.data_characterization_facet[0].surf_coefs_facet - focal_lengths_xy = [1 / 4 / surf_coefs[2], 1 / 4 / surf_coefs[5]] - print('Parabolic fit focal lengths:') - print(f' X {focal_lengths_xy[0]:.3f} m') - print(f' Y {focal_lengths_xy[1]:.3f} m') + surf_coefs = sofast.data_characterization_facet[0].surf_coefs_facet + focal_lengths_xy = [1 / 4 / surf_coefs[2], 1 / 4 / surf_coefs[5]] + lt.info(f'Facet xy focal lengths (meters): ' + f'{focal_lengths_xy[0]:.3f}, {focal_lengths_xy[1]:.3f}') # Get optic representation facet: Facet = sofast.get_optic() diff --git a/example/sofast_fringe/example_undefined_facet_data_process.py b/example/sofast_fringe/example_undefined_facet_data_process.py index cb8c71f90..42f5bbff2 100644 --- a/example/sofast_fringe/example_undefined_facet_data_process.py +++ b/example/sofast_fringe/example_undefined_facet_data_process.py @@ -11,10 +11,13 @@ from opencsp.app.sofast.lib.SpatialOrientation import SpatialOrientation from opencsp.common.lib.camera.Camera import Camera from opencsp.common.lib.csp.Facet import Facet +from opencsp.common.lib.deflectometry.Surface2DParabolic import Surface2DParabolic from opencsp.common.lib.opencsp_path.opencsp_root_path import opencsp_code_dir import opencsp.common.lib.render.figure_management as fm import opencsp.common.lib.render_control.RenderControlAxis as rca import opencsp.common.lib.render_control.RenderControlFigure as rcfg +import opencsp.common.lib.tool.log_tools as lt +import opencsp.common.lib.tool.file_tools as ft def example_driver(): @@ -37,8 +40,10 @@ def example_driver(): # Save directory dir_save = join(os.path.dirname(__file__), 'data/output/undefined_facet') - if not os.path.exists(dir_save): - os.makedirs(dir_save) + ft.create_directories_if_necessary(dir_save) + + # Set up logger + lt.logger(join(dir_save, 'log.txt')) # Load data camera = Camera.load_from_hdf(file_camera) @@ -47,9 +52,8 @@ def example_driver(): calibration = ImageCalibrationScaling.load_from_hdf(file_calibration) # Define surface definition (parabolic surface) - surface_data = dict( - surface_type='parabolic', - initial_focal_lengths_xy=(300.0, 300), + surface = Surface2DParabolic( + initial_focal_lengths_xy=(300., 300.), robust_least_squares=True, downsample=10, ) @@ -62,15 +66,13 @@ def example_driver(): sofast.params.mask_keep_largest_area = True # Process - sofast.process_optic_undefined(surface_data) + sofast.process_optic_undefined(surface) # Calculate focal length from parabolic fit - if surface_data['surface_type'] == 'parabolic': - surf_coefs = sofast.data_characterization_facet[0].surf_coefs_facet - focal_lengths_xy = [1 / 4 / surf_coefs[2], 1 / 4 / surf_coefs[5]] - print('Parabolic fit focal lengths:') - print(f' X {focal_lengths_xy[0]:.3f} m') - print(f' Y {focal_lengths_xy[1]:.3f} m') + surf_coefs = sofast.data_characterization_facet[0].surf_coefs_facet + focal_lengths_xy = [1 / 4 / surf_coefs[2], 1 / 4 / surf_coefs[5]] + lt.info(f'Facet xy focal lengths (meters): ' + f'{focal_lengths_xy[0]:.3f}, {focal_lengths_xy[1]:.3f}') # Get optic representation facet: Facet = sofast.get_optic() diff --git a/opencsp/app/sofast/lib/ProcessSofastFringe.py b/opencsp/app/sofast/lib/ProcessSofastFringe.py index 1d6dfc025..80a9bfd7b 100644 --- a/opencsp/app/sofast/lib/ProcessSofastFringe.py +++ b/opencsp/app/sofast/lib/ProcessSofastFringe.py @@ -3,7 +3,6 @@ """ from typing import Literal -import warnings import numpy as np @@ -28,9 +27,11 @@ from opencsp.common.lib.geometry.Uxyz import Uxyz from opencsp.common.lib.geometry.Vxy import Vxy from opencsp.common.lib.geometry.Vxyz import Vxyz +from opencsp.common.lib.tool.hdf5_tools import HDF5_SaveAbstract +import opencsp.common.lib.tool.log_tools as lt -class ProcessSofastFringe: +class ProcessSofastFringe(HDF5_SaveAbstract): """Class that processes measurement data captured by a SOFAST system. Computes optic surface slope and saves data to HDF5 format. @@ -207,20 +208,16 @@ def help(self) -> None: """Prints Sofast doc string""" print(self.__doc__) - def process_optic_undefined(self, surface_data: dict) -> None: + def process_optic_undefined(self, surface: Surface2DAbstract) -> None: """ Processes optic geometry, screen intersection points, and solves for slops for undefined optical surface. Parameters ---------- - surface_data : dict - See Sofast documentation or Sofast.help() for more details. - + surface_data : Surface2DAbstract + Surface type definition """ - # Check input data - self._check_surface_data(surface_data) - # Process optic/setup geometry self._process_optic_undefined_geometry() @@ -228,11 +225,11 @@ def process_optic_undefined(self, surface_data: dict) -> None: self._process_display() # Solve slopes - self._solve_slopes([surface_data]) + self._solve_slopes([surface]) - def process_optic_singlefacet( - self, facet_data: DefinitionFacet, surface: Surface2DAbstract - ) -> None: + def process_optic_singlefacet(self, + facet_data: DefinitionFacet, + surface: Surface2DAbstract) -> None: """ Processes optic geometry, screen intersection points, and solves for slops for single facet optic. @@ -253,12 +250,10 @@ def process_optic_singlefacet( # Solve slopes self._solve_slopes([surface]) - def process_optic_multifacet( - self, - facet_data: list[DefinitionFacet], - ensemble_data: DefinitionEnsemble, - surface_data: list[dict], - ) -> None: + def process_optic_multifacet(self, + facet_data: list[DefinitionFacet], + ensemble_data: DefinitionEnsemble, + surfaces: list[Surface2DAbstract]) -> None: """ Processes optic geometry, screen intersection points, and solves for slops for multi-facet optic. @@ -274,11 +269,11 @@ def process_optic_multifacet( """ # Check inputs - if len(facet_data) != len(surface_data): + if len(facet_data) != len(surfaces): raise ValueError( - f'Length of facet_data does not equal length of surface data; facet_data={len(facet_data)}, surface_data={len(surface_data)}' + 'Length of facet_data does not equal length of surfaces' + f'facet_data={len(facet_data)}, surface_data={len(surfaces)}' ) - list(map(self._check_surface_data, surface_data)) # Process optic/setup geometry self._process_optic_multifacet_geometry(facet_data, ensemble_data) @@ -287,7 +282,7 @@ def process_optic_multifacet( self._process_display() # Solve slopes - self._solve_slopes(surface_data) + self._solve_slopes(surfaces) # Calculate facet pointing self._calculate_facet_pointing() @@ -345,9 +340,9 @@ def _process_optic_singlefacet_geometry(self, facet_data: DefinitionFacet) -> No self.optic_type = 'single' if self.params.geometry_data_debug.debug_active: - print('Sofast image processing debug on.') + lt.info('Sofast image processing debug on.') if self.params.slope_solver_data_debug.debug_active: - print('SlopeSolver debug on.') + lt.info('SlopeSolver debug on.') # Calculate raw mask params = [ @@ -387,8 +382,7 @@ def _process_optic_singlefacet_geometry(self, facet_data: DefinitionFacet) -> No def _process_optic_multifacet_geometry( self, facet_data: list[DefinitionFacet], ensemble_data: DefinitionEnsemble ) -> None: - """ - Processes optic geometry for an ensemble of facets. + """Processes optic geometry for an ensemble of facets. Parameters ---------- @@ -396,7 +390,6 @@ def _process_optic_multifacet_geometry( List of DefinitionFacet objects. ensemble_data : DefinitionEnsemble Ensemble data object. - """ # Get number of facets self.num_facets = ensemble_data.num_facets @@ -405,7 +398,8 @@ def _process_optic_multifacet_geometry( # Check inputs if len(facet_data) != self.num_facets: raise ValueError( - f'Given length of facet data is {len(facet_data):d} but ensemble_data expects {ensemble_data.num_facets:d} facets.' + f'Given length of facet data is {len(facet_data):d}' + f'but ensemble_data expects {ensemble_data.num_facets:d} facets.' ) # Calculate mask @@ -418,9 +412,9 @@ def _process_optic_multifacet_geometry( mask_raw = ip.calc_mask_raw(self.measurement.mask_images, *params) if self.params.mask_keep_largest_area: - warnings.warn( - '"keep_largest_area" mask processing option cannot be used for multifacet ensembles. This will be turned off.', - stacklevel=2, + lt.warn( + '"keep_largest_area" mask processing option cannot be used ' + 'for multifacet ensembles. This will be turned off.', ) self.params.mask_keep_largest_area = False @@ -485,9 +479,9 @@ def _process_display(self) -> None: nan_mask = np.isnan(v_screen_points_screen.data).sum(0).astype(bool) mask_bad_pixels = np.zeros(mask_processed.shape, dtype=bool) if np.any(nan_mask): - warnings.warn( - f'{nan_mask.sum():d} / {nan_mask.size:d} points are NANs in calculated screen points for facet {idx_facet:d}. These data points will be removed.', - stacklevel=2, + lt.warn( + f'{nan_mask.sum():d} / {nan_mask.size:d} points are NANs in calculated ' + 'screen points for facet {idx_facet:d}. These data points will be removed.', ) # Make mask of NANs mask_bad_pixels[mask_processed] = nan_mask @@ -745,63 +739,49 @@ def get_optic( else: return facets[0] - def save_to_hdf(self, file: str) -> None: - """ - Saves all processed data to HDF file. See class docstring - for more information on data output format. + def save_to_hdf(self, file: str, prefix: str = ''): + # Log + lt.info(f'Saving SofastFringe data to: {file:s}, in HDF5 folder: "{prefix:s}"') - Parameters - ---------- - file : str - HDF file name. - """ # One per measurement if self.data_error is not None: - self.data_error.save_to_hdf(file, 'DataSofastCalculation/general/') - self.data_geometry_general.save_to_hdf(file, 'DataSofastCalculation/general/') + self.data_error.save_to_hdf(file, f'{prefix:s}DataSofastCalculation/general/') + self.data_geometry_general.save_to_hdf(file, f'{prefix:s}DataSofastCalculation/general/') self.data_image_processing_general.save_to_hdf( - file, 'DataSofastCalculation/general/' - ) + file, f'{prefix:s}DataSofastCalculation/general/') # Sofast parameters - self.params.save_to_hdf(file, 'DataSofastInput/') + self.params.save_to_hdf(file, f'{prefix:s}DataSofastInput/') # Facet definition if self.data_facet_def is not None: for idx_facet, facet_data in enumerate(self.data_facet_def): facet_data.save_to_hdf( - file, f'DataSofastInput/optic_definition/facet_{idx_facet:03d}/' - ) + file, f'{prefix:s}DataSofastInput/optic_definition/facet_{idx_facet:03d}/') # Ensemble definition if self.data_ensemble_def is not None: - self.data_ensemble_def.save_to_hdf( - file, 'DataSofastInput/optic_definition/' - ) + self.data_ensemble_def.save_to_hdf(file, f'{prefix:s}DataSofastInput/optic_definition/') # Surface definition for idx_facet, surface in enumerate(self.data_surfaces): surface.save_to_hdf( file, - f'DataSofastInput/optic_definition/facet_{idx_facet:03d}/') + f'{prefix:s}DataSofastInput/optic_definition/facet_{idx_facet:03d}/') # Calculations, one per facet for idx_facet in range(self.num_facets): # Save facet slope data self.data_characterization_facet[idx_facet].save_to_hdf( - file, f'DataSofastCalculation/facet/facet_{idx_facet:03d}/' - ) + file, f'{prefix:s}DataSofastCalculation/facet/facet_{idx_facet:03d}/') # Save facet geometry data self.data_geometry_facet[idx_facet].save_to_hdf( - file, f'DataSofastCalculation/facet/facet_{idx_facet:03d}/' - ) + file, f'{prefix:s}DataSofastCalculation/facet/facet_{idx_facet:03d}/') # Save facet image processing data self.data_image_processing_facet[idx_facet].save_to_hdf( - file, f'DataSofastCalculation/facet/facet_{idx_facet:03d}/' - ) + file, f'{prefix:s}DataSofastCalculation/facet/facet_{idx_facet:03d}/') if self.data_characterization_ensemble: # Save ensemle data self.data_characterization_ensemble[idx_facet].save_to_hdf( - file, f'DataSofastCalculation/facet/facet_{idx_facet:03d}/' - ) + file, f'{prefix:s}DataSofastCalculation/facet/facet_{idx_facet:03d}/') From 5b3745c4b4f47bdf64bf336cdfd7c82e38cfba0e Mon Sep 17 00:00:00 2001 From: Braden Date: Mon, 18 Mar 2024 15:05:58 -0600 Subject: [PATCH 08/16] Reorganized imports in SofastFringe examples --- example/sofast_fringe/example_single_facet_data_process.py | 5 ++--- .../sofast_fringe/example_undefined_facet_data_process.py | 7 ++++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/example/sofast_fringe/example_single_facet_data_process.py b/example/sofast_fringe/example_single_facet_data_process.py index c2798b6c2..393a526d6 100644 --- a/example/sofast_fringe/example_single_facet_data_process.py +++ b/example/sofast_fringe/example_single_facet_data_process.py @@ -1,5 +1,4 @@ -import os -from os.path import join +from os.path import join, dirname import matplotlib @@ -43,7 +42,7 @@ def example_driver(): file_facet = join(sample_data_dir, 'Facet_NSTTF.json') # Define save dir - dir_save = join(os.path.dirname(__file__), 'data/output/single_facet') + dir_save = join(dirname(__file__), 'data/output/single_facet') ft.create_directories_if_necessary(dir_save) # Set up logger diff --git a/example/sofast_fringe/example_undefined_facet_data_process.py b/example/sofast_fringe/example_undefined_facet_data_process.py index 42f5bbff2..212d69e9a 100644 --- a/example/sofast_fringe/example_undefined_facet_data_process.py +++ b/example/sofast_fringe/example_undefined_facet_data_process.py @@ -1,5 +1,6 @@ -import os -from os.path import join +from os.path import join, dirname + +import matplotlib from opencsp.app.sofast.lib.visualize_setup import visualize_setup from opencsp.app.sofast.lib.ImageCalibrationScaling import ImageCalibrationScaling @@ -39,7 +40,7 @@ def example_driver(): file_calibration = join(sample_data_dir, 'image_calibration.h5') # Save directory - dir_save = join(os.path.dirname(__file__), 'data/output/undefined_facet') + dir_save = join(dirname(__file__), 'data/output/undefined_facet') ft.create_directories_if_necessary(dir_save) # Set up logger From d71af33ebd09b6c0048983ba59e73ead534c1c4f Mon Sep 17 00:00:00 2001 From: Braden Date: Mon, 18 Mar 2024 15:07:30 -0600 Subject: [PATCH 09/16] Changed names of sofastFringe examples --- ...ti_facet_data_process.py => example_process_facet_ensemble.py} | 0 ...ngle_facet_data_process.py => example_process_single_facet.py} | 0 ...d_facet_data_process.py => example_process_undefined_shape.py} | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename example/sofast_fringe/{example_multi_facet_data_process.py => example_process_facet_ensemble.py} (100%) rename example/sofast_fringe/{example_single_facet_data_process.py => example_process_single_facet.py} (100%) rename example/sofast_fringe/{example_undefined_facet_data_process.py => example_process_undefined_shape.py} (100%) diff --git a/example/sofast_fringe/example_multi_facet_data_process.py b/example/sofast_fringe/example_process_facet_ensemble.py similarity index 100% rename from example/sofast_fringe/example_multi_facet_data_process.py rename to example/sofast_fringe/example_process_facet_ensemble.py diff --git a/example/sofast_fringe/example_single_facet_data_process.py b/example/sofast_fringe/example_process_single_facet.py similarity index 100% rename from example/sofast_fringe/example_single_facet_data_process.py rename to example/sofast_fringe/example_process_single_facet.py diff --git a/example/sofast_fringe/example_undefined_facet_data_process.py b/example/sofast_fringe/example_process_undefined_shape.py similarity index 100% rename from example/sofast_fringe/example_undefined_facet_data_process.py rename to example/sofast_fringe/example_process_undefined_shape.py From 38ca87ff214671852fd5c4e6b4cebd45b233f773 Mon Sep 17 00:00:00 2001 From: Braden Date: Mon, 18 Mar 2024 15:08:39 -0600 Subject: [PATCH 10/16] Moved view camera distortion ex to correct folder --- .../example_view_camera_distortion.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename example/{sofast_fringe => camera_calibration}/example_view_camera_distortion.py (100%) diff --git a/example/sofast_fringe/example_view_camera_distortion.py b/example/camera_calibration/example_view_camera_distortion.py similarity index 100% rename from example/sofast_fringe/example_view_camera_distortion.py rename to example/camera_calibration/example_view_camera_distortion.py From 6ed65ba694ee3c310bb81940ea50cea7896c17ed Mon Sep 17 00:00:00 2001 From: Braden Date: Mon, 18 Mar 2024 15:51:33 -0600 Subject: [PATCH 11/16] Updated SofastFringe integration tests Fixed merge conflicts in undefined shape sofast example --- .../test/test_integration_multi_facet.py | 22 +-- .../test/test_integration_single_facet.py | 36 ++-- .../sofast/test/test_integration_undefined.py | 173 +++++++++--------- 3 files changed, 107 insertions(+), 124 deletions(-) diff --git a/opencsp/app/sofast/test/test_integration_multi_facet.py b/opencsp/app/sofast/test/test_integration_multi_facet.py index 447c8cbef..bdf155592 100644 --- a/opencsp/app/sofast/test/test_integration_multi_facet.py +++ b/opencsp/app/sofast/test/test_integration_multi_facet.py @@ -7,15 +7,16 @@ from scipy.spatial.transform import Rotation import numpy as np +from opencsp.app.sofast.lib.DisplayShape import DisplayShape as Display +from opencsp.app.sofast.lib.DefinitionEnsemble import DefinitionEnsemble +from opencsp.app.sofast.lib.DefinitionFacet import DefinitionFacet from opencsp.app.sofast.lib.ImageCalibrationScaling import ImageCalibrationScaling from opencsp.app.sofast.lib.ProcessSofastFringe import ProcessSofastFringe as Sofast from opencsp.app.sofast.lib.MeasurementSofastFringe import ( MeasurementSofastFringe as Measurement, ) from opencsp.common.lib.camera.Camera import Camera -from opencsp.app.sofast.lib.DisplayShape import DisplayShape as Display -from opencsp.app.sofast.lib.DefinitionEnsemble import DefinitionEnsemble -from opencsp.app.sofast.lib.DefinitionFacet import DefinitionFacet +from opencsp.common.lib.deflectometry.Surface2DParabolic import Surface2DParabolic from opencsp.common.lib.geometry.Vxyz import Vxyz from opencsp.common.lib.tool.hdf5_tools import load_hdf5_datasets from opencsp.common.lib.opencsp_path.opencsp_root_path import opencsp_code_dir @@ -41,7 +42,6 @@ def setUpClass(cls, base_dir: str | None = None): # Directory Setup file_dataset = os.path.join(base_dir, 'calculations_facet_ensemble/data.h5') file_measurement = os.path.join(base_dir, 'measurement_ensemble.h5') - print(f'Using dataset: {os.path.abspath(file_dataset)}') # Load data camera = Camera.load_from_hdf(file_dataset) @@ -123,20 +123,19 @@ def setUpClass(cls, base_dir: str | None = None): ) # Load surface data - surface_data = [] + surfaces = [] for idx in range(len(facet_data)): datasets = [ f'DataSofastInput/surface_params/facet_{idx:03d}/downsample', f'DataSofastInput/surface_params/facet_{idx:03d}/initial_focal_lengths_xy', f'DataSofastInput/surface_params/facet_{idx:03d}/robust_least_squares', - f'DataSofastInput/surface_params/facet_{idx:03d}/surface_type', ] data = load_hdf5_datasets(datasets, file_dataset) data['robust_least_squares'] = bool(data['robust_least_squares']) - surface_data.append(data) + surfaces.append(Surface2DParabolic(**data)) # Run SOFAST - sofast.process_optic_multifacet(facet_data, ensemble_data, surface_data) + sofast.process_optic_multifacet(facet_data, ensemble_data, surfaces) # Store data cls.data_test = {'slopes_facet_xy': [], 'surf_coefs_facet': []} @@ -188,9 +187,4 @@ def test_surf_coefs(self): if __name__ == '__main__': - Test = TestMulti() - Test.setUpClass() - - Test.test_slope() - Test.test_surf_coefs() - print('All tests run') + unittest.main() diff --git a/opencsp/app/sofast/test/test_integration_single_facet.py b/opencsp/app/sofast/test/test_integration_single_facet.py index 264688034..e5bf2a75c 100644 --- a/opencsp/app/sofast/test/test_integration_single_facet.py +++ b/opencsp/app/sofast/test/test_integration_single_facet.py @@ -7,14 +7,16 @@ import numpy as np +from opencsp.app.sofast.lib.DisplayShape import DisplayShape as Display +from opencsp.app.sofast.lib.DefinitionFacet import DefinitionFacet from opencsp.app.sofast.lib.ImageCalibrationScaling import ImageCalibrationScaling from opencsp.app.sofast.lib.MeasurementSofastFringe import ( MeasurementSofastFringe as Measurement, ) from opencsp.app.sofast.lib.ProcessSofastFringe import ProcessSofastFringe as Sofast from opencsp.common.lib.camera.Camera import Camera -from opencsp.app.sofast.lib.DisplayShape import DisplayShape as Display -from opencsp.app.sofast.lib.DefinitionFacet import DefinitionFacet +from opencsp.common.lib.deflectometry.Surface2DPlano import Surface2DPlano +from opencsp.common.lib.deflectometry.Surface2DParabolic import Surface2DParabolic from opencsp.common.lib.geometry.Vxyz import Vxyz from opencsp.common.lib.opencsp_path.opencsp_root_path import opencsp_code_dir from opencsp.common.lib.tool.hdf5_tools import load_hdf5_datasets @@ -43,10 +45,6 @@ def setUpClass(cls, base_dir: str | None = None): ) if len(cls.files_dataset) == 0: raise ValueError('No single-facet datsets found.') - else: - print(f'Testing {len(cls.files_dataset)} single facet datasets') - for file in cls.files_dataset: - print(f'Using dataset: {os.path.abspath(file)}') # Define component files file_measurement = os.path.join(base_dir, 'measurement_facet.h5') @@ -90,6 +88,16 @@ def setUpClass(cls, base_dir: str | None = None): file_dataset, ) ) + surface = Surface2DParabolic( + surface_data['initial_focal_lengths_xy'], + surface_data['robust_least_squares'], + surface_data['downsample'], + ) + else: + surface = Surface2DPlano( + surface_data['robust_least_squares'], + surface_data['downsample'], + ) # Load optic data facet_data = load_hdf5_datasets( @@ -148,7 +156,7 @@ def setUpClass(cls, base_dir: str | None = None): ] # Run SOFAST - sofast.process_optic_singlefacet(facet_data, surface_data) + sofast.process_optic_singlefacet(facet_data, surface) # Store test data cls.slopes.append(sofast.data_characterization_facet[0].slopes_facet_xy) @@ -191,16 +199,4 @@ def test_int_points(self): if __name__ == '__main__': - Test = TestSingle() - Test.setUpClass() - - print('test_slopes', flush=True) - Test.test_slopes() - - print('test_surf_coefs', flush=True) - Test.test_surf_coefs() - - print('test_int_points', flush=True) - Test.test_int_points() - - print('All tests run.') + unittest.main() diff --git a/opencsp/app/sofast/test/test_integration_undefined.py b/opencsp/app/sofast/test/test_integration_undefined.py index c0a3dfac0..856a67388 100644 --- a/opencsp/app/sofast/test/test_integration_undefined.py +++ b/opencsp/app/sofast/test/test_integration_undefined.py @@ -2,116 +2,109 @@ """ import os +import unittest import numpy as np +from opencsp.app.sofast.lib.DisplayShape import DisplayShape as Display from opencsp.app.sofast.lib.ImageCalibrationScaling import ImageCalibrationScaling from opencsp.app.sofast.lib.MeasurementSofastFringe import ( MeasurementSofastFringe as Measurement, ) from opencsp.app.sofast.lib.ProcessSofastFringe import ProcessSofastFringe as Sofast from opencsp.common.lib.camera.Camera import Camera -from opencsp.app.sofast.lib.DisplayShape import DisplayShape as Display +from opencsp.common.lib.deflectometry.Surface2DParabolic import Surface2DParabolic from opencsp.common.lib.opencsp_path.opencsp_root_path import opencsp_code_dir from opencsp.common.lib.tool.hdf5_tools import load_hdf5_datasets -def test_undefined(): - # Get test data location - base_dir = os.path.join(opencsp_code_dir(), 'test/data/measurements_sofast_fringe') - - # Directory Setup - file_dataset = os.path.join(base_dir, 'calculations_undefined_mirror/data.h5') - file_measurement = os.path.join(base_dir, 'measurement_facet.h5') - - # Load data - camera = Camera.load_from_hdf(file_dataset) - display = Display.load_from_hdf(file_dataset) - measurement = Measurement.load_from_hdf(file_measurement) - calibration = ImageCalibrationScaling.load_from_hdf(file_dataset) - - # Calibrate measurement - measurement.calibrate_fringe_images(calibration) - - # Load calculation/user data - datasets = [ - 'DataSofastCalculation/facet/facet_000/slopes_facet_xy', - 'DataSofastCalculation/facet/facet_000/slope_coefs_facet', - 'DataSofastInput/surface_params/facet_000/initial_focal_lengths_xy', - 'DataSofastInput/surface_params/facet_000/robust_least_squares', - 'DataSofastInput/surface_params/facet_000/downsample', - 'DataSofastInput/surface_params/facet_000/surface_type', - ] - data = load_hdf5_datasets(datasets, file_dataset) - - # Load sofast params - datasets = [ - 'DataSofastInput/sofast_params/mask_hist_thresh', - 'DataSofastInput/sofast_params/mask_filt_width', - 'DataSofastInput/sofast_params/mask_filt_thresh', - 'DataSofastInput/sofast_params/mask_thresh_active_pixels', - 'DataSofastInput/sofast_params/mask_keep_largest_area', - 'DataSofastInput/sofast_params/perimeter_refine_axial_search_dist', - 'DataSofastInput/sofast_params/perimeter_refine_perpendicular_search_dist', - 'DataSofastInput/sofast_params/facet_corns_refine_step_length', - 'DataSofastInput/sofast_params/facet_corns_refine_perpendicular_search_dist', - 'DataSofastInput/sofast_params/facet_corns_refine_frac_keep', - ] - params = load_hdf5_datasets(datasets, file_dataset) - - # Instantiate sofast object - sofast = Sofast(measurement, camera, display) - - # Update parameters - sofast.params.mask_hist_thresh = params['mask_hist_thresh'] - sofast.params.mask_filt_width = params['mask_filt_width'] - sofast.params.mask_filt_thresh = params['mask_filt_thresh'] - sofast.params.mask_thresh_active_pixels = params['mask_thresh_active_pixels'] - sofast.params.mask_keep_largest_area = params['mask_keep_largest_area'] - sofast.params.geometry_params.perimeter_refine_axial_search_dist = params[ - 'perimeter_refine_axial_search_dist' - ] - sofast.params.geometry_params.perimeter_refine_perpendicular_search_dist = params[ - 'perimeter_refine_perpendicular_search_dist' - ] - sofast.params.geometry_params.facet_corns_refine_step_length = params[ - 'facet_corns_refine_step_length' - ] - sofast.params.geometry_params.facet_corns_refine_perpendicular_search_dist = params[ - 'facet_corns_refine_perpendicular_search_dist' - ] - sofast.params.geometry_params.facet_corns_refine_frac_keep = params[ - 'facet_corns_refine_frac_keep' - ] - - # Define surface data - if data['surface_type'] == 'parabolic': - surface_data = dict( - surface_type=data['surface_type'], +class test_IntegrationUndefined(unittest.TestCase): + def test_undefined(self): + # Get test data location + base_dir = os.path.join(opencsp_code_dir(), 'test/data/measurements_sofast_fringe') + + # Directory Setup + file_dataset = os.path.join(base_dir, 'calculations_undefined_mirror/data.h5') + file_measurement = os.path.join(base_dir, 'measurement_facet.h5') + + # Load data + camera = Camera.load_from_hdf(file_dataset) + display = Display.load_from_hdf(file_dataset) + measurement = Measurement.load_from_hdf(file_measurement) + calibration = ImageCalibrationScaling.load_from_hdf(file_dataset) + + # Calibrate measurement + measurement.calibrate_fringe_images(calibration) + + # Load calculation/user data + datasets = [ + 'DataSofastCalculation/facet/facet_000/slopes_facet_xy', + 'DataSofastCalculation/facet/facet_000/slope_coefs_facet', + 'DataSofastInput/surface_params/facet_000/initial_focal_lengths_xy', + 'DataSofastInput/surface_params/facet_000/robust_least_squares', + 'DataSofastInput/surface_params/facet_000/downsample', + ] + data = load_hdf5_datasets(datasets, file_dataset) + + # Load sofast params + datasets = [ + 'DataSofastInput/sofast_params/mask_hist_thresh', + 'DataSofastInput/sofast_params/mask_filt_width', + 'DataSofastInput/sofast_params/mask_filt_thresh', + 'DataSofastInput/sofast_params/mask_thresh_active_pixels', + 'DataSofastInput/sofast_params/mask_keep_largest_area', + 'DataSofastInput/sofast_params/perimeter_refine_axial_search_dist', + 'DataSofastInput/sofast_params/perimeter_refine_perpendicular_search_dist', + 'DataSofastInput/sofast_params/facet_corns_refine_step_length', + 'DataSofastInput/sofast_params/facet_corns_refine_perpendicular_search_dist', + 'DataSofastInput/sofast_params/facet_corns_refine_frac_keep', + ] + params = load_hdf5_datasets(datasets, file_dataset) + + # Instantiate sofast object + sofast = Sofast(measurement, camera, display) + + # Update parameters + sofast.params.mask_hist_thresh = params['mask_hist_thresh'] + sofast.params.mask_filt_width = params['mask_filt_width'] + sofast.params.mask_filt_thresh = params['mask_filt_thresh'] + sofast.params.mask_thresh_active_pixels = params['mask_thresh_active_pixels'] + sofast.params.mask_keep_largest_area = params['mask_keep_largest_area'] + sofast.params.geometry_params.perimeter_refine_axial_search_dist = params[ + 'perimeter_refine_axial_search_dist' + ] + sofast.params.geometry_params.perimeter_refine_perpendicular_search_dist = params[ + 'perimeter_refine_perpendicular_search_dist' + ] + sofast.params.geometry_params.facet_corns_refine_step_length = params[ + 'facet_corns_refine_step_length' + ] + sofast.params.geometry_params.facet_corns_refine_perpendicular_search_dist = params[ + 'facet_corns_refine_perpendicular_search_dist' + ] + sofast.params.geometry_params.facet_corns_refine_frac_keep = params[ + 'facet_corns_refine_frac_keep' + ] + + # Define surface data + surface = Surface2DParabolic( initial_focal_lengths_xy=data['initial_focal_lengths_xy'], robust_least_squares=bool(data['robust_least_squares']), downsample=data['downsample'], ) - else: - surface_data = dict( - surface_type=data['surface_type'], - robust_least_squares=bool(data['robust_least_squares']), - downsample=data['downsample'], - ) - # Run SOFAST - sofast.process_optic_undefined(surface_data) + # Run SOFAST + sofast.process_optic_undefined(surface) - # Test - slopes = sofast.data_characterization_facet[0].slopes_facet_xy - slope_coefs = sofast.data_characterization_facet[0].slope_coefs_facet + # Test + slopes = sofast.data_characterization_facet[0].slopes_facet_xy + slope_coefs = sofast.data_characterization_facet[0].slope_coefs_facet - np.testing.assert_allclose(data['slopes_facet_xy'], slopes, atol=1e-7, rtol=0) - np.testing.assert_allclose( - data['slope_coefs_facet'], slope_coefs, atol=1e-8, rtol=0 - ) + np.testing.assert_allclose(data['slopes_facet_xy'], slopes, atol=1e-7, rtol=0) + np.testing.assert_allclose( + data['slope_coefs_facet'], slope_coefs, atol=1e-8, rtol=0 + ) if __name__ == '__main__': - test_undefined() - print('All tests run.') + unittest.main() From 57a239f584f360b2d09a98bef274a956472dc7cc Mon Sep 17 00:00:00 2001 From: Braden Date: Mon, 18 Mar 2024 15:53:56 -0600 Subject: [PATCH 12/16] Added matplotlib import --- opencsp/app/sofast/test/test_project_fixed_pattern_target.py | 1 + 1 file changed, 1 insertion(+) diff --git a/opencsp/app/sofast/test/test_project_fixed_pattern_target.py b/opencsp/app/sofast/test/test_project_fixed_pattern_target.py index 322ae7c55..112259443 100644 --- a/opencsp/app/sofast/test/test_project_fixed_pattern_target.py +++ b/opencsp/app/sofast/test/test_project_fixed_pattern_target.py @@ -3,6 +3,7 @@ import os +import matplotlib import pytest from opencsp.common.lib.opencsp_path.opencsp_root_path import opencsp_code_dir From 697f3fc76eec569e03cbf0666584d65de73744c2 Mon Sep 17 00:00:00 2001 From: Braden Date: Mon, 18 Mar 2024 15:56:13 -0600 Subject: [PATCH 13/16] Updated test_SlopeSolver to use Surface2D classes --- .../deflectometry/test/test_SlopeSolver.py | 25 ++++++++----------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/opencsp/common/lib/deflectometry/test/test_SlopeSolver.py b/opencsp/common/lib/deflectometry/test/test_SlopeSolver.py index baab9c364..beb5e0ddb 100644 --- a/opencsp/common/lib/deflectometry/test/test_SlopeSolver.py +++ b/opencsp/common/lib/deflectometry/test/test_SlopeSolver.py @@ -13,6 +13,7 @@ ) from opencsp.app.sofast.lib.SpatialOrientation import SpatialOrientation from opencsp.common.lib.deflectometry.SlopeSolver import SlopeSolver +from opencsp.common.lib.deflectometry.Surface2DParabolic import Surface2DParabolic from opencsp.common.lib.geometry.Uxyz import Uxyz from opencsp.common.lib.geometry.Vxyz import Vxyz from opencsp.common.lib.opencsp_path.opencsp_root_path import opencsp_code_dir @@ -55,19 +56,11 @@ def setUpClass(cls): ori.orient_optic_cam(r_cam_optic, v_cam_optic_cam) # Perform calculations - if data['surface_type'] == 'parabolic': - surface_data = dict( - surface_type=data['surface_type'], - initial_focal_lengths_xy=data['initial_focal_lengths_xy'], - robust_least_squares=bool(data['robust_least_squares']), - downsample=data['downsample'], - ) - elif data['surface_type'] == 'plano': - surface_data = dict( - surface_type=data['surface_type'], - robust_least_squares=bool(data['robust_least_squares']), - downsample=data['downsample'], - ) + surface = Surface2DParabolic( + initial_focal_lengths_xy=data['initial_focal_lengths_xy'], + robust_least_squares=bool(data['robust_least_squares']), + downsample=data['downsample'], + ) kwargs = { 'v_optic_cam_optic': ori.v_optic_cam_optic, 'u_active_pixel_pointing_optic': Uxyz(data['u_pixel_pointing_facet']), @@ -76,7 +69,7 @@ def setUpClass(cls): 'v_optic_screen_optic': ori.v_optic_screen_optic, 'v_align_point_optic': measurement.measure_point, 'dist_optic_screen': measurement.optic_screen_dist, - 'surface_data': surface_data, + 'surface': surface, } # Solve slopes @@ -118,3 +111,7 @@ def test_slopes(self): np.testing.assert_allclose( data['slopes_facet_xy'], self.data_slope.slopes_facet_xy, atol=1e-8, rtol=0 ) + + +if __name__ == '__main__': + unittest.main() From 027e66e9d77a14e16e4b7b2219eca96d09d91100 Mon Sep 17 00:00:00 2001 From: Braden Date: Mon, 18 Mar 2024 16:18:26 -0600 Subject: [PATCH 14/16] Added docstring --- opencsp/app/sofast/lib/ProcessSofastFringe.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/opencsp/app/sofast/lib/ProcessSofastFringe.py b/opencsp/app/sofast/lib/ProcessSofastFringe.py index 80a9bfd7b..bbace7091 100644 --- a/opencsp/app/sofast/lib/ProcessSofastFringe.py +++ b/opencsp/app/sofast/lib/ProcessSofastFringe.py @@ -740,6 +740,15 @@ def get_optic( return facets[0] def save_to_hdf(self, file: str, prefix: str = ''): + """Saves data to given file. Data is stored as: PREFIX + Folder/Field_1 + + Parameters + ---------- + file : str + HDF file to save to + prefix : str + Prefix to append to folder path within HDF file (folders must be separated by "/") + """ # Log lt.info(f'Saving SofastFringe data to: {file:s}, in HDF5 folder: "{prefix:s}"') From f0504650abe8a6a43da76335da9c9505ea05f3eb Mon Sep 17 00:00:00 2001 From: Braden Date: Tue, 19 Mar 2024 14:00:05 -0600 Subject: [PATCH 15/16] Updated documentation in process_optics_geometry --- .../app/sofast/lib/process_optics_geometry.py | 53 +++++++++++++------ 1 file changed, 37 insertions(+), 16 deletions(-) diff --git a/opencsp/app/sofast/lib/process_optics_geometry.py b/opencsp/app/sofast/lib/process_optics_geometry.py index aed019f9a..efa98adf3 100644 --- a/opencsp/app/sofast/lib/process_optics_geometry.py +++ b/opencsp/app/sofast/lib/process_optics_geometry.py @@ -61,11 +61,18 @@ def process_singlefacet_geometry( Returns ------- - calculation_data_classes.CalculationDataGeometryGeneral - calculation_data_classes.CalculationImageProcessingGeneral - list[calculation_data_classes.CalculationDataGeometryFacet] - list[calculation_data_classes.CalculationImageProcessingFacet] - calculation_data_classes.CalculationError] + data_geometry_general: calculation_data_classes.CalculationDataGeometryGeneral + Positional optic geometry calculations general to entire measurement; not facet specific. + data_image_processing_general: calculation_data_classes.CalculationImageProcessingGeneral + Image processing calculations general to entire measurement; not facet specific. + data_geometry_facet: list[calculation_data_classes.CalculationDataGeometryFacet] + List of positional optic geometry calculations specific to each facet. Order is + same as input facet definitions. + data_image_processing_facet: list[calculation_data_classes.CalculationImageProcessingFacet] + List of image processing calcualtions specific to each facet. Order is same as input facet + definitions. + data_error: calculation_data_classes.CalculationError + Geometric/positional errors and reprojection errors associated with solving for facet location. """ if debug.debug_active: print('Image processing debug on.') @@ -324,11 +331,18 @@ def process_undefined_geometry( Returns ------- - calculation_data_classes.CalculationDataGeometryGeneral - calculation_data_classes.CalculationImageProcessingGeneral - list[calculation_data_classes.CalculationDataGeometryFacet] - list[calculation_data_classes.CalculationImageProcessingFacet] - calculation_data_classes.CalculationError] + data_geometry_general: calculation_data_classes.CalculationDataGeometryGeneral + Positional optic geometry calculations general to entire measurement; not facet specific. + data_image_processing_general: calculation_data_classes.CalculationImageProcessingGeneral + Image processing calculations general to entire measurement; not facet specific. + data_geometry_facet: list[calculation_data_classes.CalculationDataGeometryFacet] + List of positional optic geometry calculations specific to each facet. Order is + same as input facet definitions. + data_image_processing_facet: list[calculation_data_classes.CalculationImageProcessingFacet] + List of image processing calcualtions specific to each facet. Order is same as input facet + definitions. + data_error: calculation_data_classes.CalculationError + Geometric/positional errors and reprojection errors associated with solving for facet location. """ if debug.debug_active: print( @@ -418,7 +432,7 @@ def process_multifacet_geometry( ensemble_data : DefinitionEnsemble Ensemble definition object mask_raw : ndarray - Raw calculated mask + Raw calculated mask, shape (m, n) array of booleans v_meas_pt_ensemble : Vxyz Measure point lcoation on ensemble, meters orientation : SpatialOrientation @@ -434,11 +448,18 @@ def process_multifacet_geometry( Returns ------- - calculation_data_classes.CalculationDataGeometryGeneral - calculation_data_classes.CalculationImageProcessingGeneral - list[calculation_data_classes.CalculationDataGeometryFacet] - list[calculation_data_classes.CalculationImageProcessingFacet] - calculation_data_classes.CalculationError] + data_geometry_general: calculation_data_classes.CalculationDataGeometryGeneral + Positional optic geometry calculations general to entire measurement; not facet specific. + data_image_processing_general: calculation_data_classes.CalculationImageProcessingGeneral + Image processing calculations general to entire measurement; not facet specific. + data_geometry_facet: list[calculation_data_classes.CalculationDataGeometryFacet] + List of positional optic geometry calculations specific to each facet. Order is + same as input facet definitions. + data_image_processing_facet: list[calculation_data_classes.CalculationImageProcessingFacet] + List of image processing calcualtions specific to each facet. Order is same as input facet + definitions. + data_error: calculation_data_classes.CalculationError + Geometric/positional errors and reprojection errors associated with solving for facet location. """ if debug.debug_active: print( From 19afc0ce27e58474f9ec69dec5d6e1f99d60baba Mon Sep 17 00:00:00 2001 From: Braden Date: Tue, 19 Mar 2024 14:17:21 -0600 Subject: [PATCH 16/16] Renamed ParamsSlopeSolver to ParamsSlopeSolverAbstract --- opencsp/common/lib/deflectometry/ParamsSlopeSolver.py | 5 ----- .../lib/deflectometry/ParamsSlopeSolverAbstract.py | 11 +++++++++++ .../lib/deflectometry/ParamsSlopeSolverParaboloid.py | 6 +++--- .../lib/deflectometry/ParamsSlopeSolverPlano.py | 6 ++---- 4 files changed, 16 insertions(+), 12 deletions(-) delete mode 100644 opencsp/common/lib/deflectometry/ParamsSlopeSolver.py create mode 100644 opencsp/common/lib/deflectometry/ParamsSlopeSolverAbstract.py diff --git a/opencsp/common/lib/deflectometry/ParamsSlopeSolver.py b/opencsp/common/lib/deflectometry/ParamsSlopeSolver.py deleted file mode 100644 index f75e85122..000000000 --- a/opencsp/common/lib/deflectometry/ParamsSlopeSolver.py +++ /dev/null @@ -1,5 +0,0 @@ -from abc import ABC - - -class ParamsSlopeSolver(ABC): - pass diff --git a/opencsp/common/lib/deflectometry/ParamsSlopeSolverAbstract.py b/opencsp/common/lib/deflectometry/ParamsSlopeSolverAbstract.py new file mode 100644 index 000000000..342a5a719 --- /dev/null +++ b/opencsp/common/lib/deflectometry/ParamsSlopeSolverAbstract.py @@ -0,0 +1,11 @@ +from abc import ABC +from dataclasses import dataclass + + +@dataclass +class ParamsSlopeSolverAbstract(ABC): + """Abstract SlopeSolver input parameters class. Contains parameters + common to all surface types. + """ + robust_least_squares: bool + downsample: int diff --git a/opencsp/common/lib/deflectometry/ParamsSlopeSolverParaboloid.py b/opencsp/common/lib/deflectometry/ParamsSlopeSolverParaboloid.py index 3dec4258c..2add6c2ef 100644 --- a/opencsp/common/lib/deflectometry/ParamsSlopeSolverParaboloid.py +++ b/opencsp/common/lib/deflectometry/ParamsSlopeSolverParaboloid.py @@ -1,10 +1,10 @@ from dataclasses import dataclass +from opencsp.common.lib.deflectometry.ParamsSlopeSolverAbstract import ParamsSlopeSolverAbstract + @dataclass -class ParamsSlopeSolverParaboloid: +class ParamsSlopeSolverParaboloid(ParamsSlopeSolverAbstract): """SlopeSolver input parameters class for parabolic surface type """ initial_focal_lengths_xy: tuple[float, float] - robust_least_squares: bool - downsample: int diff --git a/opencsp/common/lib/deflectometry/ParamsSlopeSolverPlano.py b/opencsp/common/lib/deflectometry/ParamsSlopeSolverPlano.py index 4d95768f6..88e9c9439 100644 --- a/opencsp/common/lib/deflectometry/ParamsSlopeSolverPlano.py +++ b/opencsp/common/lib/deflectometry/ParamsSlopeSolverPlano.py @@ -1,11 +1,9 @@ from dataclasses import dataclass -from opencsp.common.lib.deflectometry.ParamsSlopeSolver import ParamsSlopeSolver +from opencsp.common.lib.deflectometry.ParamsSlopeSolverAbstract import ParamsSlopeSolverAbstract @dataclass -class ParamsSlopeSolverPlano(ParamsSlopeSolver): +class ParamsSlopeSolverPlano(ParamsSlopeSolverAbstract): """SlopeSolver input parameters class for plano (perfectly flat) surface type """ - robust_least_squares: bool - downsample: int