Balloon Measurement Simulation

Simulation of a measurement from a balloon.

from ali.instrument.simulator import ImagingSimulator
from ali.instrument.sensor_2channel import ALISensorDualChannel
import sasktran as sk
import numpy as np
from ali.diagnostics.diagnostics import plot_sampling
from ali.util.geometry import optical_axis_from_geometry


def balloon_measurement_simulation():
    """
    Basic simulation of an ALI measurement from a balloon platform.
    """

    # define balloon geometry
    time = '2014-12-07T17:30'
    latitude = 40.0
    longitude = -120.0
    solar_scattering_angle = 60.0
    solar_zenith_angle = 70.0
    azimuth_angle = 60.0
    balloon_altitude = 30.0
    boresight_tangent_altitude = 12.5

    mjd = (np.datetime64(time) - np.datetime64('1858-11-17')) / np.timedelta64(1, 'D')
    optical_geometry = []
    sensors = []
    wavelengths = [np.array([750.0]), np.array([1550.0])]

    options = dict()
    options['grid_spacing'] = 500.0
    options['polarization'] = True

    atmosphere = sk.Atmosphere()
    atmosphere['ozone'] = sk.Species(sk.O3DBM(), sk.Labow())
    atmosphere['air'] = sk.Species(sk.Rayleigh(), sk.MSIS90())
    atmosphere['aerosol'] = sk.SpeciesAerosolGloSSAC()
    atmosphere.brdf = sk.Lambertian(0.5)

    num_cols = 100
    num_rows = 100

    for lat, wavel in zip([45.0, 45.0], wavelengths):

        geom = sk.VerticalImage()
        geom.from_sza_ssa(sza=solar_zenith_angle, ssa=solar_scattering_angle, lat=latitude, lon=longitude,
                          tanalts_km=(boresight_tangent_altitude,), mjd=mjd, locallook=azimuth_angle,
                          satalt_km=balloon_altitude, refalt_km=boresight_tangent_altitude)
        optical_geometry.append(optical_axis_from_geometry(geom))
        ali = ALISensorDualChannel(wavelength_nm=wavel, num_rows=num_rows,
                                   num_columns=num_cols, image_vert_fov=5.0, image_horiz_fov=5.0)
        ali.ccd = 'raptorowl640n'
        ali.ccd_temperature = 273.0
        ali.add_dark_current = True
        ali.add_noise = True
        ali.add_adc = True
        ali.auto_exposure = True
        sensors.append(ali)
        sensors[0].turn_rotator_on()

    sim = ImagingSimulator(sensors=sensors, optical_axis=optical_geometry,
                           atmosphere=atmosphere, options=options)
    sim.random_seed = 0
    sim.save_diagnostics = True
    sim.group_scans = False

    data = sim.calculate_radiance()
    fig, axes = plot_sampling(sim.sensors, [sim.sensors[0].diagnostics[0], sim.sensors[1].diagnostics[1]],
                              sim.diagnostics['sensor']['samples'][0],
                              xcoarsen=5, ycoarsen=5,
                              show_sampling_grid=False, show_sensor_pixels=False, show_output_grid=True,
                              wavels=wavelengths, log_radiance=True, percentile=99.5)


if __name__ == '__main__':
    balloon_measurement_simulation()
../../_images/simulated_image.png