Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -1731,6 +1731,7 @@

#### [nirfsa] Unreleased
- Added
- All methods and attributes which are part of first release
- Changed
- Removed

Expand Down
60 changes: 60 additions & 0 deletions src/nirfsa/custom_types/coefficient_info_type.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
import ctypes
import nirfsa._visatype


# This class is an internal ctypes implementation detail that corresponds to
# niRFSA_coefficientInfo in the C API
class struct_niRFSA_coefficientInfo(ctypes.Structure): # noqa N801
_pack_ = 8
_fields_ = [
('offset', nirfsa._visatype.ViReal64),
('gain', nirfsa._visatype.ViReal64),
('reserved1', nirfsa._visatype.ViReal64),
('reserved2', nirfsa._visatype.ViReal64),
]

def __init__(self, data=None, offset=0.0, gain=0.0,
reserved1=0.0, reserved2=0.0):
super(ctypes.Structure, self).__init__()
if data is not None:
self.offset = data.offset
self.gain = data.gain
self.reserved1 = data.reserved1
self.reserved2 = data.reserved2
else:
self.offset = offset
self.gain = gain
self.reserved1 = reserved1
self.reserved2 = reserved2


class CoefficientInfo:
"""Python-friendly wrapper for niRFSA coefficient info."""

def __init__(self, data=None, offset=0.0, gain=0.0):
if data is not None:
self.offset = data.offset
self.gain = data.gain
else:
self.offset = offset
self.gain = gain

def _create_copy(self, target_class):
try:
return target_class(
offset=self.offset,
gain=self.gain,
)
except TypeError:
return target_class(data=self)

def __repr__(self):
return "{}.{}(offset={}, gain={})".format(
self.__class__.__module__,
self.__class__.__qualname__,
self.offset,
self.gain,
)

def __str__(self):
return self.__repr__()
112 changes: 112 additions & 0 deletions src/nirfsa/custom_types/spectrum_info_type.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
import ctypes
import nirfsa._visatype


# This class is an internal ctypes implementation detail that corresponds to
# niRFSA_spectrumInfo in the C API
class struct_niRFSA_spectrumInfo(ctypes.Structure): # noqa N801
_pack_ = 8
_fields_ = [
('initial_frequency', nirfsa._visatype.ViReal64),
('frequency_increment', nirfsa._visatype.ViReal64),
('number_of_spectral_lines', nirfsa._visatype.ViInt32),
('reserved1', nirfsa._visatype.ViReal64),
('reserved2', nirfsa._visatype.ViReal64),
('reserved3', nirfsa._visatype.ViReal64),
('reserved4', nirfsa._visatype.ViReal64),
('reserved5', nirfsa._visatype.ViReal64),
]

def __init__(self, data=None, initial_frequency=0.0, frequency_increment=0.0,
number_of_spectral_lines=0, reserved1=0.0, reserved2=0.0,
reserved3=0.0, reserved4=0.0, reserved5=0.0):
super(ctypes.Structure, self).__init__()
if data is not None:
self.initial_frequency = data.initial_frequency
self.frequency_increment = data.frequency_increment
self.number_of_spectral_lines = data.number_of_spectral_lines
self.reserved1 = data.reserved1
self.reserved2 = data.reserved2
self.reserved3 = data.reserved3
self.reserved4 = data.reserved4
self.reserved5 = data.reserved5
else:
self.initial_frequency = initial_frequency
self.frequency_increment = frequency_increment
self.number_of_spectral_lines = number_of_spectral_lines
self.reserved1 = reserved1
self.reserved2 = reserved2
self.reserved3 = reserved3
self.reserved4 = reserved4
self.reserved5 = reserved5


class SpectrumInfo:
"""Python-friendly wrapper for niRFSA spectrum info."""

def __init__(self, data=None, initial_frequency=0.0, frequency_increment=0.0,
number_of_spectral_lines=0, reserved1=0.0, reserved2=0.0,
reserved3=0.0, reserved4=0.0, reserved5=0.0):
if data is not None:
self.initial_frequency = data.initial_frequency
self.frequency_increment = data.frequency_increment
self.number_of_spectral_lines = data.number_of_spectral_lines
self.reserved1 = data.reserved1
self.reserved2 = data.reserved2
self.reserved3 = data.reserved3
self.reserved4 = data.reserved4
self.reserved5 = data.reserved5
else:
self.initial_frequency = initial_frequency
self.frequency_increment = frequency_increment
self.number_of_spectral_lines = number_of_spectral_lines
self.reserved1 = reserved1
self.reserved2 = reserved2
self.reserved3 = reserved3
self.reserved4 = reserved4
self.reserved5 = reserved5

def _create_copy(self, target_class):
try:
return target_class(
initial_frequency=self.initial_frequency,
frequency_increment=self.frequency_increment,
number_of_spectral_lines=self.number_of_spectral_lines,
reserved1=self.reserved1,
reserved2=self.reserved2,
reserved3=self.reserved3,
reserved4=self.reserved4,
reserved5=self.reserved5,
)
except TypeError:
return target_class(data=self)

def __repr__(self):
return "{}.{}(initial_frequency={}, frequency_increment={}, number_of_spectral_lines={}, reserved1={}, reserved2={}, reserved3={}, reserved4={}, reserved5={})".format(
self.__class__.__module__,
self.__class__.__qualname__,
self.initial_frequency,
self.frequency_increment,
self.number_of_spectral_lines,
self.reserved1,
self.reserved2,
self.reserved3,
self.reserved4,
self.reserved5,
)

