%%html
<style>
.cell-output-ipywidget-background {
background-color: transparent !important;
}
:root {
--jp-widgets-color: var(--vscode-editor-foreground);
--jp-widgets-font-size: var(--vscode-editor-font-size);
}
</style>
import datetime
import pyaurorax
aurorax = pyaurorax.PyAuroraX()
# download an hour of TREx NIR data
dataset_name = "TREX_NIR_RAW"
start_dt = datetime.datetime(2021, 11, 4, 3, 0)
end_dt = datetime.datetime(2021, 11, 4, 3, 59)
site_uid = "gill"
r = aurorax.data.ucalgary.download(dataset_name, start_dt, end_dt, site_uid=site_uid)
Downloading TREX_NIR_RAW files: 0%| | 0.00/51.2M [00:00<?, ?B/s]
# read in the hour of data
data = aurorax.data.ucalgary.read(r.dataset, r.filenames, n_parallel=5)
# set up working with the tools by just making a shorter name for our future calls
at = aurorax.tools
# determine the device UID for this camera
data.metadata[0]["Imager unique ID"]
'nir-216'
# download rayleighs calibration
dataset_name = "TREX_NIR_CALIBRATION_RAYLEIGHS_IDLSAV"
device_uid = "216"
r = aurorax.data.ucalgary.download_best_rayleighs_calibration(dataset_name, device_uid, start_dt)
r.filenames
[PosixPath('/home/darrenc/pyaurorax_data/TREX_NIR_CALIBRATION_RAYLEIGHS_IDLSAV/NIR_Rayleighs_23216_20210819-+_v02.sav')]
# we'll want to use the last calibration in the above list, since it's the most recent for the day of data we're processing
#
# read in the rayleighs calibration file
data_cal_rayleighs = aurorax.data.ucalgary.read(r.dataset, r.filenames[0])
data_cal_rayleighs.data[0].pretty_print()
Calibration: dataset : Dataset(...) detector_uid : 23216 filename : /home/darrenc/pyaurorax_data/TREX_NIR_CALIBRATION_RAYLEIGHS_IDLSAV/NIR_Rayleighs_23216_20210819-+_v02.sav flat_field_multiplier : None generation_info : CalibrationGenerationInfo(...) rayleighs_perdn_persecond : 12.777938395844197 version : v02
# download flatfield calibration
dataset_name = "TREX_NIR_CALIBRATION_FLATFIELD_IDLSAV"
device_uid = "216"
r = aurorax.data.ucalgary.download_best_flatfield_calibration(dataset_name, device_uid, start_dt)
r.filenames
[PosixPath('/home/darrenc/pyaurorax_data/TREX_NIR_CALIBRATION_FLATFIELD_IDLSAV/NIR_flatfield_23216_20210819-+_v02.sav')]
# in this case, there is only one calibration file available (sometimes there are more at later dates).
#
# read in the rayleighs calibration file
data_cal_flatfield = aurorax.data.ucalgary.read(r.dataset, r.filenames[0])
data_cal_flatfield.data[0].pretty_print()
Calibration: dataset : Dataset(...) detector_uid : 23216 filename : /home/darrenc/pyaurorax_data/TREX_NIR_CALIBRATION_FLATFIELD_IDLSAV/NIR_flatfield_23216_20210819-+_v02.sav flat_field_multiplier : array(dims=(256, 256), dtype=>f8) generation_info : CalibrationGenerationInfo(...) rayleighs_perdn_persecond : None version : v02
calibrated_data = at.calibration.trex_nir(data.data[:, :, 0:5], step_flatfield_calibration=False, step_rayleighs_calibration=False)
import matplotlib.pyplot as plt
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(8, 4))
ax1.set_title("Raw Image")
ax1.imshow(at.scale_intensity(data.data[:, :, 0], min=0, max=1000), cmap='gist_heat', origin="lower")
ax1.axis('off')
ax2.set_title("Dark Frame Corrected Image")
ax2.imshow(at.scale_intensity(calibrated_data[:, :, 0], min=0, max=1000), cmap='gist_heat', origin="lower")
ax2.axis('off')
plt.show()
at.display(at.scale_intensity(calibrated_data[:, :, 0], min=0, max=700), cmap="gist_heat")
at.display(data_cal_flatfield.data[0].flat_field_multiplier, cmap="gist_heat", title="Flat field data", colorbar=True)
calibrated_data = at.calibration.trex_nir(
data.data[:, :, 0:5],
cal_flatfield=data_cal_flatfield.data[0],
step_rayleighs_calibration=False,
)
at.display(at.scale_intensity(calibrated_data[:, :, 0], min=0, max=1000), cmap="gist_heat")
calibrated_data = at.calibration.trex_nir(
data.data[:, :, 290:310],
cal_flatfield=data_cal_flatfield.data[0],
cal_rayleighs=data_cal_rayleighs.data[0],
)
at.display(calibrated_data[:, :, 0], cmap="gist_heat", colorbar=True)
# cap the scale at a certain Rayleighs
import numpy as np
max_cutoff = 25000
calibrated_data = at.calibration.trex_nir(
data.data[:, :, 300],
cal_flatfield=data_cal_flatfield.data[0],
cal_rayleighs=data_cal_rayleighs.data[0],
)
calibrated_data[np.where(calibrated_data > max_cutoff)] = max_cutoff
plt.imshow(calibrated_data, cmap="gist_heat", vmin=0, vmax=max_cutoff, origin="lower")
plt.axis('off')
plt.title("TREx NIR Intensity (Rayleighs)")
# Create a colorbar, in Rayleighs, that accounts for the scaling limit we applied
cbar_ticks = [float(max_cutoff) / 5. * j for j in range(0, 6)]
cbar_ticknames = [str(int(max_cutoff / 5) * j) for j in range(0, 6)]
# Any pixels with the max Rayleigh value could be greater than it, so we include the plus sign
cbar_ticknames[-1] += '+'
cbar = plt.colorbar(ticks=cbar_ticks)
cbar.ax.set_yticklabels(cbar_ticknames)
plt.show()