Coverage for src / sdynpy / fileio / sdynpy_uff_datasets / sdynpy_uff_dataset_1858.py: 20%
66 statements
« prev ^ index » next coverage.py v7.13.4, created at 2026-03-11 16:22 +0000
« prev ^ index » next coverage.py v7.13.4, created at 2026-03-11 16:22 +0000
1# -*- coding: utf-8 -*-
2"""
3Dataset 58 Qualifiers
5This dataset defines additional function information that is not included in
6dataset 58.
7"""
8"""
9Copyright 2022 National Technology & Engineering Solutions of Sandia,
10LLC (NTESS). Under the terms of Contract DE-NA0003525 with NTESS, the U.S.
11Government retains certain rights in this software.
13This program is free software: you can redistribute it and/or modify
14it under the terms of the GNU General Public License as published by
15the Free Software Foundation, either version 3 of the License, or
16(at your option) any later version.
18This program is distributed in the hope that it will be useful,
19but WITHOUT ANY WARRANTY; without even the implied warranty of
20MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21GNU General Public License for more details.
23You should have received a copy of the GNU General Public License
24along with this program. If not, see <https://www.gnu.org/licenses/>.
25"""
27from ..sdynpy_uff import parse_uff_line, parse_uff_lines, write_uff_line
28import numpy as np
31def is_abscissa_even(abscissa):
32 abscissa_inc = np.mean(np.diff(abscissa))
33 abscissa_start = abscissa[0]
34 return np.allclose(abscissa, abscissa_start + abscissa_inc * np.arange(abscissa.size))
37class Sdynpy_UFF_Dataset_1858:
38 def __init__(self, set_record_number, octave_format, measurement_run,
39 weighting_type, window_type, amplitude_units, normalization_method,
40 abscissa_data_qualifier, ordinate_num_data_qualifier,
41 ordinate_den_data_qualifier, zaxis_data_qualifier,
42 sampling_type, time_average, zrpm, ztime, zorder, number_samples,
43 uservalue1, uservalue2, uservalue3, uservalue4,
44 exponential_window_damping_factor, overall_rms, weighted_rms,
45 response_direction, reference_direction):
46 self.set_record_number = set_record_number
47 self.octave_format = octave_format
48 self.measurement_run = measurement_run
49 self.weighting_type = weighting_type
50 self.window_type = window_type
51 self.amplitude_units = amplitude_units
52 self.normalization_method = normalization_method
53 self.abscissa_data_qualifier = abscissa_data_qualifier
54 self.ordinate_num_data_qualifier = ordinate_num_data_qualifier
55 self.ordinate_den_data_qualifier = ordinate_den_data_qualifier
56 self.zaxis_data_qualifier = zaxis_data_qualifier
57 self.sampling_type = sampling_type
58 self.time_average = time_average
59 self.zrpm = zrpm
60 self.ztime = ztime
61 self.zorder = zorder
62 self.number_samples = number_samples
63 self.uservalue1 = uservalue1
64 self.uservalue2 = uservalue2
65 self.uservalue3 = uservalue3
66 self.uservalue4 = uservalue4
67 self.exponential_window_damping_factor = exponential_window_damping_factor
68 self.overall_rms = overall_rms
69 self.weighted_rms = weighted_rms
70 self.response_direction = response_direction
71 self.reference_direction = reference_direction
73 @property
74 def dataset_number(self):
75 return 1858
77 @classmethod
78 def from_uff_data_array(cls, data):
79 # Transform from binary to ascii
80 data = [line.decode() for line in data]
81 # Record 1: FORMAT(6I12)
82 # Field 1 - Set record number
83 # Field 2 - Octave format
84 # 0 - not in octave format (default)
85 # 1 - octave
86 # 3 - one third octave
87 # n - 1/n octave
88 # Field 3 - Measurement run number
89 # Fields 4-6 - Not used (fill with zeros)
90 set_record_number, octave_format, measurement_run, not_used, not_used, not_used = parse_uff_line(
91 data[0], 6 * ['I12'])
92# Record 2: FORMAT(12I6)
93# Field 1 - Weighting Type
94# 0 - No weighting or Unknown (default)
95# 1 - A weighting
96# 2 - B weighting
97# 3 - C weighting
98# 4 - D weighting (not yet implemented)
99# Field 2 - Window Type
100# 0 - No window or unknown (default)
101# 1 - Hanning Narrow
102# 2 - Hanning Broad
103# 3 - Flattop
104# 4 - Exponential
105# 5 - Impact
106# 6 - Impact and Exponential
107# Field 3 - Amplitude units
108# 0 - unknown (default)
109# 1 - Half-peak scale
110# 2 - Peak scale
111# 3 - RMS
112# Field 4 - Normalization Method
113# 0 - unknown (default)
114# 1 - Units squared
115# 2 - Units squared per Hz (PSD)
116# 3 - Units squared seconds per Hz (ESD)
117# Field 5 - Abscissa Data Type Qualifier
118# 0 - Translation
119# 1 - Rotation
120# 2 - Translation Squared
121# 3 - Rotation Squared
122# Field 6 - Ordinate Numerator Data Type Qualifier
123# 0 - Translation
124# 1 - Rotation
125# 2 - Translation Squared
126# 3 - Rotation Squared
127# Field 7 - Ordinate Denominator Data Type Qualifier
128# 0 - Translation
129# 1 - Rotation
130# 2 - Translation Squared
131# 3 - Rotation Squared
132# Field 8 - Z-axis Data Type Qualifier
133# 0 - Translation
134# 1 - Rotation
135# 2 - Translation Squared
136# 3 - Rotation Squared
137# Field 9 - Sampling Type
138# 0 - Dynamic
139# 1 - Static
140# 2 - RPM from Tach
141# 3 - Frequency from tach
142# 4 - Octave
143# Field 10 - Time Average
144# 0 - None
145# 1 - Fast
146# 2 - Slow
147# 3 - Impulse
148# 4 - Linear
149# Fields 11-12 - not used (fill with zeros)
150 (weighting_type, window_type, amplitude_units, normalization_method,
151 abscissa_data_qualifier, ordinate_num_data_qualifier,
152 ordinate_den_data_qualifier, zaxis_data_qualifier,
153 sampling_type, time_average, not_used, not_used) = parse_uff_line(data[1], 12 * ['I6'])
154# Record 3: FORMAT (1P5E15.7)
155# Field 1 - Z RPM value
156# Field 2 - Z Time value
157# Field 3 - Z Order value
158# Field 4 - Number of samples
159# Field 5 - Not used
160 zrpm, ztime, zorder, number_samples, not_used = parse_uff_line(data[2], 5 * ['E15.7'])
161# Record 4: FORMAT (1P5E15.7)
162# Field 1 - User value 1
163# Field 2 - User value 2
164# Field 3 - User value 3
165# Field 4 - User value 4
166# Field 5 - Exponential window damping factor
167 (uservalue1, uservalue2, uservalue3, uservalue4,
168 exponential_window_damping_factor) = parse_uff_line(data[3], 5 * ['E15.7'])
169# Record 5: FORMAT (1P5E15.7)
170# Field 1 - Overall RMS
171# Field 2 - Weighted RMS
172# Fields 3-5 - not used (fill with zeros)
173 overall_rms, weighted_rms, not_used, not_used, not_used = parse_uff_line(
174 data[4], 5 * ['E15.7'])
175# Record 6: FORMAT (2A2,2X,2A2)
176# Field 1 - Response direction
177# Field 2 - Reference direction
178 response_direction, reference_direction = parse_uff_line(data[5], ['A4', 'X2', 'A4'])
179# Record 7: FORMAT (40A2)
180# Field 1 - not used
181 # Now create the dataset
182 ds_1858 = cls(set_record_number, octave_format, measurement_run,
183 weighting_type, window_type, amplitude_units, normalization_method,
184 abscissa_data_qualifier, ordinate_num_data_qualifier,
185 ordinate_den_data_qualifier, zaxis_data_qualifier,
186 sampling_type, time_average, zrpm, ztime, zorder, number_samples,
187 uservalue1, uservalue2, uservalue3, uservalue4,
188 exponential_window_damping_factor, overall_rms, weighted_rms,
189 response_direction, reference_direction)
190 return ds_1858
192 def __repr__(self):
193 return 'Sdynpy_UFF_Dataset_1858'
195 def write_string(self):
196 return_string = ''
197 return_string += write_uff_line([self.set_record_number,
198 self.octave_format,
199 self.measurement_run,
200 0, 0, 0], 6 * ['I12'])
201 return_string += write_uff_line([self.weighting_type, self.window_type, self.amplitude_units, self.normalization_method,
202 self.abscissa_data_qualifier, self.ordinate_num_data_qualifier,
203 self.ordinate_den_data_qualifier, self.zaxis_data_qualifier,
204 self.sampling_type, self.time_average, 0, 0], 12 * ['I6'])
205 return_string += write_uff_line([self.zrpm, self.ztime, self.zorder, self.number_samples, 0],
206 5 * ['E15.7'])
207 return_string += write_uff_line([self.uservalue1, self.uservalue2, self.uservalue3, self.uservalue4,
208 self.exponential_window_damping_factor],
209 5 * ['E15.7'])
210 return_string += write_uff_line([self.overall_rms, self.weighted_rms, 0, 0, 0],
211 5 * ['E15.7'])
212 return_string += write_uff_line([self.response_direction,
213 self.reference_direction], ['A4', 'X2', 'A4'])
214 return_string += write_uff_line(['NONE'], ['A80'])
215 return return_string
217 def __str__(self):
218 lines = self.write_string().split('\n')
219 if len(lines) > 8:
220 return 'Dataset 1858: Data\n ' + '\n '.join(lines[0:5] + ['.', '.', '.'])
221 else:
222 return 'Dataset 1858: Data\n ' + '\n '.join(lines)
225def read(data):
226 return Sdynpy_UFF_Dataset_1858.from_uff_data_array(data)