def __str__(self):
return self.__repr__()


def _populate_samples_info(spectrum_info, sample_data):
'''Chunk up flat array of sample_data and copy each chunk into individual SpectrumInfo instance

Args:
spectrum_info (SpectrumInfo): SpectrumInfo class instance

sample_data (Iterable of float): Spectrum sample data
'''
start = 0
end = start + spectrum_info.number_of_spectral_lines
spectrum_info.samples = sample_data[start:end]
116 changes: 116 additions & 0 deletions src/nirfsa/custom_types/waveform_info.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
import ctypes
import nirfsa._visatype


# This class is an internal ctypes implementation detail that corresponds to
# niRFSA_wfmInfo in the C API
class struct_niRFSA_wfmInfo(ctypes.Structure): # noqa N801
_pack_ = 8
_fields_ = [
('absolute_initial_x', nirfsa._visatype.ViReal64),
('relative_initial_x', nirfsa._visatype.ViReal64),
('x_increment', nirfsa._visatype.ViReal64),
('actual_samples', nirfsa._visatype.ViInt64),
('offset', nirfsa._visatype.ViReal64),
('gain', nirfsa._visatype.ViReal64),
('reserved1', nirfsa._visatype.ViReal64),
('reserved2', nirfsa._visatype.ViReal64),
]

def __init__(self, data=None, absolute_initial_x=0.0, relative_initial_x=0.0,
x_increment=0.0, actual_samples=0, offset=0.0, gain=0.0,
reserved1=0.0, reserved2=0.0):
super(ctypes.Structure, self).__init__()
if data is not None:
self.absolute_initial_x = data.absolute_initial_x
self.relative_initial_x = data.relative_initial_x
self.x_increment = data.x_increment
self.actual_samples = data.actual_samples
self.offset = data.offset
self.gain = data.gain
self.reserved1 = data.reserved1
self.reserved2 = data.reserved2
else:
self.absolute_initial_x = absolute_initial_x
self.relative_initial_x = relative_initial_x
self.x_increment = x_increment
self.actual_samples = actual_samples
self.offset = offset
self.gain = gain
self.reserved1 = reserved1
self.reserved2 = reserved2


class WaveformInfo:
"""Python-friendly wrapper for niRFSA waveform info."""

def __init__(self, data=None, absolute_initial_x=0.0, relative_initial_x=0.0,
x_increment=0.0, actual_samples=0, offset=0.0, gain=0.0,
reserved1=0.0, reserved2=0.0):
if data is not None:
self.absolute_initial_x = data.absolute_initial_x
self.relative_initial_x = data.relative_initial_x
self.x_increment = data.x_increment
self.actual_samples = data.actual_samples
self.offset = data.offset
self.gain = data.gain
self.reserved1 = data.reserved1
self.reserved2 = data.reserved2
else:
self.absolute_initial_x = absolute_initial_x
self.relative_initial_x = relative_initial_x
self.x_increment = x_increment
self.actual_samples = actual_samples
self.offset = offset
self.gain = gain
self.reserved1 = reserved1
self.reserved2 = reserved2

def _create_copy(self, target_class):
try:
return target_class(
absolute_initial_x=self.absolute_initial_x,
relative_initial_x=self.relative_initial_x,
x_increment=self.x_increment,
actual_samples=self.actual_samples,
offset=self.offset,
gain=self.gain,
reserved1=self.reserved1,
reserved2=self.reserved2,
)
except TypeError:
return target_class(data=self)

def __repr__(self):
return "{}.{}(absolute_initial_x={}, relative_initial_x={}, x_increment={}, actual_samples={}, offset={}, gain={}, reserved1={}, reserved2={})".format(
self.__class__.__module__,
self.__class__.__qualname__,
self.absolute_initial_x,
self.relative_initial_x,
self.x_increment,
self.actual_samples,
self.offset,
self.gain,
self.reserved1,
self.reserved2,
)

def __str__(self):
return self.__repr__()


def _populate_samples_info(waveform_infos, sample_data):
'''Chunk up flat array of sample_data and copy each chunk into individual WaveformInfo instance

Args:
waveform_infos (Iterable of WaveformInfo): WaveformInfo class instances

sample_data (Iterable of float): Waveform sample data
'''
if hasattr(sample_data, 'ndim') and sample_data.ndim == 2:
# 2D case (multi-record fetch): sample_data[i] is a 1D view of row i.
# Slice to exact actual_samples to handle rows wider than actual_samples (e.g. int16).
for i in range(len(waveform_infos)):
actual_samples = waveform_infos[i].actual_samples
waveform_infos[i].samples = sample_data[i, :actual_samples]

19 changes: 19 additions & 0 deletions src/nirfsa/metadata/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
from metadata.config import config
from metadata.functions import functions
from metadata.attributes import attributes
from metadata.enums import enums
import metadata.functions_addon
import metadata.attributes_addon
import metadata.enums_addon
import metadata.config_addon

import build.helper as helper
import sys

# Update generated functions data with hand maintained data
config['modules'] = sys.modules
helper.add_all_metadata(functions, attributes, enums, config)

__version__ = config['module_version']


Loading
Loading