Coverage for C: \ Users \ peaco \ OneDrive \ Documents \ GitHub \ mt_metadata \ mt_metadata \ processing \ time_series_decimation.py: 95%

22 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, model_validator 

7 

8from mt_metadata.base import MetadataBase 

9from mt_metadata.common.enumerations import StrEnumerationBase 

10 

11 

12# ===================================================== 

13class MethodEnum(StrEnumerationBase): 

14 default = "default" 

15 other = "other" 

16 

17 

18class TimeSeriesDecimation(MetadataBase): 

19 level: Annotated[ 

20 int | None, 

21 Field( 

22 default=None, 

23 description="Decimation level, must be a non-negative integer starting at 0", 

24 alias=None, 

25 json_schema_extra={ 

26 "units": None, 

27 "required": True, 

28 "examples": ["0"], 

29 }, 

30 ), 

31 ] 

32 

33 factor: Annotated[ 

34 float, 

35 Field( 

36 default=1.0, 

37 description="Decimation factor between parent sample rate and decimated time series sample rate.", 

38 alias=None, 

39 json_schema_extra={ 

40 "units": None, 

41 "required": True, 

42 "examples": ["4.0"], 

43 }, 

44 ), 

45 ] 

46 

47 method: Annotated[ 

48 MethodEnum, 

49 Field( 

50 default=MethodEnum.default, 

51 description="Type of decimation", 

52 alias=None, 

53 json_schema_extra={ 

54 "units": "", 

55 "required": True, 

56 "examples": ["default"], 

57 }, 

58 ), 

59 ] 

60 

61 sample_rate: Annotated[ 

62 float, 

63 Field( 

64 default=1.0, 

65 description="Sample rate of the decimation level data (after decimation).", 

66 alias=None, 

67 json_schema_extra={ 

68 "units": "samples per second", 

69 "required": True, 

70 "examples": ["256"], 

71 }, 

72 ), 

73 ] 

74 

75 anti_alias_filter: Annotated[ 

76 str | None, 

77 Field( 

78 default="default", 

79 description="Type of anti alias filter for decimation.", 

80 alias=None, 

81 json_schema_extra={ 

82 "units": None, 

83 "required": True, 

84 "examples": ["default"], 

85 }, 

86 ), 

87 ] 

88 

89 @model_validator(mode="before") 

90 @classmethod 

91 def check_level(cls, values): 

92 """Check that level is a non-negative integer and set anti_alias_filter for level 0.""" 

93 # Handle both dict and model instances 

94 if isinstance(values, dict): 

95 level = values.get("level") 

96 else: 

97 level = getattr(values, "level", None) 

98 

99 # Only perform validation if level is an integer or None 

100 if level is not None and isinstance(level, int) and level < 0: 

101 raise ValueError("Decimation level must be a non-negative integer.") 

102 # elif level == 0: 

103 # # Set anti_alias_filter to None for level 0 

104 # if isinstance(values, dict): 

105 # values["anti_alias_filter"] = None 

106 # else: 

107 # values.anti_alias_filter = None 

108 

109 return values