Skip to article frontmatterSkip to article content

Introduction to MT Metadata

MT metadata was developed by the Working Group for Magnetotelluric Data Handling and Software over the coarse of 2 years. The settled upon standard is hierarchical as show below.

Experiment --> Survey --> Station --> Run --> Channel
LevelDescription
ExperimentThe highest level, ironically currently does not have any metadata directly associated with it.
SurveyA single MT survey, usually confined by time or location
StationA single MT sounding collectin in a single geographic point
RunA continuous block of time series data collected at a station
ChannelA single channel collected in a run

mt_metadata provides classes for each of these levels in mt_metadata.timeseries, where each class inherits Base. Each of these levels, except Experiment, has certain metadata associate with it, below those are shown.

Experiment

Currently Experiment is a convenience class for containing a group of Survey objects. In the future Experiment will have metadata. The benefit of Experiment is that it can easily be converted to an all inclusive JSON, XML or translated to a StationXML file, where the resulting file contains all the metadata for the experiment.

from mt_metadata.timeseries import Experiment
experiment = Experiment()
experiment
Experiment Contents --------------------

Methods

Besides the methods provided by Base Experiment provides some convenient methods

MethodDescription
survey_nameslist of survey names contained in the experiment
surveyslist of Survey objects

Survey

Again, a survey is a group of MT stations collected in a specific geographic region or collected during a specific time period. Below are all the metadata that a Survey object can contain. Note that most of the metadata are built with smaller metadata objects, for example acquired_by is a mt_metadata.timeseries.Person object and can contain any of the attributes a Person can have.

One key component of Survey is that filters are stored at this level to remove redunant metadata at the channel level. Filters are covered in the next examples.

from mt_metadata.timeseries import Survey
survey = Survey()
print(survey.to_json(required=False))
{
    "survey": {
        "acquired_by.author": null,
        "acquired_by.comments": null,
        "citation_dataset.authors": null,
        "citation_dataset.doi": null,
        "citation_dataset.journal": null,
        "citation_dataset.pages": null,
        "citation_dataset.title": null,
        "citation_dataset.volume": null,
        "citation_dataset.year": "1980-01-01T00:00:00+00:00",
        "citation_journal.authors": null,
        "citation_journal.doi": null,
        "citation_journal.journal": null,
        "citation_journal.pages": null,
        "citation_journal.title": null,
        "citation_journal.volume": null,
        "citation_journal.year": "1980-01-01T00:00:00+00:00",
        "comments": null,
        "country": null,
        "datum": "WGS84",
        "fdsn.alternate_code": null,
        "fdsn.alternate_network_code": null,
        "fdsn.channel_code": null,
        "fdsn.id": null,
        "fdsn.network": null,
        "fdsn.new_epoch": null,
        "geographic_name": null,
        "id": null,
        "name": null,
        "northwest_corner.latitude": 0.0,
        "northwest_corner.longitude": 0.0,
        "project": null,
        "project_lead.author": null,
        "project_lead.email": null,
        "project_lead.organization": null,
        "release_license": "CC-0",
        "southeast_corner.latitude": 0.0,
        "southeast_corner.longitude": 0.0,
        "summary": null,
        "time_period.end_date": "1980-01-01",
        "time_period.start_date": "1980-01-01"
    }
}
survey.filters
{}

Station

Station is a MT sounding at a single geologic point.

