Coverage for C: \ Users \ peaco \ OneDrive \ Documents \ GitHub \ mt_metadata \ mt_metadata \ features \ feature_decimation_channel.py: 92%

25 statements  

« prev     ^ index     » next       coverage.py v7.13.1, created at 2026-01-10 00:11 -0800

1# ===================================================== 

2# Imports 

3# ===================================================== 

4from typing import Annotated 

5 

6from pydantic import Field, field_validator 

7 

8from mt_metadata.base import MetadataBase 

9from mt_metadata.common import TimePeriod 

10from mt_metadata.common.units import get_unit_object 

11 

12 

13# ===================================================== 

14class FeatureDecimationChannel(MetadataBase): 

15 name: Annotated[ 

16 str, 

17 Field( 

18 default="", 

19 description="Name of channel", 

20 alias=None, 

21 json_schema_extra={ 

22 "units": None, 

23 "required": True, 

24 "examples": ["ex"], 

25 }, 

26 ), 

27 ] 

28 

29 frequency_max: Annotated[ 

30 float, 

31 Field( 

32 default=0.0, 

33 description="Highest frequency present in the sprectrogam data.", 

34 alias=None, 

35 json_schema_extra={ 

36 "units": "samples per second", 

37 "required": True, 

38 "examples": [77.0], 

39 }, 

40 ), 

41 ] 

42 

43 frequency_min: Annotated[ 

44 float, 

45 Field( 

46 default=0.0, 

47 description="Lowest frequency present in the sprectrogam data.", 

48 alias=None, 

49 json_schema_extra={ 

50 "units": "samples per second", 

51 "required": True, 

52 "examples": [99.0], 

53 }, 

54 ), 

55 ] 

56 

57 sample_rate_decimation_level: Annotated[ 

58 float, 

59 Field( 

60 default=1.0, 

61 description="Sample rate of the time series that was Fourier transformed to generate the FC decimation level.", 

62 alias=None, 

63 json_schema_extra={ 

64 "units": "samples per second", 

65 "required": True, 

66 "examples": [60], 

67 }, 

68 ), 

69 ] 

70 

71 sample_rate_window_step: Annotated[ 

72 float, 

73 Field( 

74 default=1.0, 

75 description="Sample rate of the windows.", 

76 alias=None, 

77 json_schema_extra={ 

78 "units": "samples per second", 

79 "required": True, 

80 "examples": [4], 

81 }, 

82 ), 

83 ] 

84 

85 units: Annotated[ 

86 str, 

87 Field( 

88 default="count", 

89 description="Units of the channel", 

90 alias=None, 

91 json_schema_extra={ 

92 "units": None, 

93 "required": True, 

94 "examples": ["milliVolts"], 

95 }, 

96 ), 

97 ] 

98 

99 time_period: Annotated[ 

100 TimePeriod, 

101 Field( 

102 default_factory=TimePeriod, 

103 description="Time period of the channel", 

104 alias=None, 

105 json_schema_extra={ 

106 "units": None, 

107 "required": True, 

108 "examples": [{"start": "2020-01-01", "end": "2020-01-02"}], 

109 }, 

110 ), 

111 ] 

112 

113 @field_validator("units", mode="before") 

114 @classmethod 

115 def validate_units(cls, value: str) -> str: 

116 if value in [None, ""]: 

117 return "" 

118 try: 

119 unit_object = get_unit_object(value) 

120 return unit_object.name 

121 except ValueError as error: 

122 raise KeyError(error) 

123 except KeyError as error: 

124 raise KeyError(error)