Overview

Information files are the core units of the obsinfo system. We present here the most important concepts, the hierarchy of information files and some examples.

Concepts

  • The basic hierarchy is subnetwork -> stations -> instrumentation -> channels -> {datalogger, preamplifier, sensor} -> stages -> filter

  • datalogger, preamplifier and sensor objects:
    • are at the same level and all have stages subobjects.

    • Are refered to collectively as`instrument_compoents`

    • Their stages are put into StationXML from top (stage N) to bottom (stage N+M). The ordering is sensor -> preamplifier -> datalogger, so the top sensor stage will be the instrument’s stage 0.

    • preamplifier is optional.

  • information is generally divided into “atomic” files which are referenced using the $ref: operator (inherited from JSONref).

  • The paths in the $ref operator are added to the datapath specified in the .obsinforc file (often the current directory, a local instrumentation database and possibly an online database)

  • base objects and configuration (Details)
    • allow partial (pre-configured) customization of station, instrumentation and instrument_component objects

    • are specified using a base and (optional) config object at each of these levels in the information files.

    • Use configuration_definitions (and a configuration_default object in case config is not specified) sub-objects specified within the base configurable object

  • channel modifications (Details)
    • allow full customization of all objects

    • provide a “base” customization for all channels, then a specification/customization of differences between individual channels

  • The order of evaluation for customization is base < config < channel_modifications. Within channel_modifications, the most specific channel specifiers override the more general ones.

Hierarchy

We will present:

  1. A basic level diagram of the entire structure (missing many sub-fields)

  2. A full decription of each atomic-level object

  3. A full level diagram of the entire structure, including all sub-fields

The definition (JSON Schemas) for the information files are found in obsinfo/data/schemas

1) Basic level diagram

Only required fields are shown, except a few very commonly-used fields, which are prefixed by “*”. Atomic objects described below are surrounded by <>

subnetwork:
    operators:
        - <operator>
    network: <network>
    stations:
        {STATIONNAME1}: <station>
            site: <string>
            start_date: <string>
            end_date: <string>
            location_code: <string>
            locations:
                {LOCATION_1}: <location>
                {LOCATION_2}: <location>
                ...
            instrumentation: <instrumentation>
                base: <instrumentation_base>
                    equipment: <equipment>
                    channels:
                        default: <channel>
                            datalogger:
                                base: <datalogger_base>
                                    equipment: <equipment>
                                    sample_rate: <number>
                                    stages:
                                        -
                                            base: <stage_base>
                                                input_units:
                                                    name: <string>
                                                    description: <string>
                                                output_units:
                                                    name: <string>
                                                    description: <string>
                                                gain:
                                                    value: <number>
                                                filter: <filter>
                                                    type: <string>
                                        - base: <stage>
                                        - ...
                            *preamplifier: <preamplifier>
                                base:
                                    equipment:
                                        <equipment>
                                    stages:
                                        - base: <stage>
                                        - base: <stage>
                                        - ...
                            sensor: <sensor>
                                base:
                                    equipment:
                                        <equipment>
                                    seed_codes:
                                        band_base: "B" or "S"
                                        instrument: <single character>
                                    stages:
                                        - base: <stage>
                                        - base: <stage>
                                        - ...
                       {SPECIFIC-CHANNEL1}: subset of <channel>
                       {SPECIFIC-CHANNEL2}: subset of <channel>
                       ...
        {STATIONNAME2}:
            ...

2) Atomic level diagram with comments

Starred fields are optional. If you put a level in a separate file, it is good practice to use the following file structure:

format_version: <format_version>
*revision: <revision>
*notes: <list of strings>
level: <level>

Major objects

subnetwork
network: <network>
operators: <list of operator>
stations:
    <STATIONNAME1>:
        <station>
    <STATIONNAME2>:
        <station>
    ...
*reference_names:
    campaign: <string>
    operator: <string>