from mt_metadata.timeseries import Station
station = Station()
print(station.to_json(required=False))
{
    "station": {
        "acquired_by.comments": null,
        "acquired_by.name": null,
        "channel_layout": null,
        "channels_recorded": [],
        "comments": null,
        "data_type": "BBMT",
        "fdsn.alternate_code": null,
        "fdsn.alternate_network_code": null,
        "fdsn.channel_code": null,
        "fdsn.id": null,
        "fdsn.network": null,
        "fdsn.new_epoch": null,
        "geographic_name": null,
        "id": null,
        "location.datum": null,
        "location.declination.comments": null,
        "location.declination.epoch": null,
        "location.declination.model": "WMM",
        "location.declination.value": 0.0,
        "location.elevation": 0.0,
        "location.latitude": 0.0,
        "location.longitude": 0.0,
        "location.x": null,
        "location.x2": null,
        "location.y": null,
        "location.y2": null,
        "location.z": null,
        "location.z2": null,
        "orientation.angle_to_geographic_north": null,
        "orientation.method": null,
        "orientation.reference_frame": "geographic",
        "orientation.value": null,
        "provenance.comments": null,
        "provenance.creation_time": "1980-01-01T00:00:00+00:00",
        "provenance.log": null,
        "provenance.software.author": "none",
        "provenance.software.last_updated": "1980-01-01T00:00:00+00:00",
        "provenance.software.name": null,
        "provenance.software.version": null,
        "provenance.submitter.author": null,
        "provenance.submitter.email": null,
        "provenance.submitter.organization": null,
        "run_list": [],
        "time_period.end": "1980-01-01T00:00:00+00:00",
        "time_period.start": "1980-01-01T00:00:00+00:00"
    }
}

Run

Run is a continuous block of data collected at a station at a single sample rate.

from mt_metadata.timeseries import Run
run = Run()
print(run.to_json(required=False))
{
    "run": {
        "acquired_by.author": null,
        "acquired_by.comments": null,
        "channels_recorded_auxiliary": [],
        "channels_recorded_electric": [],
        "channels_recorded_magnetic": [],
        "comments": null,
        "data_logger.firmware.author": null,
        "data_logger.firmware.last_updated": "1980-01-01T00:00:00+00:00",
        "data_logger.firmware.name": null,
        "data_logger.firmware.version": null,
        "data_logger.id": null,
        "data_logger.manufacturer": null,
        "data_logger.model": null,
        "data_logger.name": null,
        "data_logger.power_source.comments": null,
        "data_logger.power_source.id": null,
        "data_logger.power_source.type": null,
        "data_logger.power_source.voltage.end": null,
        "data_logger.power_source.voltage.start": null,
        "data_logger.timing_system.comments": null,
        "data_logger.timing_system.drift": 0.0,
        "data_logger.timing_system.type": "GPS",
        "data_logger.timing_system.uncertainty": 0.0,
        "data_logger.type": null,
        "data_type": "BBMT",
        "fdsn.alternate_code": null,
        "fdsn.alternate_network_code": null,
        "fdsn.channel_code": null,
        "fdsn.id": null,
        "fdsn.network": null,
        "fdsn.new_epoch": null,
        "id": null,
        "metadata_by.author": null,
        "metadata_by.comments": null,
        "provenance.comments": null,
        "provenance.log": null,
        "sample_rate": 0.0,
        "time_period.end": "1980-01-01T00:00:00+00:00",
        "time_period.start": "1980-01-01T00:00:00+00:00"
    }
}

Channel

Channel is a 1D timeseries collected in a run. There are 3 types of channels Electric, Magnetic, and Auxiliary

from mt_metadata.timeseries import Electric, Magnetic, Auxiliary

Electric Channel

Electric channels measure the potential difference between a positive and negative electrode.

electric_channel = Electric()
print(electric_channel.to_json(required=False))
{
    "electric": {
        "ac.end": null,
        "ac.start": null,
        "channel_id": null,
        "channel_number": 0,
        "comments": null,
        "component": null,
        "contact_resistance.end": null,
        "contact_resistance.start": null,
        "data_quality.comments": null,
        "data_quality.flag": null,
        "data_quality.good_from_period": null,
        "data_quality.good_to_period": null,
        "data_quality.rating.author": null,
        "data_quality.rating.method": null,
        "data_quality.rating.value": 0,
        "data_quality.warnings": null,
        "dc.end": null,
        "dc.start": null,
        "dipole_length": null,
        "filter.applied": [
            false
        ],
        "filter.comments": null,
        "filter.name": [],
        "measurement_azimuth": 0.0,
        "measurement_tilt": 0.0,
        "negative.datum": null,
        "negative.elevation": 0.0,
        "negative.id": null,
        "negative.latitude": 0.0,
        "negative.longitude": 0.0,
        "negative.manufacturer": null,
        "negative.model": null,
        "negative.name": null,
        "negative.type": null,
        "negative.x": null,
        "negative.x2": null,
        "negative.y": null,
        "negative.y2": null,
        "negative.z": null,
        "negative.z2": null,
        "positive.datum": null,
        "positive.elevation": 0.0,
        "positive.id": null,
        "positive.latitude": 0.0,
        "positive.longitude": 0.0,
        "positive.manufacturer": null,
        "positive.model": null,
        "positive.name": null,
        "positive.type": null,
        "positive.x": null,
        "positive.x2": null,
        "positive.y": null,
        "positive.y2": null,
        "positive.z": null,
        "positive.z2": null,
        "sample_rate": 0.0,
        "time_period.end": "1980-01-01T00:00:00+00:00",
        "time_period.start": "1980-01-01T00:00:00+00:00",
        "translated_azimuth": null,
        "translated_tilt": null,
        "type": "electric",
        "units": null
    }
}

