You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
2.3 KiB
67 lines
2.3 KiB
import numpy |
|
|
|
from .columns import ( |
|
META_DATA_EXPOSURE_ID, |
|
SETTINGS_EXPOSURE_TIME, |
|
META_DATA_PARAMETERS_TIME, |
|
SETTINGS_EXPOSURE_CHANNEL, |
|
META_DATA_PARAMETERS_CHANNEL, |
|
) |
|
|
|
|
|
def split_data_frame(data_frame, column): |
|
""" splits a data frame on unique column values """ |
|
values = data_frame[column].unique() |
|
masks = {value: (data_frame[column] == value) for value in values} |
|
return {value: data_frame[mask] for value, mask in masks.items()} |
|
|
|
|
|
def _set_exposure_data_from_parameters(data_frame): |
|
"""infer the exposures from measurement parameters |
|
|
|
will raise a ValueError if the parameters contain NaNs |
|
""" |
|
df = data_frame # shorthand for cleaner code |
|
|
|
if ( |
|
df[META_DATA_PARAMETERS_CHANNEL].hasnans |
|
or df[META_DATA_PARAMETERS_TIME].hasnans |
|
): |
|
raise ValueError("Exposure Map: measurement parameters incomplete") |
|
|
|
df[SETTINGS_EXPOSURE_CHANNEL] = df[META_DATA_PARAMETERS_CHANNEL] |
|
df[SETTINGS_EXPOSURE_TIME] = df[META_DATA_PARAMETERS_TIME] |
|
return df |
|
|
|
|
|
def apply_exposure_map(data_frame, exposure_map=None): |
|
"""applies the parameters of a exposure map to the data frame |
|
|
|
exposure map: |
|
keys: must be the same as the exposure ids, |
|
values: objects with at least time and channel attributes |
|
|
|
if the exposure map is None, the values from the optionally parsed |
|
measurement parameters are used. |
|
|
|
will raise an ValueError, if the provided exposure map does not map to the |
|
exposure ids. |
|
""" |
|
|
|
if exposure_map is None: |
|
return _set_exposure_data_from_parameters(data_frame) |
|
|
|
existing = set(data_frame[META_DATA_EXPOSURE_ID].unique()) |
|
provided = set(exposure_map.keys()) |
|
if existing != provided: |
|
raise ValueError( |
|
f"Exposure Map differs from data frame: {provided} != {existing}" |
|
) |
|
|
|
data_frame[SETTINGS_EXPOSURE_CHANNEL] = numpy.nan |
|
data_frame[SETTINGS_EXPOSURE_TIME] = numpy.nan |
|
for exposure_id, exposure_info in exposure_map.items(): |
|
mask = data_frame[META_DATA_EXPOSURE_ID] == exposure_id |
|
data_frame.loc[mask, SETTINGS_EXPOSURE_CHANNEL] = exposure_info.channel |
|
data_frame.loc[mask, SETTINGS_EXPOSURE_TIME] = exposure_info.time |
|
return data_frame
|
|
|