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

1# -*- coding: utf-8 -*- 

2""" 

3Dataset 58 Qualifiers 

4 

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. 

12 

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. 

17 

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. 

22 

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""" 

26 

27from ..sdynpy_uff import parse_uff_line, parse_uff_lines, write_uff_line 

28import numpy as np 

29 

30 

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)) 

35 

36 

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 

72 

73 @property 

74 def dataset_number(self): 

75 return 1858 

76 

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 

191 

192 def __repr__(self): 

193 return 'Sdynpy_UFF_Dataset_1858' 

194 

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 

216 

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) 

223 

224 

225def read(data): 

226 return Sdynpy_UFF_Dataset_1858.from_uff_data_array(data)