Magnetic Channel

A magnetic channel measures a single component of the magnetic field.

magnetic_channel = Magnetic()
print(magnetic_channel.to_json(required=False))
{
    "magnetic": {
        "channel_id": null,
        "channel_number": 0,
        "comments": null,
        "component": null,
        "data_quality.comments": null,
        "data_quality.flag": null,
        "data_quality.good_from_period": null,
        "data_quality.good_to_period": null,
        "data_quality.rating.author": null,
        "data_quality.rating.method": null,
        "data_quality.rating.value": 0,
        "data_quality.warnings": null,
        "fdsn.alternate_code": null,
        "fdsn.alternate_network_code": null,
        "fdsn.channel_code": null,
        "fdsn.id": null,
        "fdsn.network": null,
        "fdsn.new_epoch": null,
        "filter.applied": [
            false
        ],
        "filter.comments": null,
        "filter.name": [],
        "h_field_max.end": null,
        "h_field_max.start": null,
        "h_field_min.end": null,
        "h_field_min.start": null,
        "location.elevation": 0.0,
        "location.latitude": 0.0,
        "location.longitude": 0.0,
        "location.x": null,
        "location.y": null,
        "location.z": null,
        "measurement_azimuth": 0.0,
        "measurement_tilt": 0.0,
        "sample_rate": 0.0,
        "sensor.id": null,
        "sensor.manufacturer": null,
        "sensor.model": null,
        "sensor.name": null,
        "sensor.type": null,
        "time_period.end": "1980-01-01T00:00:00+00:00",
        "time_period.start": "1980-01-01T00:00:00+00:00",
        "translated_azimuth": null,
        "translated_tilt": null,
        "type": "magnetic",
        "units": null
    }
}

Auxiliary Channel

An auxiliary channel is anything that is not a magnetic or electric channel.

auxiliary_channel = Auxiliary()
print(auxiliary_channel.to_json(required=False))
{
    "auxiliary": {
        "channel_id": null,
        "channel_number": 0,
        "comments": null,
        "component": null,
        "data_quality.comments": null,
        "data_quality.flag": null,
        "data_quality.good_from_period": null,
        "data_quality.good_to_period": null,
        "data_quality.rating.author": null,
        "data_quality.rating.method": null,
        "data_quality.rating.value": 0,
        "data_quality.warnings": null,
        "fdsn.alternate_code": null,
        "fdsn.alternate_network_code": null,
        "fdsn.channel_code": null,
        "fdsn.id": null,
        "fdsn.network": null,
        "fdsn.new_epoch": null,
        "filter.applied": [
            false
        ],
        "filter.comments": null,
        "filter.name": [],
        "location.elevation": 0.0,
        "location.latitude": 0.0,
        "location.longitude": 0.0,
        "measurement_azimuth": 0.0,
        "measurement_tilt": 0.0,
        "sample_rate": 0.0,
        "sensor.id": null,
        "sensor.manufacturer": null,
        "sensor.model": null,
        "sensor.name": null,
        "sensor.type": null,
        "time_period.end": "1980-01-01T00:00:00+00:00",
        "time_period.start": "1980-01-01T00:00:00+00:00",
        "translated_azimuth": null,
        "translated_tilt": null,
        "type": null,
        "units": null
    }
}