*comments: list of strings
*extras: <free-form object>
network
code: <string>
name: <string>
start_date: <date-formatted string>
end_date: <date-formatted string>
description: <string>
*operators: <list of operator>
*comments: <list of <string> and/or <stationxml_comment>>
*restricted_status: 'open', 'closed', or 'partial'
*source_id: <uri-formatted string>
*identifiers: <list of uri-formatted string, must have prefix>
station
site: <string>
start_date: <string>
end_date: <string>
location_code: <string>
locations: object list of <location>
instrumentation:
    base: <instrumentation_base>
    *configuration: <string>
    *modifications: <modifications>
    *channel_modifications: {}
    *serial_number: <string>
    *notes: <list of strings>
*operators: <operators>
*comments: list of strings or <stationxml_comment>
*extras: <free-form object>
*processing:
    - *clock_correction_linear: {}
    - *clock_correction_leapsecond: {}
*restricted_status: ['open', 'closed', 'partial', or 'unknown']
*source_id: <string in uri format>
*external_references:
    - uri: <string in uri format>
      description: <string>
*identifiers:
    - <string in uri format>
*water_level: <number>
*notes: <list of strings>
instrumentation_base
equipment: {}
channels:
    default:
        <channel>
   <SPECIFIC-CHANNEL1>:
        subset of <channel>
   <SPECIFIC-CHANNEL2>:
        subset of <channel>
   ...
*configuration_default: <string>
*configurations:
    {CONFIGURATION_1}: <subset of instrumentation>
    {CONFIGURATION_2}: <subset of instrumentation>
    ...
channel
datalogger:
    base: <datalogger>
    *configuration: <string>
sensor:
    base: <sensor>
    *configuration: string
*preamplifier:*
    base: <preamplifier>
    *configuration: <string>
*orientation: <orientation>
*location_code: <string>   # if not specified, inherits from station
*comments: <list of string>
*restricted_status": 'open', 'closed'
*source_id": <uri-formatted string>
*identifiers": <list of uri-formatted strings, must have scheme>
*external_references": <list of {uri: description}>
*extras: <free-format object>
datalogger_base
<GENERIC_COMPONENT>
sample_rate: number
*correction: number
preamplifier_base
<GENERIC_COMPONENT>
sensor_base
<GENERIC_COMPONENT>
 seed_codes:
GENERIC_COMPONENT
equipment:  <equipment>
*stage_modifications: {}
*notes: <list of string>
*stages:
    - base: <stage>
      *configuration: <string>
    - base: <stage>
      *configuration: <string>
    - ...
*configuration_default: <string>
*configurations:
    {CONFIGURATION_1}: <subset of datalogger, sensor, or preamplifier>
    {CONFIGURATION_2}: <subset of datalogger, sensor, or preamplifier>
    ...
stage_base
input_units: <string>
output_units: <string>
gain: <float>
*name: <string>
*description: <string>
*decimation_factor: <integer>
*delay: <number>
*calibration_date: <string>
*polarity: '+' or '-'     # default is '+'
*input_sample_rate: <number>
*resource_id: <string>
*filter:
    <filter>
*configuration_default: <string>
*configurations:
    {CONFIGURATION_1}: <subset of stage>
    {CONFIGURATION_2}: <subset of stage>
    ...
filter

fields depend on type:

type: "PoleZeros"
poles: <list of string>
zeros: <list of string>
*delay.samples: <float>
*transfer_function_type:  "LAPLACE (RADIANS/SECOND)", "LAPLACE (HERTZ)", or "DIGITAL (Z-TRANSFORM)"
*normalization_frequency: <number>
*normalization_factor: <number>
*resource_id: <string>
type: "FIR"
symmetry:  "EVEN", "ODD" or "NONE"
coefficients:  <list>
coefficient_divisor: <number>
*delay.samples: <number>
*resource_id: <string>
type: "Coefficients"
numerator_coefficients: <list>
denominator_coefficients": <list>
*delay.samples: <number>
*transfer_function_type: "ANALOG (RADIANS/SECOND)", "ANALOG (HERTZ)" or "DIGITAL"*
*offset: <number>
*resource_id: <string>
type: "ResponseList"
elements: <list>
*delay.samples: <number>
*resource_id: <string>
type: "Polynomial"
frequency_lower_bound: <number>
frequency_upper_bound: <number>
approximation_lower_bound: <number>
approximation_upper_bound: <number>
maximum_error: <number>
coefficients: <list of number>
*approximation_type: "MACLAURIN"
*resource_id: <string>
type: "ADConversion"
input_full_scale: <number>
output_full_scale: <number>
*delay.samples: <number>
*resource_id: <string>
type: "Analog"
*delay.seconds: <number>
*resource_id: <string>
type: "Digital"
*delay.samples: <number>
*resource_id: <string>

