95 lines
5.7 KiB
Markdown
95 lines
5.7 KiB
Markdown
|
|
---
|
||
|
|
source_files:
|
||
|
|
- Common/DTS.Common.SerializationPlus/EventInfoAggregate.cs
|
||
|
|
generated_at: "2026-04-16T14:13:19.550350+00:00"
|
||
|
|
model: "zai-org/GLM-5-FP8"
|
||
|
|
schema_version: 1
|
||
|
|
sha256: "342395eec4a038a1"
|
||
|
|
---
|
||
|
|
|
||
|
|
# Documentation: EventInfoAggregate
|
||
|
|
|
||
|
|
## 1. Purpose
|
||
|
|
|
||
|
|
`EventInfoAggregate` is an aggregate data structure that consolidates event information from multiple Data Acquisition System (DAS) devices/modules into a single unified view. It implements `IEventInfoAggregate` and serves as a central repository for event metadata during download operations, tracking properties like event identification, duration, channel counts, sample counts, and fault status across multiple hardware units that recorded the same event.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 2. Public Interface
|
||
|
|
|
||
|
|
### Properties
|
||
|
|
|
||
|
|
| Property | Type | Description |
|
||
|
|
|----------|------|-------------|
|
||
|
|
| `EventId` | `string` | Identifier for the test/event. |
|
||
|
|
| `EventDescription` | `string` | Human-readable description of the event. |
|
||
|
|
| `DurationSeconds` | `double` | Total event duration in seconds (PreTriggerSeconds + PostTriggerSeconds). |
|
||
|
|
| `GUID` | `string` | Globally unique identifier for the test. |
|
||
|
|
| `HasBeenDownloaded` | `bool` | Indicates whether the event data has been downloaded. |
|
||
|
|
| `WasTriggered` | `bool` | Indicates whether the event was triggered. |
|
||
|
|
| `NumberOfChannels` | `int` | Total number of channels across all modules. |
|
||
|
|
| `NumberOfSamples` | `ulong` | Number of samples per channel. |
|
||
|
|
| `NumberOfBytes` | `ulong` | Calculated total bytes: `NumberOfSamples * NumberOfChannels * 2`. |
|
||
|
|
| `Faulted` | `bool` | Indicates if any module reported a fault condition. |
|
||
|
|
| `EventNumber` | `int` | Sequential event number identifier. |
|
||
|
|
|
||
|
|
### Methods
|
||
|
|
|
||
|
|
#### `EventInfoAggregate(DownloadReport.EventInfo newEvent)`
|
||
|
|
Constructor that initializes the aggregate from a single `DownloadReport.EventInfo`. Populates all properties and adds the first DAS module to the internal `_eventIndices` dictionary.
|
||
|
|
|
||
|
|
#### `void Add(IEventInfo newEvent)`
|
||
|
|
Merges additional event information from another module into this aggregate. Accumulates channel counts, recalculates `NumberOfBytes`, updates `Faulted` status, and adds the DAS to `_eventIndices`. Logs warnings for mismatched fields but does not throw exceptions.
|
||
|
|
|
||
|
|
#### `Slice.Control.Event GetEvent()`
|
||
|
|
Returns a lazily-instantiated `Slice.Control.Event` object, creating it if necessary.
|
||
|
|
|
||
|
|
#### `Slice.Control.Event GetEvent(bool bClear)`
|
||
|
|
Returns the `Slice.Control.Event` object. If `bClear` is `true`, resets the cached `_event` to null before returning (forcing recreation on next call).
|
||
|
|
|
||
|
|
#### `int GetEventIndex(IDASCommunication idas)`
|
||
|
|
Returns the event index for a specific DAS device. Returns `-1` and logs an error if the DAS is not found in `_eventIndices`.
|
||
|
|
|
||
|
|
#### `List<IDASCommunication> GetDasList()`
|
||
|
|
Returns a lazily-instantiated list of all DAS devices associated with this event. The list is cached after first creation.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 3. Invariants
|
||
|
|
|
||
|
|
- **Empty Modules Handling**: When `Modules` collection is empty, `DurationSeconds` and `NumberOfSamples` are set to `0` rather than throwing an exception.
|
||
|
|
- **Byte Calculation**: `NumberOfBytes` is always calculated as `2 * NumberOfChannels * NumberOfSamples` (assumes 2 bytes per sample per channel).
|
||
|
|
- **Fault Detection**: An event is considered faulted if `FaultFlags != 0` OR `FaultFlagsEx != 0` on any constituent module.
|
||
|
|
- **Event Index Dictionary**: `_eventIndices` is always initialized (readonly field) and maps `IDASCommunication` instances to their event numbers.
|
||
|
|
- **Minimum Value Resolution**: When merging events with mismatched `DurationSeconds` or `NumberOfSamples`, the minimum value is retained.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 4. Dependencies
|
||
|
|
|
||
|
|
### This module depends on:
|
||
|
|
- `System`, `System.Collections.Generic`, `System.Linq` (BCL)
|
||
|
|
- `DTS.Common.Interface.DASFactory` — provides `IDASCommunication`
|
||
|
|
- `DTS.Common.Interface.DASFactory.Download` — provides `DownloadReport.EventInfo`, `IEventInfo`, `DASModule`
|
||
|
|
- `DTS.Common.Utilities.Logging` — provides `APILogger`
|
||
|
|
- `DTS.DASLib.Service` — namespace import (specific usage unclear from source)
|
||
|
|
- `Slice.Control.Event` — external type instantiated in `GetEvent()` (assembly/source not specified in imports)
|
||
|
|
|
||
|
|
### What depends on this module:
|
||
|
|
- Not determinable from source alone. The `IEventInfoAggregate` interface suggests consumers depend on the interface rather than concrete implementation.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 5. Gotchas
|
||
|
|
|
||
|
|
1. **Silent Mismatch Handling**: The `Add()` method logs warnings for mismatched `TestID`, `Description`, `GUID`, `HasBeenDownloaded`, `WasTriggered`, and `EventNumber` values but **continues processing**. Callers are not notified of data integrity issues beyond log entries.
|
||
|
|
|
||
|
|
2. **Minimum Value Strategy**: When `DurationSeconds` or `NumberOfSamples` differ between modules being aggregated, the code silently takes the minimum value. This may result in data loss if larger values are correct.
|
||
|
|
|
||
|
|
3. **Empty Modules Edge Case**: The constructor guards against empty `Modules` collections (added per case 15575), but the `Add()` method **does not** — it accesses `newEvent.Modules[0]` without null/empty checks, which will throw `ArgumentOutOfRangeException` if `Modules` is empty.
|
||
|
|
|
||
|
|
4. **Lazy Initialization Side Effects**: `GetDasList()` and `GetEvent()` cache their results. The `_das` list is not invalidated when `Add()` is called, potentially returning stale data if `GetDasList()` was called before all `Add()` operations completed.
|
||
|
|
|
||
|
|
5. **Index Assignment for Duplicates**: `_eventIndices` uses indexer assignment (`_eventIndices[...] = value`) rather than `.Add()` to silently overwrite duplicate keys. This was added per case 44357 but means duplicate DAS entries are not detected or logged.
|
||
|
|
|
||
|
|
6. **Error Return Convention**: `GetEventIndex()` returns `-1` for missing keys rather than throwing an exception. Callers must check for this sentinel value.
|