--- source_files: - Common/DTS.Common/Classes/DTS.Viewer/TestMetadata/TestMetadata.cs - Common/DTS.Common/Classes/DTS.Viewer/TestMetadata/TestGraphs.cs - Common/DTS.Common/Classes/DTS.Viewer/TestMetadata/TestSetupMetadata.cs - Common/DTS.Common/Classes/DTS.Viewer/TestMetadata/TestRunMetadata.cs - Common/DTS.Common/Classes/DTS.Viewer/TestMetadata/TestSummary.cs - Common/DTS.Common/Classes/DTS.Viewer/TestMetadata/TestModule.cs - Common/DTS.Common/Classes/DTS.Viewer/TestMetadata/TestChannel.cs - Common/DTS.Common/Classes/DTS.Viewer/TestMetadata/TestMetadataList.cs generated_at: "2026-04-16T03:19:21.354792+00:00" model: "Qwen/Qwen3-Coder-Next-FP8" schema_version: 1 sha256: "2276bf4d72ccc406" --- # TestMetadata Module Documentation ## 1. Purpose This module provides data structures and parsing logic for loading, representing, and managing test metadata from XML-based `.dts` files in the DTS Viewer system. It defines core domain models (`TestMetadata`, `TestRunMetadata`, `TestSetupMetadata`, `TestModule`, `TestChannel`, `TestGraphs`, `TestSummary`) that encapsulate test configuration, hardware setup, channel definitions, and summary information. The `TestMetadataList` class is responsible for deserializing `.dts` XML files into these strongly-typed objects and constructing `TestSummary` instances for UI binding. This module serves as the foundational data layer for test data browsing, selection, and visualization components. ## 2. Public Interface ### `TestMetadataList` - **`Task> GetTestSummaryListAsync(IBaseViewModel parent, string path, string file, string pattern = "")`** Async wrapper for `GetTestSummaryList`. Returns a list of `ITestSummary` objects built from `.dts` files in the specified directory. - **`ObservableCollection GetTestSummaryList(IBaseViewModel parent, string path, string file = "", string pattern = "")`** Loads `.dts` files (matching `pattern`, default `.dts`) from `path`, parses them into `ITestMetadata`, and returns a collection of `ITestSummary` objects. `parent` is used for command wiring in `TestSummary`. - **`ObservableCollection GetTestSummaryList(string path, string file = "", string pattern = "")`** Overload of `GetTestSummaryList` without a `parent` parameter (used when `Parent` property in `TestSummary` is not required). - **`List GetTestMetadataList(XDocument xDoc, string path, string file)`** Parses an `XDocument` (representing a `.dts` XML file) into a list of `ITestMetadata` instances. Includes error handling, filtering for `TSRAIR_GO_TEST` when `RunTestVariables.IsTSRAIRGo` is true, and channel array pre-allocation. ### `TestMetadata` (implements `ITestMetadata`) - **`ITestRunMetadata TestRun { get; set; }`** Contains test run-level metadata (e.g., test ID, description, modules, channels). - **`ITestSetupMetadata TestSetup { get; set; }`** Contains test setup-level metadata (e.g., setup name, timestamp, graphs, calibration behavior). ### `TestRunMetadata` (implements `ITestRunMetadata`, `INotifyPropertyChanged`) - **`string Name { get; set; }`** Logical test name (from XML `Id` attribute). - **`string Id { get; set; }`** File name without extension (from XML `FilePath` attribute). - **`string Description { get; set; }`** Test description. - **`bool InlineSerializedData { get; set; }`** Indicates if raw data is embedded in the XML. - **`string TestGuid { get; set; }`** Unique test identifier. - **`int FaultFlags { get; set; }`** Bitmask of test fault conditions. - **`string Software { get; set; }`**, **`string SoftwareVersion { get; set; }`** Software name and version used for acquisition. - **`string DataType { get; set; }`** Type of data (e.g., "Acceleration", "Force"). - **`DateTime FileDate { get; set; }`** File system modification date. - **`string FilePath { get; set; }`** Full path to the test data file. - **`List Modules { get; set; }`** List of acquisition modules used. - **`List Channels { get; set; }`** List of physical channels. - **`List CalculatedChannels { get; set; }`** List of derived channels. - **`bool IsSelected { get; set; }`** UI selection state (raises `PropertyChanged`). - **`event PropertyChangedEventHandler PropertyChanged`** Implements `INotifyPropertyChanged`. ### `TestSetupMetadata` (implements `ITestSetupMetadata`) - **`string SetupName { get; set; }`** Name of the test setup configuration. - **`DateTime TimeStamp { get; set; }`** Setup timestamp (fallback if module timestamps are invalid/zero). - **`List TestGraphs { get; set; }`** List of graph definitions. - **`CalibrationBehaviors CalibrationBehavior { get; set; }`** Calibration strategy (e.g., `NonLinearIfAvailable`). ### `TestGraphs` (implements `ITestGraphs`) - **`string Name { get; set; }`** Graph display name. - **`string HardwareChannelName { get; set; }`** Hardware channel name associated with the graph. - **`List ChannelIds { get; set; }`** List of channel IDs included in the graph. - **`List Channels { get; set; }`** *Note: Not populated during XML parsing; likely for runtime use.* ### `TestModule` (implements `ITestModule`, `INotifyPropertyChanged`) - **`string SerialNumber { get; set; }`**, **`string BaseSerialNumber { get; set; }`** Module serial and base serial numbers. - **`int Number { get; set; }`**, **`int NumberOfChannels { get; set; }`** Module number and channel count. - **`int SampleRateHz { get; set; }`**, **`int UnsubsampledSampleRateHz { get; set; }`** Sample rates (post- and pre-subsampling). - **`double RequestedPreTriggerSeconds { get; set; }`**, **`double PreTriggerSeconds { get; set; }`**, **`double RequestedPostTriggerSeconds { get; set; }`**, **`double PostTriggerSeconds { get; set; }`** Trigger timing parameters. - **`int StartRecordTimestampSec { get; set; }`**, **`int StartRecordTimestampNanoSec { get; set; }`**, **`int TriggerTimestampSec { get; set; }`**, **`int TriggerTimestampNanoSec { get; set; }`** High-precision timestamps (PTP1588). - **`List TriggerSampleNumbers { get; set; }`** *Note: Always initialized as empty list; parsing logic returns empty list.* - **`bool PTPMasterSync { get; set; }`** Indicates PTP synchronization status. - **Tilt Sensor Angles (Pre/Post)**: `TiltSensorAxis{X,Y,Z}Degrees{Pre,Post}` — tilt sensor readings before/after test. - **Temperature Readings (Pre/Post)**: `TemperatureLocation{1-4}{Pre,Post}` — temperature sensor readings. - **`List Channels { get; set; }`**, **`List CalculatedChannels { get; set; }`** Channels associated with this module. - **`bool IsSelected { get; set; }`** Selection state (raises `PropertyChanged`). - **`event PropertyChangedEventHandler PropertyChanged`** Implements `INotifyPropertyChanged`. ### `TestChannel` (implements `ITestChannel`, `IBasePropertyChanged`, `ISerializable`) - **`string Group { get; set; }`**, **`string SubGroup { get; set; }`** Logical grouping. - **`bool IsGraphChannel { get; set; }`**, **`string GraphName { get; set; }`** Indicates if channel is used in a graph. - **`string TestId { get; set; }`**, **`string TestSetupName { get; set; }`**, **`string ModuleSerialNumber { get; set; }`** Contextual identifiers. - **`string SerialNumber { get; set; }`**, **`string ChannelId { get; set; }`** Channel serial and ID. - **`string ChannelDisplayName { get; set; }`**, **`string ChannelDescriptionString { get; set; }`** Display name and description string. - **`string ChannelName2 { get; set; }`**, **`string HardwareChannelName { get; set; }`** Alternative channel names. - **`string ChannelType { get; set; }`** Channel type (e.g., "AnalogInput"). - **`bool IsCalculatedChannel { get; set; }`** Indicates if channel is derived. - **`int Number { get; set; }`**, **`int ChannelNumber { get; set; }`** Channel numbers. - **`double Sensitivity { get; set; }`**, **`string SensitivityUnits { get; set; }`**, **`double DesiredRange { get; set; }`**, **`double ActualMaxRangeEu { get; set; }`**, **`double ActualMinRangeEu { get; set; }`**, **`double ActualMaxRangeMv { get; set; }`**, **`double ActualMinRangeMv { get; set; }`** Calibration and range parameters. - **`string Bridge { get; set; }`**, **`double BridgeResistanceOhms { get; set; }`**, **`double ZeroPoint { get; set; }`** Bridge configuration. - **`DateTime Start { get; set; }`** Channel start time. - **`string SoftwareFilter { get; set; }`**, **`bool ProportionalToExcitation { get; set; }`**, **`bool IsInverted { get; set; }`**, **`string LinearizationFormula { get; set; }`**, **`bool IsSubsampled { get; set; }`** Processing flags. - **`int AbsoluteDisplayOrder { get; set; }`** Display order index. - **`DateTime LastCalibrationDate { get; set; }`** Calibration date. - **`string SensorId { get; set; }`** Sensor identifier. - **`int OffsetToleranceLowMv { get; set; }`**, **`int OffsetToleranceHighMv { get; set; }`**, **`int DataFlag { get; set; }`** Tolerance and data quality flags. - **`string ExcitationVoltage { get; set; }`**, **`string Eu { get; set; }`**, **`bool CalSignalEnabled { get; set; }`**, **`bool ShuntEnabled { get; set; }`**, **`bool VoltageInsertionCheckEnabled { get; set; }`**, **`bool RemoveOffset { get; set; }`**, **`string ZeroMethod { get; set; }`**, **`double ZeroAverageWindowBegin { get; set; }`**, **`double ZeroAverageWindowEnd { get; set; }`** Excitation, units, and zeroing configuration. - **`int InitialEu { get; set; }`**, **`string InitialOffset { get; set; }`** Initial calibration values. - **`double MeasuredShuntDeflectionMv { get; set; }`**, **`double TargetShuntDeflectionMv { get; set; }`**, **`double MeasuredExcitationVoltage { get; set; }`**, **`double FactoryExcitationVoltage { get; set; }`** Shunt calibration parameters. - **`double TimeOfFirstSample { get; set; }`**, **`double Multiplier { get; set; }`**, **`double UserOffsetEu { get; set; }`**, **`int UnitConversion { get; set; }`** Timing, scaling, and unit conversion. - **`bool AtCapacity { get; set; }`**, **`int CapacityOutputIsBasedOn { get; set; }`** Capacity-related flags. - **`string SourceChannelNumber { get; set; }`**, **`string SourceModuleNumber { get; set; }`**, **`string SourceModuleSerialNumber { get; set; }`**, **`string Calculation { get; set; }`** For calculated channels: source and formula. - **`string BinaryFileName { get; set; }`**, **`string BinaryFilePath { get; set; }`** Binary data file info. - **`double Xmax { get; set; }`**, **`double Xmin { get; set; }`** X-axis range. - **`int SequentialNumbers { get; set; }`** Sequential index. - **`ITestSetupMetadata ParentTestSetup { get; set; }`**, **`ITestModule ParentModule { get; set; }`**, **`IBaseViewModel Parent { get; set; }`** Parent references. - **`Color ChannelColor { get; set; }`**, **`string ErrorMessage { get; set; }`**, **`bool IsError { get; set; }`**, **`Color? ErrorColor { get; set; }`** UI state properties. - **`bool IsLocked { get; set; }`**, **`bool CanLock { get; set; }`**, **`bool CanSelectChannel { get; set; }`**, **`bool IsExpanded { get; set; }`**, **`bool IsSelected { get; set; }`** Selection/locking state with side effects (e.g., updating graph view models). - **`double MinADC { get; set; }`**, **`double MaxADC { get; set; }`**, **`double AveADC { get; set; }`**, **`double StdDevADC { get; set; }`**, **`double T0ADC { get; set; }`** ADC statistics. - **`double MinMV { get; set; }`**, **`double MaxMV { get; set; }`**, **`double AveMV { get; set; }`**, **`double StdDevMV { get; set; }`**, **`double T0MV { get; set; }`** mV statistics. - **`double MinEU { get; set; }`**, **`double MaxEU { get; set; }`**, **`double AveEU { get; set; }`**, **`double StdDevEU { get; set; }`**, **`double T0EU { get; set; }`** Engineering Unit statistics. - **`double MinY { get; set; }`**, **`double MaxY { get; set; }`**, **`double AveY { get; set; }`**, **`double StdDevY { get; set; }`**, **`double T0Value { get; set; }`** Current unit statistics. - **`string SetupEID { get; set; }`**, **`string DataCollectionEID { get; set; }`** EID (likely Event ID) at setup and collection time. - **`void SetChannelDescriptionAndDisplayName(string channelDescription)`** Sets `ChannelDescriptionString` and `ChannelDisplayName`. - **`ITestChannel Copy()`** Shallow copy via `MemberwiseClone()`. - **`override string ToString()`** Returns `ChannelName2` if embedded test-specific; otherwise `ChannelDescriptionString`. ### `TestSummary` (implements `ITestSummary`, `INotifyPropertyChanged`) - **`const string ROI_SUFFIX = @"_ROI Period"`** Suffix indicating ROI period data. - **`string Id { get; set; }`** Unique ID: `TestRun.Id + ParseEventNumber(TestRun.FilePath)`. - **`string SetupName { get; set; }`**, **`string Description { get; set; }`**, **`int ChannelCount { get; set; }`**, **`DateTime FileDate { get; set; }`**, **`DateTime TimeStamp { get; set; }`**, **`string DataType { get; set; }`** Summary metadata. - **`bool IsSelected { get; set; }`** Selection state with side effects via `SelectionChanged()`. - **`List Graphs { get; set; }`**, **`List Channels { get; set; }`**, **`List CalculatedChannels { get; set; }`** References to metadata. - **`IBaseViewModel Parent { get; set; }`** Parent view model (for command binding). - **`CalibrationBehaviors CalibrationBehavior { get; set; } = CalibrationBehaviors.NonLinearIfAvailable`** Default calibration behavior. - **`ITestMetadata TestMetadata { get; set; }`** Full metadata object. - **`DelegateCommand IsSelectedCommand { get; }`** Command bound to `IsSelected` property. - **`void SelectionChanged()`** Updates `Parent.SelectedTestSummaryList` and publishes via `IEventAggregator`. - **`event PropertyChangedEventHandler PropertyChanged`** Implements `INotifyPropertyChanged`. ## 3. Invariants - **`TestMetadata`** must always have non-null `TestRun` and `TestSetup` properties after construction (defaults are created on parse failure). - **`TestSummary.Id`** is constructed as `TestRun.Id + ParseEventNumber(TestRun.FilePath)`. `ParseEventNumber` extracts the segment starting with `DTS.Common.Constants.EventNumber` from the file path. - **`TestSummary.TimeStamp`** is determined by `TestMetadataList.GetTimestamp()`: - Uses minimum PTP1588 timestamp from modules (trigger or start record). - Falls back to `TestSetup.TimeStamp` if module timestamps are invalid (e.g., zero, before 1990). - **`TestChannel.ChannelId`** defaults to `GetHashCode().ToString()` if the XML attribute is missing or `-1`. - **`TestChannel.HardwareChannelName`** is set to `Strings.Strings.Table_NA` for calculated channels (per comment `//