Minor objects

person_, operator_, location_base_ and network are often in separate files.

equipment_ is widespread enough that it should probably have its own schema file

names: <list of string>
*agencies: <list of string>
*emails: <list of string>
*phones: <list of string>
type: <string>
description: <string>
manufacturer: <string>
model: <string>
*vendor: <string>
*serial_number: <string>
*installation_date: <date-formatted string>
*removal_date: <date-formatted string>
*calibration_dates: <list of date_formatted strings>
*resource_id: <'GENERATOR:Meaningful ID' str>
base:
    uncertainties.m:
        lat: <number> (in meters)
        lon: <number> (in meters)
        elev: <number> (in meters)
    depth.m: <number>
    geology: <string>
    vault: <string>
    *localisation_method: <string>
position:
    lat: <number> (in degrees)
    lon: <number> (in degrees)
    elev: <number> (in meters)
agency: <string>
*contacts: <list of person>
*website: <string>
date: <string>
authors: <list of person>
value: <string>
*begin_effective_time: <date-formatted string>
*end_effective_time: <date-formatted string>
*authors: <list of person>

3) Full level diagram

Structural units

A full obsinfo subnetwork description consists of the following fields (starred fields are optional):

format_version: {}
*revision: {}
*notes: []
subnetwork:
    network: <network>
    operators: <list of operator>
    *restricted_state: {}
    *comments: <list of string>
    *extras: <free-form object>
    *reference_names:
        campaign: <string>
        operator: <string>
    stations:
        <STATIONNAME1>:
            site: <string>
            start_date: <string>
            end_date: <string>
            location_code: <string>
            *serial_number: <string>
            *operators: <list of operator>
            instrumentation:
                base:
                    equipment: <equipment>
                    channels:
                        default:
                            *orientation: <orientation>
                            datalogger:
                                base:
                                    << GENERIC_COMPONENT
                                    sample_rate: <number>
                                    *correction: <number>
                                *configuration: <string>
                                *modifications: <subset of base>
                                *stage_modifications: <stage_modifications>
                                *serial_number: <string>
                                *notes: <list of string>
                            *preamplifier:*
                                base:
                                    << GENERIC_COMPONENT
                                *configuration: <string>
                                *modifications: <subset of base>
                                *stage_modifications: <stage_modifications>
                                *serial_number: <string>
                                *notes: <list of string>
                            sensor:
                                base:
                                    << GENERIC_COMPONENT
                                    seed_codes:
                                        band_base: 'B' or 'S'
                                        instrument: <character>
                                *configuration: <string>
                                *modifications: <subset of base>
                                *stage_modifications: <stage_modifications>
                                *serial_number: <string>
                                *notes: <list of string>
                            *location_code: <string>
                            *restricted_status: 'open', 'closed', or 'partial'
                            *source_id: <uri-formatted string>
                            *identifiers: <list of uri-formatted strings>
                            *external_references:
                                - uri: <uri-formatted string>
                                  description: <string>
                            *comments: <list of string or stationxml_comment>
                            *extras: <free-form object>
                       <SPECIFIC-CHANNEL1>: {}
                       <SPECIFIC-CHANNEL2>: {}
                       ...
                *channel_modifications: {}
                *serial_number: <string>
            locations: {}
            *notes: <list of string>
            *comments: <list of string or stationxml_comment>
            *extras: <free-form object>
            *processing:
                - *clock_correction_linear: {}
                - *clock_correction_leapsecond: {}
            *water_level.m: <number>
            *restricted_status: 'open', 'closed', or 'partial'
            *source_id: <uri-formatted string>
            *identifiers: <list of uri-formatted strings>
            *external_references:
                - uri: <uri-formatted string>
                  description: <string>
        <STATIONNAME2>:
            ...