diff --git a/.buildinfo b/.buildinfo new file mode 100644 index 000000000..db0cc8d69 --- /dev/null +++ b/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: f91784064194879967e5853269eeefb8 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/_images/20090407201255351_Mw_tradeoffs.png b/_images/20090407201255351_Mw_tradeoffs.png new file mode 100644 index 000000000..8404746e8 Binary files /dev/null and b/_images/20090407201255351_Mw_tradeoffs.png differ diff --git a/_images/20090407201255351_attrs_amplitude_ratios_bw_Z.png b/_images/20090407201255351_attrs_amplitude_ratios_bw_Z.png new file mode 100644 index 000000000..af0a1b731 Binary files /dev/null and b/_images/20090407201255351_attrs_amplitude_ratios_bw_Z.png differ diff --git a/_images/20090407201255351_attrs_time_shifts_bw_Z.png b/_images/20090407201255351_attrs_time_shifts_bw_Z.png new file mode 100644 index 000000000..ebb65dc73 Binary files /dev/null and b/_images/20090407201255351_attrs_time_shifts_bw_Z.png differ diff --git a/_images/20090407201255351_attrs_time_shifts_bw_Z_pygmt.png b/_images/20090407201255351_attrs_time_shifts_bw_Z_pygmt.png new file mode 100644 index 000000000..8aefcec58 Binary files /dev/null and b/_images/20090407201255351_attrs_time_shifts_bw_Z_pygmt.png differ diff --git a/_images/20090407201255351_force_tradeoffs.png b/_images/20090407201255351_force_tradeoffs.png new file mode 100644 index 000000000..8091d3c48 Binary files /dev/null and b/_images/20090407201255351_force_tradeoffs.png differ diff --git a/_images/20090407201255351_likelihood_force.png b/_images/20090407201255351_likelihood_force.png new file mode 100644 index 000000000..d611cc44f Binary files /dev/null and b/_images/20090407201255351_likelihood_force.png differ diff --git a/_images/20090407201255351_likelihood_lune.png b/_images/20090407201255351_likelihood_lune.png new file mode 100644 index 000000000..3e7e7fc90 Binary files /dev/null and b/_images/20090407201255351_likelihood_lune.png differ diff --git a/_images/20090407201255351_marginal_vw.png b/_images/20090407201255351_marginal_vw.png new file mode 100644 index 000000000..552697108 Binary files /dev/null and b/_images/20090407201255351_marginal_vw.png differ diff --git a/_images/20090407201255351_misfit_depth.png b/_images/20090407201255351_misfit_depth.png new file mode 100644 index 000000000..c6f523832 Binary files /dev/null and b/_images/20090407201255351_misfit_depth.png differ diff --git a/_images/20090407201255351_misfit_depth_tradeoffs.png b/_images/20090407201255351_misfit_depth_tradeoffs.png new file mode 100644 index 000000000..54bdab0f9 Binary files /dev/null and b/_images/20090407201255351_misfit_depth_tradeoffs.png differ diff --git a/_images/20090407201255351_misfit_force.png b/_images/20090407201255351_misfit_force.png new file mode 100644 index 000000000..ce483f926 Binary files /dev/null and b/_images/20090407201255351_misfit_force.png differ diff --git a/_images/20090407201255351_misfit_latlon.png b/_images/20090407201255351_misfit_latlon.png new file mode 100644 index 000000000..9a5191f18 Binary files /dev/null and b/_images/20090407201255351_misfit_latlon.png differ diff --git a/_images/20090407201255351_misfit_latlon_tradeoffs.png b/_images/20090407201255351_misfit_latlon_tradeoffs.png new file mode 100644 index 000000000..7ec0ad262 Binary files /dev/null and b/_images/20090407201255351_misfit_latlon_tradeoffs.png differ diff --git a/_images/20090407201255351_misfit_lune.png b/_images/20090407201255351_misfit_lune.png new file mode 100644 index 000000000..93123fe5c Binary files /dev/null and b/_images/20090407201255351_misfit_lune.png differ diff --git a/_images/20090407201255351_mt_tradeoffs.png b/_images/20090407201255351_mt_tradeoffs.png new file mode 100644 index 000000000..4bfa76610 Binary files /dev/null and b/_images/20090407201255351_mt_tradeoffs.png differ diff --git a/_modules/index.html b/_modules/index.html new file mode 100644 index 000000000..03d0a5970 --- /dev/null +++ b/_modules/index.html @@ -0,0 +1,159 @@ + + + + + + + Overview: module code — MTUQ Documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+
+ + + \ No newline at end of file diff --git a/_modules/mtuq.html b/_modules/mtuq.html new file mode 100644 index 000000000..85cab3a68 --- /dev/null +++ b/_modules/mtuq.html @@ -0,0 +1,253 @@ + + + + + + + mtuq — MTUQ Documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +

Source code for mtuq

+
+#
+# suppress warnings
+#
+
+# ObsPy returns numerous warnings of this type - FutureWarning: Passing 
+# (type, 1) or '1type' as a synonym of type is deprecated; in a future version
+# of numpy, it will be understood as (type, (1,)) / '(1,)type'.
+
+import warnings
+warnings.simplefilter(action='ignore',
+    category=FutureWarning)
+
+
+# Suppress Instaseis warning that gets raised unnecessarily during git+https
+# installation
+
+warnings.filterwarnings(action='ignore',
+     message='.*'+'Use the proper pypi release or install from git.'+'.*')
+
+                                                                             
+
+#
+# make key objects easily accessible
+#
+
+from mtuq.dataset import Dataset
+from mtuq.greens_tensor.base import GreensTensor, GreensTensorList
+from mtuq.event import Origin, Force, MomentTensor
+from mtuq.station import Station
+from mtuq.wavelet import Wavelet
+
+from mtuq.grid import Grid, UnstructuredGrid
+from mtuq.grid_search import MTUQDataArray, MTUQDataFrame, open_ds
+from mtuq.misfit import PolarityMisfit, WaveformMisfit
+from mtuq.process_data import ProcessData
+
+# for backward compatibility
+Misfit = WaveformMisfit
+
+# commented out because of namespace conflict
+#from mtuq.grid_search import grid_search
+
+
+
+#
+# register I/O functions
+#
+
+from pkg_resources import iter_entry_points
+from mtuq.io.clients.syngine import download_greens_tensors
+
+
+def _greens_tensor_clients():
+    clients = {}
+    for entry_point in iter_entry_points('greens_tensor_clients'):
+        clients[entry_point.name] = entry_point.load()
+    return clients
+
+
+
[docs]def open_db(path_or_url='', format='', **kwargs): + """ Opens database containing Green's functions + + Returns a client that can then be used to generate ``GreensTensor`` + objects, as in the following example + + .. rubric:: Example + + .. code:: + + db = open_db('axisem_database.nc', format='AxiSEM') + greens = db.get_greens_tensors(stations, origin) + + + """ + format = format.upper() + return _greens_tensor_clients()[format](path_or_url=path_or_url, **kwargs)
+ + +def _readers(): + readers = {} + for entry_point in iter_entry_points('readers'): + readers[entry_point.name] = entry_point.load() + return readers + + +
[docs]def read(path='', format='', **kwargs): + """ Reads waveform files from disk + + Reads files from specified path or url, parses waveform data based on the + specified file format, and returns an ``mtuq.Dataset``, a container in + which each element is an ObsPy stream corresponding to a single station + """ + format = format.upper() + return _readers()[format](path, **kwargs)
+ + +# +# ensures MPI will work, even if users create bound methods +# + +import copyreg +import types + +def _pickle_method(method): + func_name = method.im_func.__name__ + obj = method.im_self + cls = method.im_class + return _unpickle_method, (func_name, obj, cls) + + +def _unpickle_method(func_name, obj, cls): + for cls in cls.mro(): + try: + func = cls.__dict__[func_name] + except KeyError: + pass + else: + break + return func.__get__(obj, cls) + +copyreg.pickle(types.MethodType, _pickle_method, _unpickle_method) + + + +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/_modules/mtuq/dataset.html b/_modules/mtuq/dataset.html new file mode 100644 index 000000000..a210e1eac --- /dev/null +++ b/_modules/mtuq/dataset.html @@ -0,0 +1,444 @@ + + + + + + + mtuq.dataset — MTUQ Documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +

Source code for mtuq.dataset

+
+import obspy
+import os
+import numpy as np
+import pickle
+
+from copy import copy, deepcopy
+from mtuq.event import Origin
+from mtuq.station import Station
+from mtuq.util import warn
+from obspy import Stream
+from obspy.geodetics import gps2dist_azimuth
+
+
+
+
[docs]class Dataset(list): + """ Seismic data container + + A list of ObsPy streams in which each stream corresponds to a single + seismic station + + .. note:: + + Each supported file format has a corresponding reader that creates + Datasets (see ``mtuq.io.readers``). + + """ + + def __init__(self, streams=[], id=None, tags=[]): + """ Constructor method + """ + self.id = id + + for stream in streams: + self.append(stream) + + for tag in copy(tags): + self.tag_add(tag) + + + +
[docs] def append(self, stream): + """ Appends stream to Dataset + """ + assert issubclass(type(stream), Stream),\ + ValueError("Only Streams can be appended to a Dataset") + + # create unique identifier + if hasattr(stream, 'station'): + stream.id = '.'.join([ + stream.station.network, + stream.station.station, + stream.station.location]) + elif len(stream) > 0: + stream.id = '.'.join([ + stream[0].stats.network, + stream[0].stats.station, + stream[0].stats.location]) + else: + stream.id = '' + + if not hasattr(stream, 'tags'): + stream.tags = list() + + # optional origin and station metadata warnings + _warnings = getattr(self, '_warnings', False) + + if not hasattr(stream, 'station') and _warnings: + warn("Stream lacks station metadata") + + if not hasattr(stream, 'origin') and _warnings: + warn("Stream lacks origin metadata") + + if hasattr(stream, 'station') and hasattr(stream, 'origin'): + (stream.distance_in_m, stream.azimuth, _) =\ + gps2dist_azimuth( + stream.origin.latitude, + stream.origin.longitude, + stream.station.latitude, + stream.station.longitude) + + super(Dataset, self).append(stream)
+ + +
[docs] def select(self, selector): + """ Selects streams that match the given station or origin + """ + if type(selector) is Station: + selected = lambda stream: stream.station==selector + + elif type(selector) is Origin: + selected = lambda stream: stream.origin==selector + + elif type(selector) is list: + selected = lambda stream: stream.id in selector + + else: + raise ValueError( + "`selector` must be a `Station`, `Origin` or list thereof") + + return self.__class__( + id=self.id, streams=filter(selected, self))
+ + +
[docs] def apply(self, function, *args, **kwargs): + """ Applies a function to all streams + + .. warning :: + + Although ``apply`` returns a new `Dataset`, contents of the + original `Dataset` may still be overwritten, depending on + the function. To preserve the original, consider making a + `copy` first. + + + """ + processed = [] + for stream in self: + processed += [function(stream, *args, **kwargs)] + + return self.__class__( + processed, id=self.id)
+ + +
[docs] def map(self, function, *sequences): + """ Maps function to all streams + + Maps a function to all streams in the Dataset. If one or more optional + sequences are given, the function is called with an argument list + consisting of corresponding items of each sequence, just like the + Python built-in ``map``. + + .. warning :: + + Although ``map`` returns a new `Dataset`, contents of the + original `Dataset` may still be overwritten, depending on + the function. To preserve the original, consider making a + `copy` first. + + """ + processed = [] + for _i, stream in enumerate(self): + args = [sequence[_i] for sequence in sequences] + processed += [function(stream, *args)] + + return self.__class__( + processed, id=self.id)
+ + +
[docs] def max(self): + """ Returns maximum absolute amplitude over all traces + """ + max_all = -np.inf + for stream in self: + for trace in stream: + if not getattr(trace, 'weight', 1.): + continue + if trace.data.max() > max_all: + max_all = abs(trace.data).max() + return max_all
+ + +
[docs] def sort_by_distance(self, reverse=False): + """ Sorts in-place by hypocentral distance + """ + self.sort_by_function(lambda data: data.distance_in_m, + reverse=reverse)
+ + +
[docs] def sort_by_azimuth(self, reverse=False): + """ Sorts in-place by source-receiver azimuth + """ + self.sort_by_function(lambda data: data.azimuth, + reverse=reverse)
+ + +
[docs] def sort_by_function(self, function, reverse=False): + """ Sorts in-place by user-supplied function + """ + self.sort(key=function, reverse=reverse)
+ + +
[docs] def get_components(self): + """ Returns `list` of components from all streams + """ + components = [] + for stream in self: + components += [[]] + for trace in stream: + components[-1] += [trace.stats.channel[-1].upper()] + return components
+ + +
[docs] def get_stations(self): + """ Returns station metadata from all streams as a `list` of + `mtuq.station.Stations` objects + + .. note :: + + For Datasets created using ``mtuq.io.readers``, SAC header metadata + is used to populate the Station attributes + + """ + stations = [] + for stream in self: + stations += [stream.station] + return stations
+ + +
[docs] def get_stats(self): + """ Returns trace metadata in nested lists + + .. note :: + + For Datasets created using ``mtuq.io.readers``, SAC header metadata + is used to populate the Station attributes + + """ + stats = [] + for stream in self: + stats += [[]] + for trace in stream: + stats[-1] += [trace.stats] + return stats
+ + +
[docs] def get_origins(self): + """ Returns origin metadata from all streams as a `list` of + `mtuq.event.Origin` objects + + .. note :: + + - For Datasets created using ``mtuq.io.readers.sac``, origin + metadata represent catalog information read from SAC headers + + - For Datasets created using ``GreensTensor.get_synthetics``, + origin metadata are inherited from the GreensTensor + + """ + origins = [] + for stream in self: + origins += [stream.origin] + + if getattr(self, '_warnings', True): + if stream.origin!=self[0].origin: + warn( + "Different streams in the Dataset correpond to " + "different events.\n\n" + "This may be intentional. Feel free to disable this " + "warning by setting Dataset._warnings=False") + + return origins
+ + +
[docs] def tag_add(self, tag): + """ Appends string to tags list + + Tags can be used to support customized uses, such as storing metdata not + included in ``Station`` or ``Origin`` objects + """ + if type(tag)!=str: + raise TypeError + + for stream in self: + if tag not in stream.tags: + stream.tags.append(tag)
+ + +
[docs] def tag_remove(self, tag): + """ Removes string from tags list + """ + for stream in self: + if tag in stream.tags: + stream.tags.remove(tag)
+ + + def __copy__(self): + try: + new_id = self.id+'_copy' + except: + new_id = None + + new_ds = type(self)(id=new_id) + for stream in self: + new_ds.append(deepcopy(stream)) + return new_ds + + +
[docs] def copy(self): + return self.__copy__()
+ + +
[docs] def write(self, path, format='sac'): + """ Writes dataset to disk + """ + if format.lower() == 'pickle': + + with open(filename, "wb") as file: + pickle.dump(self, path) + + elif format.lower() == 'sac': + + os.makedirs(path, exist_ok=True) + for stream in self: + for trace in stream: + + keys = ('network','station','location','channel') + filename = '.'.join([trace.stats[key] for key in keys]) + + fullpath = '%s/%s.%s' % (path,filename,'sac') + trace.write(fullpath, format='sac') + + else: + raise ValueError('Unrecognized file format')
+ + +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/_modules/mtuq/event.html b/_modules/mtuq/event.html new file mode 100644 index 000000000..bf2ed19cc --- /dev/null +++ b/_modules/mtuq/event.html @@ -0,0 +1,376 @@ + + + + + + + mtuq.event — MTUQ Documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +

Source code for mtuq.event

+
+import numpy as np
+import obspy
+from obspy.core import UTCDateTime
+
+from mtuq.util import AttribDict, asarray
+
+
+
+
[docs]class Origin(AttribDict): + """ Origin metadata object + + Holds the following event information + + - latitude and longitude + - depth + - origin time + + .. note:: + + Some file formats have a corresponding reader that creates + Origin objects from file metadata (see ``mtuq.io.readers``). + + """ + defaults = { + 'time': UTCDateTime(0), + 'latitude': None, + 'longitude': None, + 'depth_in_m': None, + } + + def __setitem__(self, key, value): + if value is None: + pass + + elif key in ['time']: + value = UTCDateTime(value) + + elif key in ['latitude', 'longitude', 'depth_in_m']: + value = float(value) + + super(Origin, self).__setitem__(key, value) + + + def __eq__(self, other): + if not isinstance(other, Origin): + return False + + for key in self.__dict__: + if not hasattr(other, key): + return False + elif other[key]!=self.__dict__[key]: + return False + else: + return True + + +
[docs] def as_dict(self): + """ Converts to dictionary + """ + return self.__dict__
+ + +
[docs]class MomentTensor(object): + """ Moment tensor object + + .. note:: + + The constructor accepts six-element arrays in any ObsPy `basis convention <https://docs.obspy.org/packages/autogen/obspy.imaging.mopad_wrapper.beach.html#supported-basis-systems>`_. + Moment tensors are then converted to and internally represented in the + ``up-south-east`` convention. + + """ + def __init__(self, array, convention="USE"): + if array is None: + raise Exception( + "Missing argument: moment tensors must be given as a " + "NumPy array") + + try: + array = asarray(array) + except: + raise TypeError( + "Couldn't cast input argument as NumPy array.") + + if array.size != 6: + raise ValueError( + "Unexpected array size: moment tensors must be given as a " + "NumPy array with six elements") + + if convention.upper() == 'USE': + self._array = array + + else: + raise NotImplementedError( + "So far, only up-south-east convention is implemented") + + #self._array = _change_convention_mt(asarray(array), + # asarray(array), convention, 'USE') + + +
[docs] def as_dict(self): + """ Returns dictionary in `up-south-east` convention + """ + array = self._array + return { + 'Mrr': array[0], + 'Mtt': array[1], + 'Mpp': array[2], + 'Mrt': array[3], + 'Mrp': array[4], + 'Mtp': array[5], + }
+ + +
[docs] def as_vector(self): + """ Returns 1D NumPy array in `up-south-east` convention + """ + return self._array
+ + +
[docs] def as_matrix(self): + """ Returns 2D symmetric NumPy array in `up-south-east` convention + """ + array = self._array + return np.array([[array[0], array[3], array[4]], + [array[3], array[1], array[5]], + [array[4], array[5], array[2]]])
+ + +
[docs] def cast(self, convention): + """ Returns 1D NumPy array in given basis convention + + .. rubric :: Input arguments + + ``convention`` (`str`): + ObsPy `basis convention <https://docs.obspy.org/packages/autogen/obspy.imaging.mopad_wrapper.beach.html#supported-basis-systems>`_ + + """ + return _change_convention_mt( + self._array, 'USE', convention.upper())
+ + +
[docs] def moment(self): + """ Calculates seismic moment (`M_0`) + """ + M = self.as_matrix() + return (np.tensordot(M,M)/2.)**0.5
+ + +
[docs] def magnitude(self): + """ Calculates moment magnitude (`M_w`) + """ + # how to generalize for slightly different formulas? + return 2./3.*(np.log10(self.moment()) - 9.1)
+ + + #def to_lune(self): + # raise NotImplementedError + + + +
[docs]class Force(object): + """ Force source + + .. note:: + + The constructor accepts three-element arrays in any ObsPy `basis convention <https://docs.obspy.org/packages/autogen/obspy.imaging.mopad_wrapper.beach.html#supported-basis-systems>`_. + Forces are then converted to and internally represented in the + ``up-south-east`` convention. + + """ + def __init__(self, array, convention='USE'): + if array is None: + raise Exception( + "Missing argument: forces must be given as a " + "NumPy array") + + try: + array = asarray(array) + except: + raise TypeError( + "Couldn't cast input argument as NumPy array.") + + if array.size != 3: + raise ValueError( + "Unexpected array size: forces must be given as a " + "NumPy array with three elements") + + if convention.upper() == 'USE': + self._array = array + + else: + raise NotImplementedError( + "So far, only up-south-east convention is implemented") + + #self._array = _change_convention_mt(asarray(array), + # asarray(array), convention, 'USE') + + +
[docs] def as_dict(self): + """ Returns dictionary in `up-south-east` convention + """ + array = self._array + return { + 'Fr': array[0], + 'Ft': array[1], + 'Fp': array[2], + }
+ + +
[docs] def as_vector(self): + """ Returns 1D NumPy array in `up-south-east` convention + """ + return self._array
+ + +
[docs] def cast(self, convention): + """ Returns 1D NumPy array in given basis convention + + .. rubric :: Input arguments + + ``convention`` (`str`): + ObsPy `basis convention <https://docs.obspy.org/packages/autogen/obspy.imaging.mopad_wrapper.beach.html#supported-basis-systems>`_ + + + """ + return _change_convention_force( + self._array, 'USE', convention.upper())
+ + + +class CompositeSource(object): + def __init__(self, sources): + """ Constructor method + """ + arrays = [] + size = 0 + for source in sources: + assert type(source) in [MomentTensor, Force] + arrays += [source.as_array()] + size += arrays[-1].size + + self.sources = sources + self.size = size + self._array = np.concatenate(arrays) + + +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/_modules/mtuq/graphics/attrs.html b/_modules/mtuq/graphics/attrs.html new file mode 100644 index 000000000..5735055e4 --- /dev/null +++ b/_modules/mtuq/graphics/attrs.html @@ -0,0 +1,959 @@ + + + + + + + mtuq.graphics.attrs — MTUQ Documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +

Source code for mtuq.graphics.attrs

+
+import matplotlib
+import os
+import numpy as np
+
+from matplotlib import pyplot
+from os.path import join
+
+from mtuq.util import defaults, warn
+from mtuq.graphics._pygmt import exists_pygmt
+from mtuq.event import MomentTensor
+
+
+
[docs]def plot_time_shifts(dirname, attrs, stations, origin, key='total_shift', + **kwargs): + + """ Plots how time shifts vary by location and component + + By default, total time shifts are plotted. To plot just static or + cross-correlation time shifts, use ``key='static_shift'`` or + ``key='time_shift'``, respectively + + .. note :: + + MTUQ distinguishes between the following different types of time shifts: + + - `static_shift` is an initial user-supplied time shift applied during data processing + + - `time_shift` is a subsequent cross-correlation time shift applied during misfit evaluation + + - `total_shift` is the total correction, or in other words the sum of static and cross-correlation time shifts + + + + .. rubric :: Required input arguments + + ``dirname`` (`str`): + Directory in which figures will be written + + ``attrs`` (`list` of `AttribDict`): + List returned by misfit function's `collect_attributes` method + + ``stations`` (`list` of `mtuq.Station` objects): + Used to plot station locations + + ``origin`` (`mtuq.Origin` object): + Used to plot origin location + + + .. rubric :: Optional input arguments + + For optional argument descriptions, + `see here <mtuq.graphics._plot_attrs.html>`_ + + """ + defaults(kwargs, { + 'label': 'Time shift (s)', + }) + + _plot_attrs(dirname, stations, origin, attrs, key, **kwargs)
+ +
[docs]def plot_cross_corr(dirname, attrs, stations, origin, key='normalized_cc_max', + **kwargs): + + """ Plots how cross-correlation values vary by location and component + + By default, maximum normalized cross-correlation values are plotted. To plot just + maximum cross-correlation values, use ``key='cc_max'`` + + .. note :: + + MTUQ distinguishes between the following different types of + cross-correlation values + + - `cc_max` is the maximum cross-correlation value + + - `normalized_cc_max` is the maximum cross-correlation value normalized between 0 and 1 + + .. rubric :: Required input arguments + + ``dirname`` (`str`): + Directory in which figures will be written + + ``attrs`` (`list` of `AttribDict`): + List returned by misfit function's `collect_attributes` method + + ``stations`` (`list` of `mtuq.Station` objects): + Used to plot station locations + + ``origin`` (`mtuq.Origin` object): + Used to plot origin location + + + .. rubric :: Optional input arguments + + For optional argument descriptions, + `see here <mtuq.graphics._plot_attrs.html>`_ + + """ + defaults(kwargs, { + 'label': 'Maximum normalized CC', + 'zero_centered': False, + 'colormap': 'inferno', + 'min_val': 0.0, + 'max_val': 1.0, + }) + + _plot_attrs(dirname, stations, origin, attrs, key, **kwargs)
+ + +
[docs]def plot_amplitude_ratios(dirname, attrs, stations, origin, **kwargs): + """ Plots how Aobs/Asyn varies by location and component + + .. rubric :: Required input arguments + + ``dirname`` (`str`): + Directory in which figures will be written + + ``attrs`` (`list` of `AttribDict`): + List returned by misfit function's `collect_attributes` method + + ``stations`` (`list` of `mtuq.Station` objects): + Used to plot station locations + + ``origin`` (`mtuq.Origin` object): + Used to plot origin location + + + .. rubric :: Optional input arguments + + For optional argument descriptions, + `see here <mtuq.graphics._plot_attrs.html>`_ + + + """ + defaults(kwargs, { + 'colormap': 'inferno', + 'label': '$A_{obs}/A_{syn}$', + 'zero_centered': False, + }) + + _plot_attrs(dirname, stations, origin, attrs, 'amplitude_ratio', **kwargs)
+ + +
[docs]def plot_log_amplitude_ratios(dirname, attrs, stations, origin, **kwargs): + """ Plots how ln(Aobs/Asyn) varies by location and component + + .. rubric :: Required input arguments + + ``dirname`` (`str`): + Directory in which figures will be written + + ``attrs`` (`list` of `AttribDict`): + List returned by misfit function's `collect_attributes` method + + ``stations`` (`list` of `mtuq.Station` objects): + Used to plot station locations + + ``origin`` (`mtuq.Origin` object): + Used to plot origin location + + + .. rubric :: Optional input arguments + + For optional argument descriptions, + `see here <mtuq.graphics._plot_attrs.html>`_ + + """ + defaults(kwargs, { + 'label': 'ln($A_{obs}/A_{syn}$)', + }) + + _plot_attrs(dirname, stations, origin, attrs, 'log_amplitude_ratio', **kwargs)
+ + +
[docs]def _plot_attrs(dirname, stations, origin, attrs, key, + components=['Z', 'R', 'T'], format='png', backend=None, + **kwargs): + + """ Reads the attribute given by `key` from the `attrs` data structure, and + plots how this attribute varies + + Within the specified directory, a separate figure will be created for each + component, e.g. `Z.png`, `R.png`, `T.png`. + + + .. rubric :: Keyword arguments + + ``components`` (`list`): + Generate figures for the given components + + ``format`` (`str`): + Image file format (defaults to `png`) + + ``backend`` (`function`): + Backend function + + + .. rubric :: Backend function + + To customize figure appearance, users can pass their own backend function. + See `online documentation + <https://uafgeotools.github.io/mtuq/user_guide/06/customizing_figures.html>`_ + for details. Otherwise, defaults to a generic matplotlib `backend + <mtuq.graphics.attrs._default_backend.html>`_. + + + .. rubric :: Standard pygmt backend + + The standard `pygmt backend <mtuq.graphics.attrs._pygmt_backend.html>`_ is used to + plot station attributes over a hillshaded map. Default calls to front_end functions + can be supplemented with optional keyword arguments to customize the appearance of the plot. + + .. code :: + + from mtuq.graphics.attrs import _pygmt_backend + plot_time_shifts('./SW/tshift', attributes_sw, stations, origin, + moment_tensor=best_mt, process=process_sw, backend=_pygmt_backend) + """ + + if backend is None: + backend = _default_backend + elif backend == _pygmt_backend and not exists_pygmt(): + warn('PyGMT backend requested but PyGMT not found'); backend = _default_backend + + if not callable(backend): + raise TypeError + + os.makedirs(dirname, exist_ok=True) + + for component in components: + values = [] + active_stations_list = [] + + for _i, station in enumerate(stations): + if component not in attrs[_i]: + continue + + values += [attrs[_i][component][key]] + active_stations_list += [stations[_i]] + + if len(values) > 0: + filename = join(dirname, component+'.'+format) + backend(filename, values, active_stations_list, origin, stations_list = stations, **kwargs)
+ + +# +# low-level function for plotting trace attributes +# + +
[docs]def _default_backend(filename, values, stations, origin, + colormap='coolwarm', zero_centered=True, colorbar=True, + label='', width=5., height=5., **kwargs): + + """ + Default backend for all frontend `mtuq.graphics.attrs` functions + + The frontend functions perform only data manipulation. All graphics library + calls occur in the backend + + By isolating the graphics function calls in this way, users can completely + interchange graphics libraries (matplotlib, GMT, PyGMT, and so on) + + .. rubric :: Keyword arguments + + ``colormap`` (`str`): + Matplotlib color palette + + ``zero_centered`` (`bool`): + Whether or not the colormap is centered on zero + + ``colorbar`` (`bool`): + Whether or not to display a colorbar + + ``label`` (`str`): + Optional colorbar label + + """ + + fig = pyplot.figure(figsize=(width, height)) + + + # generate colormap + cmap = matplotlib.cm.get_cmap(colormap) + + if zero_centered: + min_val = -np.max(np.abs(values)) + max_val = +np.max(np.abs(values)) + else: + min_val = np.min(values) + max_val = np.max(values) + + # plot stations + im = pyplot.scatter( + [station.longitude for station in stations], + [station.latitude for station in stations], + s=80., + c=values, + cmap=cmap, + vmin=min_val, + vmax=max_val, + marker='^', + ) + + # plot line segments + for _i, station in enumerate(stations): + + scaled = (values[_i]-min_val)/(max_val-min_val) + rgb = cmap(scaled) + + pyplot.plot( + [origin.longitude, station.longitude], + [origin.latitude, station.latitude], + marker=None, + color=rgb, + linestyle='-', + linewidth=0.5, + ) + + # plot origin + pyplot.plot( + origin.longitude, + origin.latitude, + marker='*', + markersize=15., + color='black', + ) + + # adjust ticks + pyplot.gca().tick_params(top=True, right=True, + labeltop=True, labelright=True) + + pyplot.locator_params(nbins=3) + + # add colorbar + if not label: + label = '' + + fig.colorbar(im, orientation="horizontal", pad=0.2, + label=label) + + pyplot.savefig(filename) + pyplot.close()
+ + +
[docs]def _pygmt_backend(filename, values, active_stations, origin, + colormap='polar', zero_centered=True, display_topo=True, + label='', width=5, moment_tensor=None, process=None, + stations_list=None, station_labels=True, min_val=None, max_val=None, **kwargs): + """ + PyGMT backend for plotting station attributes over a hillshaded map. + + .. note :: + + This function requires the PyGMT library to be installed. + If called while pygmt is not installed, the default matplotlib backend will be used. + + The function accepts a number of optional keyword arguments to customize + the appearance of the plot. If passed to another backend, these arguments + will be ignored. + + .. rubric :: Required input arguments + + ``filename`` (`str`): + The name of the file to which the figure will be saved. This should be passed by the frontend function. + Expected filenames are in the format `component.png`, where `component` is the component of the data being plotted. + This might be revised in the future to allow for more flexible naming conventions. + + ``values`` (`list` of `float`): + List of values to be plotted for each station. The length of the list should match the number of stations. + + ``active_stations`` (`list` of `mtuq.Station` objects): + List of stations to be plotted, with a value entry for each station in the `values` list. + + ``origin`` (`mtuq.Origin` object): + Origin object used to plot the origin location. + + .. rubric :: Keyword arguments + + ``colormap`` (`str`): + GMT colormap name - see `GMT documentation <https://docs.generic-mapping-tools.org/6.5/reference/cpts.html>` + + ``zero_centered`` (`bool`): + Whether or not the colormap is centered on zero + + ``display_topo`` (`bool`): + Whether or not to display topography in the background -- will download the ETOPO1 topography file if not found + + ``label`` (`str`): + Optional colorbar text label -- supports LaTeX expressions + + ``width`` (`float`): + Width of the figure in inches -- default is 5 inches + + ``moment_tensor`` (`mtuq.event.MomentTensor` or `np.ndarray`): + Moment tensor to plot as a beachball -- will plot a star at the origin if not provided + Can be either a `mtuq.event.MomentTensor` object or a 1D numpy array with the six independent components + [m_rr, m_tt, m_pp, m_rt, m_rp, m_tp] + + ``process`` (`mtuq.ProcessData`): + ProcessData object used to determine the type of waves used for the window + + ``stations_list`` (`list` of `mtuq.Station` objects): + List of all stations available before data processing -- will plot only active stations if not provided + + ``station_labels`` (`bool`): + Whether or not to plot station labels -- default is True + + ``min_val`` (`float`): + Minimum value for the colorbar -- will be determined automatically if not provided + + ``max_val`` (`float`): + Maximum value for the colorbar -- will be determined automatically if not provided + + .. rubric :: Backend specific utility class + + The PyGMTUtilities class is a utility class designed to enhance and simplify the usage of PyGMT for plotting. + It includes methods for calculating plotting regions with buffers, configuring colormaps, preparing LaTeX + annotations for PyGMT, and generating standardized headers for plots. Documentation for the PyGMTUtilities + class can be found in the `PyGMTUtilities <mtuq.graphics.attrs.PyGMTUtilities.html>`_ module. + + + + """ + import pygmt + + if not stations_list: + stations_list = active_stations + print('Complete station list not passed to pygmt plotting backend \nWill plot only active stations') + # Collection of longitudes and latitudes from all available stations + longitudes = [s.longitude for s in stations_list + [origin]] + latitudes = [s.latitude for s in stations_list + [origin]] + + # Calculate the region to display with a buffer around the stations + region, lat_buffer = PyGMTUtilities.calculate_plotting_region(stations_list, origin, buffer_percentage=0.1) + + # Setting up the figure + fig = pygmt.Figure() + + # Dynamically determine the grid resolution for topography based on the range of longitudes and latitudes + # (etopo topography file will be downloaded if not found) + resolution = PyGMTUtilities.get_resolution(max(longitudes) - min(longitudes), max(latitudes) - min(latitudes)) + grid = pygmt.datasets.load_earth_relief(region=region, resolution=resolution) + + # Calculate the gradient (hillshade) grid with azimuth 0/300 and normalization t1 + # <https://www.pygmt.org/dev/gallery/images/grdgradient_shading.html> + shade = pygmt.grdgradient(grid=grid, azimuth="0/300", normalize="t1") + + # Define a grayscale colormap for topography + normal = pygmt.grdhisteq.equalize_grid(grid=grid, gaussian=True) + gray_cmap = pygmt.makecpt(cmap='gray', series=[np.min(normal.values), np.max((normal.values))]) + + # Plot the hillshade grid as an image + if display_topo: + fig.grdimage(grid=normal, shading=shade, projection=f'J{width}i', frame='a', cmap=gray_cmap, no_clip=True) + + # Overlay coastlines + PyGMTUtilities.draw_coastlines(fig) + + # Configure the colormap for station values + colormap, cmap_reverse_flag = PyGMTUtilities.configure_colormap(colormap) + if zero_centered: + pygmt.makecpt(cmap=colormap, series=[-np.max(np.abs(values))*1.01, np.max(np.abs(values))*1.01], reverse=cmap_reverse_flag) + elif min_val is not None and max_val is not None: + pygmt.makecpt(cmap=colormap, series=[min_val, max_val], continuous=True, reverse=cmap_reverse_flag) + else: + pygmt.makecpt(cmap=colormap, series=[np.min(values), np.max(values)], continuous=True, reverse=cmap_reverse_flag) + + + # Plotting lines from origin to stations + for station in stations_list: + if station in active_stations: + # Plot line for active station as colored line + value = values[active_stations.index(station)] if station in active_stations else 0 + fig.plot( + x=[origin.longitude, station.longitude], + y=[origin.latitude, station.latitude], + cmap=True, + zvalue=value, + pen="thick,+z,-" + ) + + # Plotting stations as triangles + fig.plot( + x=[station.longitude for station in active_stations], + y=[station.latitude for station in active_stations], + style='i0.8c', # Triangle + color=values, + cmap=True, + pen="0.5p,black" + ) + + # Plotting non-active stations as hollow triangles + non_active_stations = [station for station in stations_list if station not in active_stations] + if len(non_active_stations) > 0: + fig.plot( + x=[station.longitude for station in non_active_stations], + y=[station.latitude for station in non_active_stations], + style='i0.8c', # Triangle + color=None, # Hollow (white) triangle + pen="0.5p,black" # Outline color + ) + fig.plot( + x=[station.longitude for station in non_active_stations], + y=[station.latitude for station in non_active_stations], + style='i0.6c', # Triangle + color=None, # Hollow (white) triangle + pen="0.5p,white" # Outline color + ) + + # Plotting the origin as a star + fig.plot( + x=[origin.longitude], + y=[origin.latitude], + style='a0.6c', # Star, size 0.5 cm + color='yellow', + pen="0.5p,black" + ) + + if moment_tensor is not None: + # Normalize the moment tensor components to the desired exponent + + if type(moment_tensor) is MomentTensor: + moment_tensor = moment_tensor.as_vector() + + moment_tensor = np.array(moment_tensor)/np.linalg.norm(moment_tensor) + + moment_tensor_spec = { + 'mrr': moment_tensor[0], + 'mtt': moment_tensor[1], + 'mff': moment_tensor[2], + 'mrt': moment_tensor[3], + 'mrf': moment_tensor[4], + 'mtf': moment_tensor[5], + 'exponent': 21 # Merely for size control, as the MT is normalized prior to plotting + } + + # Plot the moment tensor as a beachball + fig.meca( + spec=moment_tensor_spec, + scale="1c", # Sets a fixed size for the beachball plot + longitude=origin.longitude, + latitude=origin.latitude, + depth=10, # Depth is required, even if not used, set to a small number + convention="mt", # Use GMT's mt convention <https://www.pygmt.org/dev/api/generated/pygmt.Figure.meca.html> + compressionfill="gray15", + extensionfill="white", + pen="0.5p,black" + ) + + if station_labels is True: + # Plotting station labels + for station in stations_list: + fig.text( + x=station.longitude, + y=station.latitude, + text=station.station, + font="5p,Helvetica-Bold,black", + justify="LM", + offset="-0.45c/0.125c", + fill='white' + ) + + fig.colorbar(frame=f'+l"{PyGMTUtilities.prepare_latex_annotations(label)}"', position="JMR+o1.5c/0c+w7c/0.5c") + + fig.basemap(region=region, projection=f'J{width}i', frame=True) + + # Now starts the header text above the plot -- It is not a title and can be modified. + # Add an integer increment to the text_line_val bellow to add a new line above. + text_line_val = 1 + header_lines = PyGMTUtilities.get_header(label, origin, filename, process) + + # Add the header text to the plot + # Text spacing is based on longitude range and latitude buffer size. + lon_mean = np.max(longitudes) - (np.max(longitudes) - np.min(longitudes)) / 2 + text_spacing = lat_buffer / 1.5 + for header_line in header_lines: + fig.text(x=lon_mean, + y=max(latitudes) + lat_buffer + text_line_val*text_spacing, + text=header_line, font="14p,Helvetica-Bold,black", justify="MC", no_clip=True) + text_line_val += 1 + + # Saving the figure + fig.savefig(filename, crop=True, dpi=300)
+ +
[docs]class PyGMTUtilities: + """ + Utility class for PyGMT plotting backend. + + This class offers a set of static methods designed for enhancing and simplifying the usage of PyGMT + for plotting by handling plotting regions, color maps, LaTeX annotations, and plot headers. + + .. note :: + The class is designed to be used without instantiation due to its static methods. This approach + helps in organizing code related to the PyGMT plotting backend and avoids confusion with other plotting backends. + + Methods include calculating plotting regions with buffers, configuring colormaps, preparing LaTeX + annotations for PyGMT, and generating standardized headers for plots. + + Examples and more detailed method descriptions can be found in the documentation of each method. + """ + +
[docs] @staticmethod + def calculate_plotting_region(stations, origin, buffer_percentage=0.1): + """ + Calculates the region for plotting, including a buffer area around specified stations and origin. + + .. rubric :: Parameters + + ``stations`` (`list` of `mtuq.Station` objects): + The stations to be included in the plot. + + ``origin`` (`mtuq.Origin` object): + The origin object is used to calculate the region for the plot in case the origin is outside the range of the stations. + + ``buffer_percentage`` (`float`, optional): + The percentage of the total longitude and latitude range to be added as a buffer around the specified region. + Defaults to 0.1 (10%). + + .. rubric :: Returns + + ``region`` (`list` of `float`), ``lat_buffer`` (`float`): + A tuple containing the calculated region as a list `[west, east, south, north]` and the latitude buffer value. + The latitude buffer is returned to later be used for adjusting text spacing in the plot header. + + .. rubric :: Example + + >>> region, lat_buffer = PyGMTUtilities.calculate_plotting_region(stations, origin) + >>> print(region) + [149.55, 151.45, -35.1, -32.9] + >>> print(lat_buffer) + 0.22 + """ + + longitudes = [station.longitude for station in stations] + [origin.longitude] + latitudes = [station.latitude for station in stations] + [origin.latitude] + + lon_buffer = (max(longitudes) - min(longitudes)) * buffer_percentage + lat_buffer = (max(latitudes) - min(latitudes)) * buffer_percentage + + region = [min(longitudes) - lon_buffer, max(longitudes) + lon_buffer, + min(latitudes) - lat_buffer, max(latitudes) + lat_buffer] + return region, lat_buffer
+ + +
[docs] @staticmethod + def get_resolution(lon_range, lat_range): + """ + Determines the appropriate PyGMT etopo grid resolution based on longitude and latitude ranges. + + .. rubric :: Parameters + + ``lon_range`` (`float`): + The longitudinal range of the area of interest. + + ``lat_range`` (`float`): + The latitudinal range of the area of interest. + + .. rubric :: Returns + + ``resolution`` (`str`): + The resolution string for PyGMT, e.g., '01m', '15s', ..., based on the size of the specified area. + + .. note :: + The resolution is determined based on predefined thresholds for the ranges, aiming to balance + detail and performance for different scales of geographic areas + + - If lon_range > 10 or lat_range > 10, the resolution is '01m'. + + - If lon_range > 5 or lat_range > 5, the resolution is '15s'. + + - If lon_range > 2 or lat_range > 2, the resolution is '03s'. + + - If lon_range > 1 or lat_range > 1, the resolution is '01s'. + + Otherwise, the resolution is '05m'. + + """ + + if lon_range > 10 or lat_range > 10: + return '01m' + elif lon_range > 5 or lat_range > 5: + return '15s' + elif lon_range > 2 or lat_range > 2: + return '03s' + elif lon_range > 1 or lat_range > 1: + return '01s' + else: + return '05m'
+ +
[docs] @staticmethod + def configure_colormap(colormap): + """ + Adjusts the given colormap name for compatibility with PyGMT and matplotlib conventions. + + .. rubric :: Parameters + + ``colormap`` (`str`): + The name of the colormap to be used. If the colormap name ends with '_r', the colormap is + reversed, and the '_r' suffix is removed. + + .. rubric :: Returns + + ``colormap`` (`str`), ``cmap_reverse_flag`` (`bool`): + A tuple containing the adjusted colormap name and a boolean indicating whether the colormap should + be reversed. + + .. note :: + + The method accept only colormaps that are available in PyGMT. For a list of available colormaps, + + .. rubric :: Example + + >>> colormap, reverse = PyGMTUtilities.configure_colormap('viridis_r') + >>> print(colormap) + viridis + >>> print(reverse) + True + """ + cmap_reverse_flag = True if colormap.endswith('_r') else False + colormap = colormap[:-2] if cmap_reverse_flag else colormap + return colormap, cmap_reverse_flag
+ +
[docs] @staticmethod + def prepare_latex_annotations(label): + """ + Prepares LaTeX annotations for plotting. Uses HTML tags instead + of $•$ for compatibility with PyGMT/GMT. + + .. rubric :: Parameters + + ``label`` (`str`): + The LaTeX label to be prepared. + + .. rubric :: Returns + + ``str``: + The prepared label. + + """ + + parts = label.split('$') + if len(parts) == 1: # No '$' found + return label + new_text = '' + for i, part in enumerate(parts): + if i % 2 == 0: + new_text += part + else: + new_text += f"<math>{part}</math>" + return new_text
+ +
[docs] @staticmethod + def get_header(label, origin, filename, process = None): + """ + Generates a header for a plot based on the provided parameters. + + .. rubric :: Parameters + + ``label`` (`str`): + The label for the plot. Usually defined in the frontend function. + + ``origin`` (mtuq.Origin): + mtuq.event.Origin object, used to retrieve the event time and depth. + + ``filename`` (str): + The filename of the plot. Defined by default the high-level function. Used to retrieve the component. + + ``process`` (Process, optional): + mtuq.process_data.ProcessData object for appropriate dataset. + + .. rubric :: Returns + + ``list``: + A list containing two lines of the header. [Label - (component)], [Event Time: (time) UTC, Depth: (depth) km] + """ + if process is not None: + # get type of waves used for the window + window_type = process.window_type + if window_type == 'surface_wave' or window_type == 'group_velocity': + window_type = 'Surface wave' + elif window_type == 'body_wave': + window_type = 'Body wave' + + component = filename.split('/')[-1].split('.')[0] + origin_time = str(origin.time)[0:19] + origin_depth = origin.depth_in_m/1000 + + label = PyGMTUtilities.prepare_latex_annotations(label) + + # if window_type exists, define Rayleigh or Love wave + if process is not None: + if window_type == 'Surface wave' and component == 'Z' or window_type == 'Surface wave' and component == 'R': + # First line of the header defined as: label - Rayleigh wave (component) + header_line_1 = f"{label} - Rayleigh wave ({component})" + elif window_type == 'Surface wave' and component == 'T': + # First line of the header defined as: label - Love wave (component) + header_line_1 = f"{label} - Love wave ({component})" + elif window_type == 'Body wave': + # First line of the header defined as: label - (component) + header_line_1 = f"{label} - Body wave ({component})" + else: + # First line of the header defined as: label - (component) + header_line_1 = f"{label} - ({component})" + + header_line_2 = f"Event Time: {origin_time} UTC, Depth: {origin_depth:.1f} km" + + return [header_line_1, header_line_2]
+ +
[docs] @staticmethod + def draw_coastlines(fig, area_thresh=100, water_color='paleturquoise', water_transparency=55): + """ + Draws coastlines and fills water areas with a transparent blue shade. + + .. rubric :: Parameters + + ``fig`` (pygmt.Figure): + The PyGMT figure object to which the coastlines and water areas will be added. + + ``area_thresh`` (`int`, optional): + The minimum area of land to be displayed. Defaults to 100. + + ``water_color`` (`str`, optional): + The color of the water areas. Defaults to 'paleturquoise'. + + ``water_transparency`` (`int`, optional): + The transparency of the water areas. Defaults to 55. + + """ + fig.coast(shorelines=True, area_thresh=area_thresh) + fig.coast(shorelines=False, water=water_color, transparency=water_transparency, area_thresh=area_thresh)
+
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/_modules/mtuq/graphics/beachball.html b/_modules/mtuq/graphics/beachball.html new file mode 100644 index 000000000..4871284f3 --- /dev/null +++ b/_modules/mtuq/graphics/beachball.html @@ -0,0 +1,571 @@ + + + + + + + mtuq.graphics.beachball — MTUQ Documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +

Source code for mtuq.graphics.beachball

+#
+# graphics/beachball.py - first motion "beachball" plots
+#
+
+# - uses PyGMT if present to plot beachballs
+# - if PyGMT is not present, attempts to fall back to GMT >=6
+# - if GMT >=6 is not present, attempts to fall back to ObsPy
+
+
+import obspy.imaging.beachball
+import os
+import matplotlib.pyplot as pyplot
+import numpy as np
+import subprocess
+
+from glob import glob
+from mtuq.event import MomentTensor
+from mtuq.graphics._gmt import _parse_filetype, _get_format_arg, _safename,\
+    exists_gmt, gmt_major_version
+from mtuq.graphics._pygmt import exists_pygmt
+from mtuq.util import asarray, to_rgb, warn
+from mtuq.misfit.polarity import _takeoff_angle_taup
+from obspy.geodetics import gps2dist_azimuth
+from obspy.geodetics import kilometers2degrees as _to_deg
+from obspy.taup import TauPyModel
+from six import string_types
+
+
+
[docs]def plot_beachball(filename, mt, stations, origin, **kwargs): + """ Plots focal mechanism and station locations + + .. rubric :: Required arguments + + ``filename`` (`str`): + Name of output image file + + ``mt`` (`mtuq.MomentTensor`): + Moment tensor object + + ``stations`` (`list` of `Station` objects): + Stations from which azimuths and takeoff angles are calculated + + ``origin`` (`mtuq.Origin`): + Origin object + + + .. rubric :: Optional arguments + + ``add_station_labels`` (`bool`): + Displays station names + + ``add_station_markers`` (`bool`): + Displays station markers + + ``fill_color`` (`str`): + Color used for beachball + + ``marker_color`` (`str`): + Color used for station markers + + ``taup_model`` (`str`): + Name of built-in ObsPy TauP model or path to custom ObsPy TauP model, + used for takeoff angle calculations + + """ + + if type(mt)!=MomentTensor: + raise TypeError + + if exists_pygmt(): + _plot_beachball_pygmt(filename, mt, stations, origin, **kwargs) + return + + if exists_gmt() and gmt_major_version() >= 6: + _plot_beachball_gmt(filename, mt, stations, origin, **kwargs) + return + + try: + warn("plot_beachball: Falling back to ObsPy") + from matplotlib import pyplot + obspy.imaging.beachball.beachball( + mt.as_vector(), size=200, linewidth=2, facecolor=fill_color) + pyplot.savefig(filename) + pyplot.close() + except: + warn("plot_beachball: Plotting failed")
+ + +
[docs]def plot_polarities(filename, observed, predicted, stations, origin, mt, **kwargs): + """ Plots first-motion polarities + + .. rubric :: Required arguments + + ``filename`` (`str`): + Name of output image file + + ``observed`` (`list` or `dict`) + Observed polarities for all stations (+1 positive, -1 negative, 0 unpicked) + + ``predicted`` (`list` or `dict`) + Predicted polarities for all stations (+1 positive, -1 negative) + + ``stations`` (`list`): + List containting station names, azimuths and takeoff angles + + ``origin`` (`mtuq.Origin`): + Origin object + + ``mt`` (`mtuq.MomentTensor`): + Moment tensor object + + """ + if exists_pygmt(): + _plot_polarities_pygmt(filename, observed, predicted, + stations, origin, mt, **kwargs) + + else: + raise Exception('Requires PyGMT')
+ + +# +# GMT implementation +# + +GMT_REGION = '-R-1.2/1.2/-1.2/1.2' +GMT_PROJECTION = '-Jm0/0/5c' + + +def _plot_beachball_gmt(filename, mt, stations, origin, + taup_model='ak135', add_station_markers=True, add_station_labels=True, + fill_color='gray', marker_color='black'): + + + filename, filetype = _parse_filetype(filename) + format_arg = _get_format_arg(filetype) + + # parse optional arguments + label_arg = '' + if add_station_labels: + label_arg = '-T+jCB' + + if fill_color: + rgb = to_rgb(fill_color) + + if marker_color: + rgb2 = to_rgb(marker_color) + + + if stations and origin and (add_station_markers or add_station_labels): + # + # plots beachball and stations + # + ascii_table = _safename('tmp.'+filename+'.sta') + _write_stations(ascii_table, stations, origin, taup_model) + + subprocess.call( + '#!/bin/bash -e\n' + + 'gmt psmeca %s %s -M -Sm9.9c -G%d/%d/%d -h1 -Xc -Yc -K << END > %s\n' + 'lat lon depth mrr mtt mpp mrt mrp mtp\n' + '0. 0. 10. %e %e %e %e %e %e 25 0 0\n' + 'END\n\n' + + 'gmt pspolar %s %s %s -D0/0 -E%d/%d/%d -G%d/%d/%d -F -Qe -M9.9c -N -Si0.6c %s -O >> %s\n' + + 'gmt psconvert %s -F%s -A %s\n' + % + ( + #psmeca args + GMT_REGION, GMT_PROJECTION, *rgb, filename+'.ps', + + #psmeca table + *mt.as_vector(), + + #pspolar args + GMT_REGION, GMT_PROJECTION, ascii_table, *rgb2, *rgb2, label_arg, filename+'.ps', + + #psconvert args + filename+'.ps', filename, format_arg, + + ), shell=True) + + else: + # + # plots beachball only + # + subprocess.call( + '#!/bin/bash -e\n' + + 'gmt psmeca %s %s -M -Sm9.9c -G%d/%d/%d -h1 -Xc -Yc << END > %s\n' + 'lat lon depth mrr mtt mpp mrt mrp mtp\n' + '0. 0. 10. %e %e %e %e %e %e 25 0 0\n' + 'END\n\n' + + 'gmt psconvert %s -F%s -A %s\n' + % + ( + #psmeca args + GMT_REGION, GMT_PROJECTION, *rgb, filename+'.ps', + + #psmeca table + *mt.as_vector(), + + #psconvert args + filename+'.ps', filename, format_arg, + + ), shell=True) + + + # remove temporary files + for _filename in glob(_safename('tmp.'+filename+'*')): + os.remove(_filename) + + +def _write_stations(filename, stations, origin, taup_model): + + try: + taup = TauPyModel(model=taup_model) + except: + taup = None + + with open(filename, 'w') as file: + for station in stations: + + label = station.station + + distance_in_m, azimuth, _ = gps2dist_azimuth( + origin.latitude, + origin.longitude, + station.latitude, + station.longitude) + + takeoff_angle = _takeoff_angle_taup( + taup, + origin.depth_in_m/1000., + _to_deg(distance_in_m/1000.)) + + if takeoff_angle is not None: + file.write('%s %f %f\n' % (label, azimuth, takeoff_angle)) + + +# +# PyGMT implementation (experimental) +# + +PYGMT_REGION = [-1.2, 1.2, -1.2, 1.2] +PYGMT_PROJECTION= 'm0/0/5c' +PYGMT_SCALE = '9.9c' + + +def _plot_beachball_pygmt(filename, mt, stations, origin, + taup_model='ak135', add_station_labels=True, add_station_markers=True, + fill_color='gray', marker_color='black'): + + import pygmt + fig = pygmt.Figure() + + # + # plot the beachball itself + # + _meca_pygmt(fig, mt) + + # + # add station markers and labels + # + if stations and origin: + _write_stations(_safename('tmp.'+filename+'.sta'), + stations, origin, taup_model) + + _polar1( + _safename('tmp.'+filename+'.sta'), + + # basemap arguments + projection=PYGMT_PROJECTION, + scale=PYGMT_SCALE, + + station_labels='+jCB', + offset='0/0', + symbol='i0.60c', + comp_fill='black', + ext_fill='black', + background=True, + ) + + fig.savefig(filename) + + # remove temporary files + for _filename in glob(_safename('tmp.'+filename+'*')): + os.remove(_filename) + + +def _plot_polarities_pygmt(filename, observed, predicted, + stations, origin, mt, **kwargs): + + import pygmt + + if observed.size != predicted.size: + raise Exception('Inconsistent dimensions') + + if observed.size != len(stations): + raise Exception('Inconsistent dimensions') + + observed = observed.flatten() + predicted = predicted.flatten() + + up_matched = [station for _i, station in enumerate(stations) + if observed[_i] == predicted[_i] == 1] + + down_matched = [station for _i, station in enumerate(stations) + if observed[_i] == predicted[_i] == -1] + + up_unmatched = [station for _i, station in enumerate(stations) + if (observed[_i] == 1) and (predicted[_i] == -1)] + + down_unmatched = [station for _i, station in enumerate(stations) + if (observed[_i] == -1) and (predicted[_i] == 1)] + + unpicked = [station for _i, station in enumerate(stations) + if (observed[_i] != +1) and (observed[_i] != -1)] + + + fig = pygmt.Figure() + + # the beachball itself + _meca_pygmt(fig, mt) + + # observed and synthetic both positive + _polar2(up_matched, symbol='t0.40c', comp_fill='green') + + # observed and synthetic both negative + _polar2(down_matched, symbol='i0.40c', ext_fill='green') + + # observed positive, synthetic negative + _polar2(up_unmatched, symbol='t0.40c', comp_fill='red') + + # observed negative, synthetic positive + _polar2(down_unmatched, symbol='i0.40c', ext_fill='red') + + fig.savefig(filename) + + +def _meca_pygmt(fig, mt): + fig.meca( + # lon, lat, depth, mrr, mtt, mpp, mrt, mrp, mtp, lon2, lat2 + np.array([0, 0, 10, *mt.as_vector(), 0, 0]), + + scale=PYGMT_SCALE, + convention="mt", + + # basemap arguments + region=PYGMT_REGION, + projection=PYGMT_PROJECTION, + + compressionfill='grey50', + no_clip=False, + M=True, + ) + + +# ugly workarounds like those below necessary until PyGMT itself implements +# GMT polar + +def _polar1(ascii_table, **kwargs): + import pygmt + from pygmt.helpers import build_arg_string, use_alias + + @use_alias( + D='offset', + J='projection', + M='scale', + S='symbol', + E='ext_fill', + G='comp_fill', + F='background', + Qe='ext_outline', + Qg='comp_outline', + Qf='mt_outline', + T='station_labels' + ) + def __polar1(ascii_table, **kwargs): + + arg_string = " ".join([ascii_table, build_arg_string(kwargs)]) + with pygmt.clib.Session() as session: + session.call_module('polar',arg_string) + + __polar1(ascii_table, **kwargs) + + +def _polar2(stations, **kwargs): + import pygmt + from pygmt.helpers import build_arg_string, use_alias + + @use_alias( + D='offset', + J='projection', + M='size', + S='symbol', + E='ext_fill', + G='comp_fill', + F='background', + Qe='ext_outline', + Qg='comp_outline', + Qf='mt_outline', + T='station_labels' + ) + def __polar2(stations, **kwargs): + + # apply defaults + kwargs = { + 'D' : '0/0', + 'J' : 'm0/0/5c', + 'M' : '9.9c', + 'T' : '+f0.18c', + 'R': '-1.2/1.2/-1.2/1.2', + **kwargs, + } + + with open('_tmp_polar2', 'w') as f: + for station in stations: + + label = station.network+'.'+station.station + try: + if station.polarity > 0: + polarity = '+' + elif station.polarity < 0: + polarity = '-' + else: + polarity = '0' + except: + polarity = '0' + + f.write("%s %s %s %s\n" % ( + label, station.azimuth, station.takeoff_angle, polarity)) + + arg_string = " ".join(['_tmp_polar2', build_arg_string(kwargs)]) + with pygmt.clib.Session() as session: + session.call_module('polar',arg_string) + os.remove('_tmp_polar2') + + + __polar2(stations, **kwargs) + + +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/_modules/mtuq/graphics/uq/depth.html b/_modules/mtuq/graphics/uq/depth.html new file mode 100644 index 000000000..6ac7dc5b1 --- /dev/null +++ b/_modules/mtuq/graphics/uq/depth.html @@ -0,0 +1,353 @@ + + + + + + + mtuq.graphics.uq.depth — MTUQ Documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +

Source code for mtuq.graphics.uq.depth

+
+#
+# graphics/uq/origin.py - uncertainty quantification of source depth
+#
+
+import numpy as np
+import subprocess
+
+from pandas import DataFrame
+from xarray import DataArray
+from mtuq.graphics.uq._gmt import _plot_depth_gmt
+from mtuq.graphics.uq._matplotlib import _plot_depth_matplotlib
+from mtuq.grid_search import MTUQDataArray, MTUQDataFrame
+from mtuq.util import defaults, warn
+from mtuq.util.math import to_Mw
+
+
+
+
[docs]def plot_misfit_depth(filename, ds, origins, **kwargs): + """ Plots misfit versus depth + + .. rubric :: Required input arguments + + ``filename`` (`str`): + Name of output image file + + ``ds`` (`DataArray` or `DataFrame`): + Data structure containing moment tensors and corresponding misfit values + + ``origins`` (`list` of `Origin` objects): + Origin objects corresponding to different depths + + + .. rubric :: Optional input arguments + + For optional argument descriptions, + `see here <mtuq.graphics._plot_depth.html>`_ + + """ + defaults(kwargs, { + 'ylabel': 'Misfit', + }) + + + _check(ds) + ds = ds.copy() + + if issubclass(type(ds), DataArray): + da = _misfit_regular(ds) + + elif issubclass(type(ds), DataFrame): + warn('plot_misfit_depth() not implemented for irregularly-spaced grids.\n' + 'No figure will be generated.') + return + + + _plot_depth(filename, da, origins, **kwargs)
+ + + +
[docs]def plot_likelihood_depth(filename, ds, origins, var=None, **kwargs): + """ Plots maximum likelihoods versus depth + + .. rubric :: Required input arguments + + ``filename`` (`str`): + Name of output image file + + ``ds`` (`DataArray` or `DataFrame`): + Data structure containing moment tensors and corresponding misfit values + + ``origins`` (`list` of `Origin` objects): + Origin objects corresponding to different depths + + + .. rubric :: Optional input arguments + + For optional argument descriptions, + `see here <mtuq.graphics._plot_depth.html>`_ + + """ + defaults(kwargs, { + 'ylabel': 'Likelihood', + }) + + _check(ds) + ds = ds.copy() + + if issubclass(type(ds), DataArray): + da = _likelihoods_regular(ds, var) + + elif issubclass(type(ds), DataFrame): + warn('plot_likelihood_depth() not implemented for irregularly-spaced grids.\n' + 'No figure will be generated.') + return + + _plot_depth(filename, da, origins, **kwargs)
+ + + +
[docs]def plot_marginal_depth(filename, ds, origins, var=None, **kwargs): + """ Plots marginal likelihoods versus depth + + .. rubric :: Required input arguments + + ``filename`` (`str`): + Name of output image file + + ``ds`` (`DataArray` or `DataFrame`): + Data structure containing moment tensors and corresponding misfit values + + ``origins`` (`list` of `Origin` objects): + Origin objects corresponding to different depths + + + .. rubric :: Optional input arguments + + For optional argument descriptions, + `see here <mtuq.graphics._plot_depth.html>`_ + + """ + + raise NotImplementedError
+ + +
[docs]def _plot_depth(filename, da, origins, title='', + xlabel='auto', ylabel='', show_magnitudes=False, show_tradeoffs=False, + backend=_plot_depth_gmt): + + """ Plots DataArray values versus depth (requires GMT) + + .. rubric :: Keyword arguments + + ``show_magnitudes`` (`bool`): + Write magnitude annotation for each plotted value + + ``show_tradeoffs`` (`bool`): + Show how focal mechanism trades off with depth + + ``xlabel`` (`str`): + Optional x-axis label + + ``ylabel`` (`str`): + Optional y-axis label + + ``title`` (`str`): + Optional figure title + + ``backend`` (`function`): + Choose from `_plot_lune_gmt` (default), `_plot_lune_matplotlib`, + or user-supplied function + + """ + + npts = len(origins) + + depths = np.empty(npts) + values = np.empty(npts) + for _i, origin in enumerate(origins): + depths[_i] = origin.depth_in_m + values[_i] = da.values[_i] + + magnitudes = None + if show_magnitudes: + magnitudes = np.empty(npts) + for _i in range(npts): + magnitudes[_i] = to_Mw(da[_i].coords['rho']) + + lune_array = None + if show_tradeoffs: + lune_array = np.empty((npts, 6)) + for _i in range(npts): + lune_array[_i, 0] = da[_i].coords['rho'] + lune_array[_i, 1] = da[_i].coords['v'] + lune_array[_i, 2] = da[_i].coords['w'] + lune_array[_i, 3] = da[_i].coords['kappa'] + lune_array[_i, 4] = da[_i].coords['sigma'] + lune_array[_i, 5] = da[_i].coords['h'] + + if xlabel=='auto' and (depths.max() < 10000.): + xlabel = 'Depth (m)' + elif xlabel=='auto' and (depths.max() >= 10000.): + depths /= 1000. + xlabel = 'Depth (km)' + + backend(filename, + depths, + values, + magnitudes=magnitudes, + lune_array=lune_array, + xlabel=xlabel, + ylabel=ylabel, + title=title, + )
+ + +# +# for extracting values from regularly-spaced grids +# + +def _misfit_regular(da): + dims = ('rho', 'v', 'w', 'kappa', 'sigma', 'h') + return da[da.argmin(dims)] + + +def _likelihoods_regular(da, var): + likelihoods = da.copy() + likelihoods.values = np.exp(-likelihoods.values/(2.*var)) + likelihoods.values /= likelihoods.values.sum() + + dims = ('rho', 'v', 'w', 'kappa', 'sigma', 'h') + idx = likelihoods.argmax(dims) + return likelihoods[idx] + + +# +# utility functions +# + +def _check(ds): + """ Checks data structures + """ + if type(ds) not in (DataArray, DataFrame, MTUQDataArray, MTUQDataFrame): + raise TypeError("Unexpected grid format") + +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/_modules/mtuq/graphics/uq/double_couple.html b/_modules/mtuq/graphics/uq/double_couple.html new file mode 100644 index 000000000..6de21074e --- /dev/null +++ b/_modules/mtuq/graphics/uq/double_couple.html @@ -0,0 +1,489 @@ + + + + + + + mtuq.graphics.uq.double_couple — MTUQ Documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +

Source code for mtuq.graphics.uq.double_couple

+#
+# graphics/uq/double_couple.py - uncertainty quantification of double couple sources
+#
+
+import numpy as np
+
+from matplotlib import pyplot
+from pandas import DataFrame
+from xarray import DataArray
+from mtuq.graphics._gmt import read_cpt, _cpt_path
+from mtuq.graphics.uq._matplotlib import _plot_dc_matplotlib
+from mtuq.grid_search import MTUQDataArray, MTUQDataFrame
+from mtuq.util import dataarray_idxmin, dataarray_idxmax, defaults, warn
+from mtuq.util.math import closed_interval, open_interval, to_delta, to_gamma, to_mij
+from os.path import exists
+
+
+
[docs]def plot_misfit_dc(filename, ds, **kwargs): + """ Plots misfit values over strike, dip, slip + + .. rubric :: Required input arguments + + ``filename`` (`str`): + Name of output image file + + ``ds`` (`DataArray` or `DataFrame`): + Data structure containing moment tensors and corresponding misfit values + + + .. rubric :: Optional input arguments + + For optional argument descriptions, + `see here <mtuq.graphics._plot_dc.html>`_ + + """ + defaults(kwargs, { + 'colormap': 'viridis', + 'squeeze': 'min', + }) + + _check(ds) + + if issubclass(type(ds), DataArray): + misfit = _misfit_dc_regular(ds) + + elif issubclass(type(ds), DataFrame): + warn('plot_misfit_dc() not implemented for irregularly-spaced grids.\n' + 'No figure will be generated.') + return + + _plot_dc(filename, misfit, **kwargs)
+ + + +
[docs]def plot_likelihood_dc(filename, ds, var, **kwargs): + """ Plots maximum likelihood values over strike, dip, slip + + .. rubric :: Required input arguments + + ``filename`` (`str`): + Name of output image file + + ``ds`` (`DataArray` or `DataFrame`): + Data structure containing moment tensors and corresponding misfit values + + ``var`` (`float` or `array`): + Data variance + + + .. rubric :: Optional input arguments + + For optional argument descriptions, + `see here <mtuq.graphics._plot_dc.html>`_ + + """ + defaults(kwargs, { + 'colormap': 'hot_r', + 'squeeze': 'max', + }) + + _check(ds) + + if issubclass(type(ds), DataArray): + likelihoods = _likelihoods_dc_regular(ds, var) + + elif issubclass(type(ds), DataFrame): + warn('plot_likelihood_dc() not implemented for irregularly-spaced grids.\n' + 'No figure will be generated.') + return + + _plot_dc(filename, likelihoods, **kwargs)
+ + + +
[docs]def plot_marginal_dc(filename, ds, var, **kwargs): + """ Plots marginal likelihood values over strike, dip, slip + + .. rubric :: Required input arguments + + ``filename`` (`str`): + Name of output image file + + ``ds`` (`DataArray` or `DataFrame`): + Data structure containing moment tensors and corresponding misfit values + + ``var`` (`float` or `array`): + Data variance + + + .. rubric :: Optional input arguments + + For optional argument descriptions, + `see here <mtuq.graphics._plot_dc.html>`_ + + """ + defaults(kwargs, { + 'colormap': 'hot_r', + 'squeeze': 'max', + }) + + _check(ds) + + if issubclass(type(ds), DataArray): + marginals = _marginals_dc_regular(ds, var) + + elif issubclass(type(ds), DataFrame): + warn('plot_marginal_dc() not implemented for irregularly-spaced grids.\n' + 'No figure will be generated.') + return + + _plot_dc(filename, marginals, **kwargs)
+ + + +def plot_variance_reduction_dc(filename, ds, data_norm, **kwargs): + """ Plots variance reduction values over strike, dip, slip + + .. rubric :: Required input arguments + + ``filename`` (`str`): + Name of output image file + + ``ds`` (`DataArray` or `DataFrame`): + Data structure containing moment tensors and corresponding misfit values + + ``data_norm`` (`float`): + Data norm + + + .. rubric :: Optional input arguments + + For optional argument descriptions, + `see here <mtuq.graphics._plot_dc.html>`_ + + """ + defaults(kwargs, { + 'colormap': 'viridis_r', + 'squeeze': 'max', + }) + + _check(ds) + + if issubclass(type(ds), DataArray): + variance_reduction = _variance_reduction_dc_regular(ds, var) + + elif issubclass(type(ds), DataFrame): + warn('plot_variance_reduction_dc() not implemented for irregularly-spaced grids.\n' + 'No figure will be generated.') + return + + _plot_dc(filename, variance_reduction, **kwargs) + + + +
[docs]def _plot_dc(filename, da, show_best=True, colormap='hot', + backend=_plot_dc_matplotlib, squeeze='min', **kwargs): + + """ Plots DataArray values over strike, dip, slip + + .. rubric :: Keyword arguments + + ``colormap`` (`str`) + Color palette used for plotting values + (choose from GMT or MTUQ built-ins) + + ``show_best`` (`bool`): + Show where best-fitting moment tensor falls in terms of strike, dip, slip + + ``squeeze`` (`str`): + By default, 2-D surfaces are obtained by minimizing or maximizing. + For slices instead, use `slice_min` or `slice_max`. + + ``backend`` (`function`): + Choose from `_plot_dc_matplotlib` (default) or user-supplied function + + """ + + if not issubclass(type(da), DataArray): + raise Exception() + + if show_best: + if 'best_dc' in da.attrs: + best_dc = da.attrs['best_dc'] + else: + warn("Best-fitting orientation not given") + best_dc = None + + # note the following parameterization details + # kappa = strike + # sigma = slip + # h = cos(dip) + + # squeeze full 3-D array into 2-D arrays + if squeeze=='min': + values_h_kappa = da.min(dim=('sigma')).values + values_sigma_kappa = da.min(dim=('h')).values + values_sigma_h = da.min(dim=('kappa')).values.T + + elif squeeze=='max': + values_h_kappa = da.max(dim=('sigma')).values + values_sigma_kappa = da.max(dim=('h')).values + values_sigma_h = da.max(dim=('kappa')).values.T + + elif squeeze=='slice_min': + argmin = da.argmin(('kappa','sigma','h')) + values_h_kappa = da.isel(sigma=argmin['sigma'], drop=True).values + values_sigma_kappa = da.isel(h=argmin['h'], drop=True).values + values_sigma_h = da.isel(kappa=argmin['kappa'], drop=True).values.T + + elif squeeze=='slice_max': + argmax = da.argmax(('kappa','sigma','h')) + values_h_kappa = da.isel(sigma=argmax['sigma'], drop=True).values + values_sigma_kappa = da.isel(h=argmax['h'], drop=True).values + values_sigma_h = da.isel(kappa=argmax['kappa'], drop=True).values.T + + else: + raise ValueError + + backend(filename, + da.coords, + values_h_kappa, + values_sigma_kappa, + values_sigma_h, + best_dc=best_dc, + **kwargs)
+ + +# +# for extracting misfit, variance reduction and likelihood from +# regularly-spaced grids +# + +def _misfit_dc_regular(da): + """ For each moment tensor orientation, extract minimum misfit + """ + misfit = da.min(dim=('origin_idx', 'rho', 'v', 'w')) + + return misfit.assign_attrs({ + 'best_mt': _min_mt(da), + 'best_dc': _min_dc(da), + }) + + +def _likelihoods_dc_regular(da, var): + """ For each moment tensor orientation, calculate maximum likelihood + """ + likelihoods = da.copy() + likelihoods.values = np.exp(-likelihoods.values/(2.*var)) + likelihoods.values /= likelihoods.values.sum() + + likelihoods = likelihoods.max(dim=('origin_idx', 'rho', 'v', 'w')) + likelihoods.values /= likelihoods.values.sum() + #likelihoods /= dc_area + + return likelihoods.assign_attrs({ + 'best_mt': _min_mt(da), + 'best_dc': _min_dc(da), + 'maximum_likelihood_estimate': dataarray_idxmax(likelihoods).values(), + }) + + +def _marginals_dc_regular(da, var): + """ For each moment tensor orientation, calculate marginal likelihood + """ + likelihoods = da.copy() + likelihoods.values = np.exp(-likelihoods.values/(2.*var)) + likelihoods.values /= likelihoods.values.sum() + + marginals = likelihoods.sum(dim=('origin_idx', 'rho', 'v', 'w')) + marginals.values /= marginals.values.sum() + + return marginals.assign_attrs({ + 'best_dc': _max_dc(marginals), + }) + + +def _variance_reduction_dc_regular(da, data_norm): + """ For each moment tensor orientation, extracts maximum variance reduction + """ + variance_reduction = 1. - da.copy()/data_norm + + variance_reduction = variance_reduction.max( + dim=('origin_idx', 'rho', 'v', 'w')) + + # widely-used convention - variance reducation as a percentage + variance_reduction.values *= 100. + + return variance_reduction.assign_attrs({ + 'best_mt': _min_mt(da), + 'best_dc': _min_dc(da), + 'lune_array': _lune_array(da), + }) + + +# +# utility functions +# + +def _min_mt(da): + """ Returns moment tensor vector corresponding to minimum DataArray value + """ + da = dataarray_idxmin(da) + lune_keys = ['rho', 'v', 'w', 'kappa', 'sigma', 'h'] + lune_vals = [da[key].values for key in lune_keys] + return to_mij(*lune_vals) + + +def _max_mt(da): + """ Returns moment tensor vector corresponding to maximum DataArray value + """ + da = dataarray_idxmax(da) + lune_keys = ['rho', 'v', 'w', 'kappa', 'sigma', 'h'] + lune_vals = [da[key].values for key in lune_keys] + return to_mij(*lune_vals) + + +def _min_dc(da): + """ Returns orientation angles corresponding to minimum DataArray value + """ + da = dataarray_idxmin(da) + dc_keys = ['kappa', 'sigma', 'h'] + dc_vals = [da[key].values for key in dc_keys] + return dc_vals + +def _max_dc(da): + """ Returns orientation angles corresponding to maximum DataArray value + """ + da = dataarray_idxmax(da) + dc_keys = ['kappa', 'sigma', 'h'] + dc_vals = [da[key].values for key in dc_keys] + return dc_vals + + + +def _check(ds): + """ Checks data structures + """ + if type(ds) not in (DataArray, DataFrame, MTUQDataArray, MTUQDataFrame): + raise TypeError("Unexpected grid format") + + +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/_modules/mtuq/graphics/uq/force.html b/_modules/mtuq/graphics/uq/force.html new file mode 100644 index 000000000..41f4ca9c4 --- /dev/null +++ b/_modules/mtuq/graphics/uq/force.html @@ -0,0 +1,521 @@ + + + + + + + mtuq.graphics.uq.force — MTUQ Documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +

Source code for mtuq.graphics.uq.force

+
+#
+# graphics/uq/force.py - uncertainty quantification of forces on the unit sphere
+#
+
+import numpy as np
+
+from matplotlib import pyplot
+
+from mtuq.graphics.uq._gmt import _plot_force_gmt
+from mtuq.grid_search import DataFrame, DataArray, MTUQDataArray, MTUQDataFrame
+from mtuq.util import defaults, warn
+from mtuq.util import dataarray_idxmin, dataarray_idxmax
+from mtuq.util.math import closed_interval, open_interval
+
+
+
[docs]def plot_misfit_force(filename, ds, **kwargs): + """ Plots misfit values with respect to force orientation (requires GMT) + + .. rubric :: Required input arguments + + ``filename`` (`str`): + Name of output image file + + ``ds`` (`DataArray` or `DataFrame`): + Data structure containing forces and corresponding misfit values + + + .. rubric :: Optional input arguments + + For optional argument descriptions, + `see here <mtuq.graphics._plot_force.html>`_ + + + """ + defaults(kwargs, { + 'colormap': 'viridis', + }) + + _check(ds) + ds = ds.copy() + + if issubclass(type(ds), DataArray): + misfit = _misfit_regular(ds) + + elif issubclass(type(ds), DataFrame): + misfit = _misfit_random(ds) + + _plot_force(filename, misfit, **kwargs)
+ + +
[docs]def plot_likelihood_force(filename, ds, var, **kwargs): + """ Plots maximum likelihood values with respect to force orientation + (requires GMT) + + .. rubric :: Required input arguments + + ``filename`` (`str`): + Name of output image file + + ``ds`` (`DataArray` or `DataFrame`): + Data structure containing forces and corresponding misfit values + + ``var`` (`float` or `array`): + Data variance + + + .. rubric :: Optional input arguments + + For optional argument descriptions, + `see here <mtuq.graphics._plot_force.html>`_ + + + """ + + defaults(kwargs, { + 'colormap': 'hot_r', + }) + + _check(ds) + ds = ds.copy() + + if issubclass(type(ds), DataArray): + likelihoods = _likelihoods_regular(ds, var) + + elif issubclass(type(ds), DataFrame): + likelihoods = _likelihoods_random(ds, var) + + _plot_force(filename, likelihoods, **kwargs)
+ + +
[docs]def plot_marginal_force(filename, ds, var, **kwargs): + """ Plots marginal likelihood values with respect to force orientation + (requires GMT) + + .. rubric :: Required input arguments + + ``filename`` (`str`): + Name of output image file + + ``ds`` (`DataArray` or `DataFrame`): + Data structure containing forces and corresponding misfit values + + ``var`` (`float` or `array`): + Data variance + + + .. rubric :: Optional input arguments + + For optional argument descriptions, + `see here <mtuq.graphics._plot_force.html>`_ + + """ + defaults(kwargs, { + 'colormap': 'hot_r', + }) + + _check(ds) + ds = ds.copy() + + if issubclass(type(ds), DataArray): + marginals = _marginals_regular(ds, var) + + elif issubclass(type(ds), DataFrame): + marginals = _marginals_random(ds, var) + + _plot_force(filename, marginals, **kwargs)
+ + +def plot_magnitude_tradeoffs_force(filename, ds, **kwargs): + """ Plots magnitude versus force orientation tradeoffs + (requires GMT) + + .. rubric :: Required input arguments + + ``filename`` (`str`): + Name of output image file + + ``ds`` (`DataArray` or `DataFrame`): + Data structure containing forces and corresponding misfit values + + + .. rubric :: Optional input arguments + + For optional argument descriptions, + `see here <mtuq.graphics._plot_force.html>`_ + + + """ + defaults(kwargs, { + 'colormap': 'gray', + }) + + _check(ds) + ds = ds.copy() + + if issubclass(type(ds), DataArray): + marginals = _magnitudes_regular(ds) + + elif issubclass(type(ds), DataFrame): + raise NotImplementedError + + _plot_force(filename, marginals, **kwargs) + + +
[docs]def _plot_force(filename, da, show_best=True, show_tradeoffs=False, + backend=_plot_force_gmt, **kwargs): + + """ Plots values with respect to force orientation (requires GMT) + + .. rubric :: Keyword arguments + + ``colormap`` (`str`): + Color palette used for plotting values + (choose from GMT or MTUQ built-ins) + + ``show_best`` (`bool`): + Show orientation of best-fitting force + + ``title`` (`str`): + Optional figure title + + ``backend`` (`function`): + Choose from `_plot_force_gmt` (default) or user-supplied function + + """ + if not issubclass(type(da), DataArray): + raise Exception() + + + best_force = None + if show_best: + if 'best_force' in da.attrs: + best_force = da.attrs['best_force'] + else: + warn("Best-fitting force not given") + + _plot_force_gmt(filename, + da.coords['phi'], + da.coords['h'], + da.values.transpose(), + best_force=best_force, + **kwargs)
+ + +# +# for extracting misfit or likelihood from regularly-spaced grids +# + +def _misfit_regular(da): + """ For each force orientation, extracts minimum misfit + """ + misfit = da.min(dim=('origin_idx', 'F0')) + + return misfit.assign_attrs({ + 'best_force': _min_force(da) + }) + + +def _likelihoods_regular(da, var): + """ For each force orientation, calculates maximum likelihood value + """ + likelihoods = da.copy() + likelihoods.values = np.exp(-likelihoods.values/(2.*var)) + likelihoods.values /= likelihoods.values.sum() + + likelihoods = likelihoods.max(dim=('origin_idx', 'F0')) + likelihoods.values /= 4.*np.pi*likelihoods.values.sum() + + return likelihoods.assign_attrs({ + 'best_force': _max_force(likelihoods) + }) + + +def _marginals_regular(da, var): + """ For each force orientation, calculates marginal likelihood value + """ + + likelihoods = da.copy() + likelihoods.values = np.exp(-likelihoods.values/(2.*var)) + likelihoods.values /= likelihoods.values.sum() + + marginals = likelihoods.sum(dim=('origin_idx', 'F0')) + marginals.values /= 4.*np.pi*marginals.values.sum() + + return marginals.assign_attrs({ + 'best_force': _max_force(da) + }) + + +def _magnitudes_regular(da): + """ For each source type, calculates magnitude of best-fitting moment tensor + """ + phi = da.coords['phi'] + h = da.coords['h'] + + nphi = len(phi) + nh = len(h) + + misfit = da.min(dim=('origin_idx')) + magnitudes = np.empty((nphi,nh)) + + for ip in range(nphi): + for ih in range(nh): + sliced = misfit[:,ip,ih] + argmin = np.argmin(sliced.values, axis=None) + magnitudes[ip,ih] = da['F0'][argmin] + + magnitudes = DataArray( + dims=('phi','h'), + coords=(phi,h), + data=magnitudes + ) + + return magnitudes.assign_attrs({ + 'best_force': _min_force(da) + }) + + +def _min_force(da): + """ Returns force corresponding to minimum overall value + """ + da = dataarray_idxmin(da) + keys = ['phi', 'h'] + vals = [da[key].values for key in keys] + return vals + + +def _max_force(da): + """ Returns force corresponding to maximum overall value + """ + da = dataarray_idxmax(da) + keys = ['phi', 'h'] + vals = [da[key].values for key in keys] + return vals + + + +# +# for extracting misfit or likelihood from irregularly-spaced grids +# + +def _misfit_random(df, **kwargs): + df = df.copy() + df = df.reset_index() + da = _bin(df, lambda df: df.min(), **kwargs) + + return da.assign_attrs({ + 'best_force': _min_force(da) + }) + + +def _likelihoods_random(df, var, **kwargs): + df = df.copy() + df = np.exp(-df/(2.*var)) + df = df.reset_index() + + da = _bin(df, lambda df: df.max(), **kwargs) + da.values /= 4.*np.pi*da.values.sum() + + return da.assign_attrs({ + 'best_force': _max_force(da) + }) + + +def _marginals_random(df, var, **kwargs): + df = df.copy() + df = np.exp(-df/(2.*var)) + df = df.reset_index() + + da = _bin(df, lambda df: df.sum()/len(df)) + da.values /= 4.*np.pi*da.values.sum() + + return da.assign_attrs({ + 'best_force': _max_force(da) + }) + + +# +# bins irregularly-spaced forces into phi,h rectangles +# + +def _bin(df, handle, npts_phi=60, npts_h=30): + """ Bins DataFrame into rectangular cells + """ + # define centers of cells + centers_phi = open_interval(0., 360., npts_phi) + centers_h = open_interval(-1., +1., npts_h) + + # define corners of cells + phi = closed_interval(0., 360, npts_phi+1) + h = closed_interval(-1., +1., npts_h+1) + + binned = np.empty((npts_h, npts_phi)) + for _i in range(npts_h): + for _j in range(npts_phi): + # which grid points lie within cell (i,j)? + subset = df.loc[ + df['phi'].between(phi[_j], phi[_j+1]) & + df['h'].between(h[_i], h[_i+1])] + + if len(subset)==0: + print("Encountered empty bin\n" + "phi: %f, %f\n" + "h: %f, %f\n" % + (phi[_j], phi[_j+1], h[_i], h[_i+1]) ) + + binned[_i, _j] = handle(subset[0]) + + return DataArray( + dims=('phi', 'h'), + coords=(centers_phi, centers_h), + data=binned.transpose() + ) + + + +# +# utility functions +# + +def _check(ds): + """ Checks data structures + """ + if type(ds) not in (DataArray, DataFrame, MTUQDataArray, MTUQDataFrame): + raise TypeError("Unexpected grid format") + + +def defaults(kwargs, defaults): + for key in defaults: + if key not in kwargs: + kwargs[key] = defaults[key] + +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/_modules/mtuq/graphics/uq/hypocenter.html b/_modules/mtuq/graphics/uq/hypocenter.html new file mode 100644 index 000000000..fb2c47ac2 --- /dev/null +++ b/_modules/mtuq/graphics/uq/hypocenter.html @@ -0,0 +1,327 @@ + + + + + + + mtuq.graphics.uq.hypocenter — MTUQ Documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +

Source code for mtuq.graphics.uq.hypocenter

+
+#
+# graphics/uq/hypocenter.py - uncertainty quantification of hypocenter location
+#
+
+import numpy as np
+import subprocess
+
+from pandas import DataFrame
+from xarray import DataArray
+from mtuq.graphics.uq._gmt import _plot_latlon_gmt
+from mtuq.graphics.uq.depth import _misfit_regular, _likelihoods_regular
+from mtuq.grid_search import MTUQDataArray, MTUQDataFrame
+from mtuq.util import defaults, warn
+from mtuq.util.math import closed_interval, open_interval
+
+
+
[docs]def plot_misfit_latlon(filename, ds, origins, **kwargs): + """ Plots misfit versus hypocenter location + + .. rubric :: Required input arguments + + ``filename`` (`str`): + Name of output image file + + ``ds`` (`DataArray` or `DataFrame`): + Data structure containing moment tensors and corresponding misfit values + + ``origins`` (`list` of `Origin` objects): + Origin objects corresponding to different hypocenters + + + .. rubric :: Optional input arguments + + For optional argument descriptions, + `see here <mtuq.graphics._plot_latlon.html>`_ + + """ + + _check(ds) + ds = ds.copy() + + if issubclass(type(ds), DataArray): + da = _misfit_regular(ds) + + elif issubclass(type(ds), DataFrame): + warn('plot_misfit_latlon() not implemented for irregularly-spaced grids.\n' + 'No figure will be generated.') + return + + _plot_latlon(filename, da, origins, **kwargs)
+ + +
[docs]def plot_likelihood_latlon(filename, ds, origins, **kwargs): + """ Plots likelihood versus hypocenter location + + .. rubric :: Required input arguments + + ``filename`` (`str`): + Name of output image file + + ``ds`` (`DataArray` or `DataFrame`): + Data structure containing moment tensors and corresponding misfit values + + ``origins`` (`list` of `Origin` objects): + Origin objects corresponding to different hypocenters + + + .. rubric :: Optional input arguments + + For optional argument descriptions, + `see here <mtuq.graphics._plot_latlon.html>`_ + + """ + + _check(ds) + ds = ds.copy() + + if issubclass(type(ds), DataArray): + da = _likelihood_regular(ds) + + elif issubclass(type(ds), DataFrame): + warn('plot_likelihood_latlon() not implemented for irregularly-spaced grids.\n' + 'No figure will be generated.') + + _plot_latlon(filename, da, origins, **kwargs)
+ + + +
[docs]def plot_marginal_latlon(filename, ds, origins, **kwargs): + """ Plots likelihood versus hypocenter location + + .. rubric :: Required input arguments + + ``filename`` (`str`): + Name of output image file + + ``ds`` (`DataArray` or `DataFrame`): + Data structure containing moment tensors and corresponding misfit values + + ``origins`` (`list` of `Origin` objects): + Origin objects corresponding to different hypocenters + + + .. rubric :: Optional input arguments + + For optional argument descriptions, + `see here <mtuq.graphics._plot_depth.html>`_ + + """ + raise NotImplementedError
+ + + +
[docs]def _plot_latlon(filename, da, origins,show_best=False, show_tradeoffs=False, + backend=_plot_latlon_gmt, **kwargs): + + """ Plots user-supplied DataArray values versus hypocenter (requires GMT) + + .. rubric :: Keyword arguments + + ``show_tradeoffs`` (`bool`): + Show how focal mechanism trades off with depth + + ``xlabel`` (`str`): + Optional x-axis label + + ``ylabel`` (`str`): + Optional y-axis label + + ``title`` (`str`): + Optional figure title + + ``backend`` (`function`): + Choose from `_plot_latlon_gmt` (default) or user-supplied function + + """ + + npts = len(origins) + + lon = np.empty(npts) + lat = np.empty(npts) + values = np.empty(npts) + + for _i, origin in enumerate(origins): + lon[_i] = origin.longitude + lat[_i] = origin.latitude + values[_i] = da.values[_i] + + best_latlon = None + if show_best: + raise NotImplementedError + + lune_array = None + if show_tradeoffs: + lune_array = np.empty((npts, 6)) + for _i in range(npts): + lune_array[_i, 0] = da[_i].coords['rho'] + lune_array[_i, 1] = da[_i].coords['v'] + lune_array[_i, 2] = da[_i].coords['w'] + lune_array[_i, 3] = da[_i].coords['kappa'] + lune_array[_i, 4] = da[_i].coords['sigma'] + lune_array[_i, 5] = da[_i].coords['h'] + + + backend(filename, + lon, lat, values, + best_latlon=best_latlon, + lune_array=lune_array, + **kwargs)
+ + +# +# utility functions +# + +def _get_labeltype(x,y,labeltype): + if labeltype=='latlon': + xlabel = None + ylabel = None + + if labeltype=='offset' and ((x.max()-x.min()) >= 10000.): + x /= 1000. + y /= 1000. + xlabel = 'E-W offset (km)' + ylabel = 'N-S offset (km)' + elif labeltype=='offset' and ((x.max()-x.min()) < 10000.): + xlabel = 'E-W offset (m)' + ylabel = 'N-S offset (m)' + + return xlabel,ylabel + + +def _check(ds): + """ Checks data structures + """ + if type(ds) not in (DataArray, DataFrame, MTUQDataArray, MTUQDataFrame): + raise TypeError("Unexpected grid format") + +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/_modules/mtuq/graphics/uq/lune.html b/_modules/mtuq/graphics/uq/lune.html new file mode 100644 index 000000000..6d861d592 --- /dev/null +++ b/_modules/mtuq/graphics/uq/lune.html @@ -0,0 +1,406 @@ + + + + + + + mtuq.graphics.uq.lune — MTUQ Documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +

Source code for mtuq.graphics.uq.lune

+
+# 
+# graphics/uq/lune.py - uncertainty quantification on the eigenvalue lune
+#
+
+#
+# For details about the eigenvalue lune, see
+# Tape2012 - A geometric setting for moment tensors
+# (https://doi.org/10.1111/j.1365-246X.2012.05491.x)
+#
+
+import numpy as np
+import pandas
+import xarray
+
+from matplotlib import pyplot
+from mtuq.grid_search import DataArray, DataFrame, MTUQDataArray, MTUQDataFrame
+from mtuq.graphics.uq._gmt import _plot_lune_gmt
+from mtuq.util import defaults, warn
+from mtuq.util.math import lune_det, to_gamma, to_delta
+
+from mtuq.graphics.uq.vw import\
+    _misfit_vw_regular, _misfit_vw_random,\
+    _likelihoods_vw_regular, _likelihoods_vw_random,\
+    _marginals_vw_regular, _marginals_vw_random,\
+    _variance_reduction_vw_regular, _variance_reduction_vw_random,\
+    _magnitudes_vw_regular
+from mtuq.graphics.uq._gmt import _parse_best_lune
+
+
+
[docs]def plot_misfit_lune(filename, ds, **kwargs): + """ Plots misfit values on eigenvalue lune (requires GMT) + + .. rubric :: Required input arguments + + ``filename`` (`str`): + Name of output image file + + ``ds`` (`DataArray` or `DataFrame`): + Data structure containing moment tensors and corresponding misfit values + + + .. rubric :: Optional input arguments + + For optional argument descriptions, + `see here <mtuq.graphics._plot_lune.html>`_ + + """ + defaults(kwargs, { + 'colormap': 'viridis', + }) + + _check(ds) + ds = ds.copy() + + if issubclass(type(ds), DataArray): + misfit = _misfit_vw_regular(ds) + + elif issubclass(type(ds), DataFrame): + misfit = _misfit_vw_random(ds) + + _plot_lune(filename, misfit, **kwargs)
+ + + +
[docs]def plot_likelihood_lune(filename, ds, var, **kwargs): + """ Plots maximum likelihood values on eigenvalue lune (requires GMT) + + .. rubric :: Required input arguments + + ``filename`` (`str`): + Name of output image file + + ``ds`` (`DataArray` or `DataFrame`): + Data structure containing moment tensors and corresponding misfit values + + ``var`` (`float` or `array`): + Data variance + + + .. rubric :: Optional input arguments + + For optional argument descriptions, + `see here <mtuq.graphics._plot_lune.html>`_ + """ + defaults(kwargs, { + 'colormap': 'hot_r', + }) + + _check(ds) + ds = ds.copy() + + if issubclass(type(ds), DataArray): + likelihoods = _likelihoods_vw_regular(ds, var) + + elif issubclass(type(ds), DataFrame): + likelihoods = _likelihoods_vw_random(ds, var) + + _plot_lune(filename, likelihoods, **kwargs)
+ + + +
[docs]def plot_marginal_lune(filename, ds, var, **kwargs): + """ Plots maximum likelihood values on eigenvalue lune (requires GMT) + + .. rubric :: Required input arguments + + ``filename`` (`str`): + Name of output image file + + ``ds`` (`DataArray` or `DataFrame`): + Data structure containing moment tensors and corresponding misfit values + + ``var`` (`float` or `array`): + Data variance + + + .. rubric :: Optional input arguments + + For optional argument descriptions, + `see here <mtuq.graphics._plot_lune.html>`_ + """ + defaults(kwargs, { + 'colormap': 'hot_r', + }) + + _check(ds) + ds = ds.copy() + + if issubclass(type(ds), DataArray): + marginals = _marginals_vw_regular(ds, var) + + elif issubclass(type(ds), DataFrame): + marginals = _marginals_vw_random(ds, var) + + _plot_lune(filename, marginals, **kwargs)
+ + +def plot_variance_reduction_lune(filename, ds, data_norm, **kwargs): + """ Plots variance reduction values on eigenvalue lune (requires GMT) + + .. rubric :: Required input arguments + + ``filename`` (`str`): + Name of output image file + + ``ds`` (`DataArray` or `DataFrame`): + Data structure containing moment tensors and corresponding misfit values + + ``data_norm`` (`float`): + Norm of data + + .. rubric :: Optional input arguments + + For optional argument descriptions, + `see here <mtuq.graphics._plot_lune.html>`_ + + """ + defaults(kwargs, { + 'colormap': 'viridis_r', + }) + + _check(ds) + ds = ds.copy() + + if issubclass(type(ds), DataArray): + variance_reduction = _variance_reduction_vw_regular(ds, data_norm) + + elif issubclass(type(ds), DataFrame): + variance_reduction = _variance_reduction_vw_random(ds, data_norm) + + _plot_lune(filename, variance_reduction, **kwargs) + + +def plot_magnitude_tradeoffs_lune(filename, ds, **kwargs): + """ Plots magnitude versus source type tradeoffs (requires GMT) + + .. rubric :: Required input arguments + + ``filename`` (`str`): + Name of output image file + + ``ds`` (`DataArray` or `DataFrame`): + Data structure containing moment tensors and corresponding misfit values + + ``var`` (`float` or `array`): + Data variance + + + .. rubric :: Optional input arguments + + For optional argument descriptions, + `see here <mtuq.graphics._plot_lune.html>`_ + """ + defaults(kwargs, { + 'colormap': 'gray', + }) + + _check(ds) + ds = ds.copy() + + if issubclass(type(ds), DataArray): + marginals = _magnitudes_vw_regular(ds) + + elif issubclass(type(ds), DataFrame): + raise NotImplementedError + + _plot_lune(filename, marginals, **kwargs) + + +
[docs]def _plot_lune(filename, da, show_best=True, show_mt=False, + show_tradeoffs=False, backend=_plot_lune_gmt, **kwargs): + + """ Plots DataArray values on the eigenvalue lune (requires GMT) + + .. rubric :: Keyword arguments + + ``colormap`` (`str`): + Color palette used for plotting values + (choose from GMT or MTUQ built-ins) + + ``show_best`` (`bool`): + Show where best-fitting moment tensor falls on lune + + ``show_tradeoffs`` (`bool`): + Show how focal mechanism trades off with lune coordinates + + ``title`` (`str`): + Optional figure title + + ``backend`` (`function`): + Choose from `_plot_lune_gmt` (default) or user-supplied function + + """ + if not issubclass(type(da), DataArray): + raise Exception() + + best_vw = None + lune_array = None + + if show_best or show_mt: + if 'best_vw' in da.attrs: + best_vw = da.attrs['best_vw'] + else: + warn("Best-fitting moment tensor not given") + + if show_tradeoffs or show_mt: + if 'lune_array' in da.attrs: + lune_array = da.attrs['lune_array'] + else: + warn("Focal mechanism tradeoffs not given") + + if show_mt: + # display the beachball the best-fitting moment tensor + # (no other marker) + lune_array = _parse_best_lune(best_vw, lune_array) + best_vw = None + + + backend(filename, + to_gamma(da.coords['v']), + to_delta(da.coords['w']), + da.values.transpose(), + best_vw=best_vw, + lune_array=lune_array, + **kwargs)
+ + +# +# utility functions +# + +def _check(ds): + """ Checks data structures + """ + if type(ds) not in (DataArray, DataFrame, MTUQDataArray, MTUQDataFrame): + raise TypeError("Unexpected grid format") + +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/_modules/mtuq/graphics/uq/vw.html b/_modules/mtuq/graphics/uq/vw.html new file mode 100644 index 000000000..871c3108d --- /dev/null +++ b/_modules/mtuq/graphics/uq/vw.html @@ -0,0 +1,692 @@ + + + + + + + mtuq.graphics.uq.vw — MTUQ Documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +

Source code for mtuq.graphics.uq.vw

+
+# 
+# graphics/uq/vw.py - uncertainty quantification on the v,w rectangle
+#
+
+import numpy as np
+import pandas
+import xarray
+
+from mtuq.grid.moment_tensor import _semiregular
+from mtuq.grid_search import DataArray, DataFrame, MTUQDataArray, MTUQDataFrame
+from mtuq.graphics.uq._gmt import _plot_vw_gmt
+from mtuq.graphics.uq._matplotlib import _plot_vw_matplotlib
+from mtuq.util import dataarray_idxmin, dataarray_idxmax, defaults, product
+from mtuq.util.math import closed_interval, open_interval,\
+    to_v, to_w, to_gamma, to_delta, to_mij, to_Mw
+
+
+#
+# For details about the v,w rectangle see 
+# Tape2015 - A uniform parameterization of moment tensors
+# (https://doi.org/10.1093/gji/ggv262)
+#
+
+v_min = -1./3.
+v_max = +1./3.
+w_min = -3.*np.pi/8.
+w_max = +3.*np.pi/8.
+vw_area = (v_max-v_min)*(w_max-w_min)
+
+
+
+
[docs]def plot_misfit_vw(filename, ds, **kwargs): + """ Plots misfit values on v,w rectangle + + .. rubric :: Required input arguments + + ``filename`` (`str`): + Name of output image file + + ``ds`` (`DataArray` or `DataFrame`): + Data structure containing moment tensors and corresponding misfit values + + + .. rubric :: Optional input arguments + + For optional argument descriptions, + `see here <mtuq.graphics._plot_vw.html>`_ + + """ + defaults(kwargs, { + 'colormap': 'viridis', + }) + + _check(ds) + ds = ds.copy() + + if issubclass(type(ds), DataArray): + misfit = _misfit_vw_regular(ds) + + elif issubclass(type(ds), DataFrame): + misfit = _misfit_vw_random(ds) + + _plot_vw(filename, misfit, **kwargs)
+ + +
[docs]def plot_likelihood_vw(filename, ds, var, **kwargs): + """ Plots maximum likelihood values on v,w rectangle + + .. rubric :: Required input arguments + + ``filename`` (`str`): + Name of output image file + + ``ds`` (`DataArray` or `DataFrame`): + Data structure containing moment tensors and corresponding misfit values + + ``var`` (`float` or `array`): + Data variance + + + .. rubric :: Optional input arguments + + For optional argument descriptions, + `see here <mtuq.graphics._plot_vw.html>`_ + + """ + defaults(kwargs, { + 'colormap': 'hot_r', + }) + + _check(ds) + ds = ds.copy() + + if issubclass(type(ds), DataArray): + likelihoods = _likelihoods_vw_regular(ds, var) + + elif issubclass(type(ds), DataFrame): + likelihoods = _likelihoods_vw_random(ds, var) + + _plot_vw(filename, likelihoods, **kwargs)
+ + +
[docs]def plot_marginal_vw(filename, ds, var, **kwargs): + """ Plots marginal likelihoods on v,w rectangle + + + .. rubric :: Required input arguments + + ``filename`` (`str`): + Name of output image file + + ``ds`` (`DataArray` or `DataFrame`): + Data structure containing moment tensors and corresponding misfit values + + ``var`` (`float` or `array`): + Data variance + + + .. rubric :: Optional input arguments + + For optional argument descriptions, + `see here <mtuq.graphics._plot_vw.html>`_ + + """ + defaults(kwargs, { + 'colormap': 'hot_r', + }) + + _check(ds) + ds = ds.copy() + + if issubclass(type(ds), DataArray): + marginals = _marginals_vw_regular(ds, var) + + elif issubclass(type(ds), DataFrame): + marginals = _marginals_vw_random(ds, var) + + _plot_vw(filename, marginals, **kwargs)
+ + + +def plot_variance_reduction_vw(filename, ds, data_norm, **kwargs): + """ Plots variance reduction on v,w rectangle + + .. rubric :: Required input arguments + + ``filename`` (`str`): + Name of output image file + + ``ds`` (`DataArray` or `DataFrame`): + Data structure containing moment tensors and corresponding misfit values + + ``var`` (`float` or `array`): + Data variance + + + .. rubric :: Optional input arguments + + For optional argument descriptions, + `see here <mtuq.graphics._plot_vw.html>`_ + + """ + defaults(kwargs, { + 'colormap': 'viridis_r', + }) + + _check(ds) + ds = ds.copy() + + if issubclass(type(ds), DataArray): + variance_reduction = _variance_reduction_vw_regular(ds, data_norm) + + elif issubclass(type(ds), DataFrame): + variance_reduction = _variance_reduction_vw_random(ds, data_norm) + + _plot_vw(filename, variance_reduction, **kwargs) + + + + +
[docs]def _plot_vw(filename, da, show_best=True, show_tradeoffs=False, + backend=_plot_vw_matplotlib, **kwargs): + + """ Plots DataArray values on vw rectangle + + .. rubric :: Keyword arguments + + ``colormap`` (`str`): + Color palette used for plotting values + (choose from GMT or MTUQ built-ins) + + ``show_best`` (`bool`): + Show where best-fitting moment tensor falls on vw rectangle + + ``title`` (`str`): + Optional figure title + + ``backend`` (`function`): + Choose from `_plot_vw_gmt` (default), `plot_vw_matplotlib`, + or user-supplied function + + """ + + best_vw = None + lune_array = None + + if show_best: + if 'best_vw' in da.attrs: + best_vw = da.attrs['best_vw'] + else: + warn("Best-fitting moment tensor not given") + + if show_tradeoffs: + if 'lune_array' in da.attrs: + lune_array = da.attrs['lune_array'] + else: + warn("Focal mechanism tradeoffs not given") + + backend(filename, + da.coords['v'], + da.coords['w'], + da.values.transpose(), + best_vw=best_vw, + lune_array=lune_array, + **kwargs)
+ + +# +# for extracting misfit, variance reduction, or likelihood from +# regularly-spaced grids +# + +def _misfit_vw_regular(da): + """ For each source type, extracts minimum misfit + """ + misfit = da.min(dim=('origin_idx', 'rho', 'kappa', 'sigma', 'h')) + + return misfit.assign_attrs({ + 'best_mt': _min_mt(da), + 'best_vw': _min_vw(da), + 'lune_array': _lune_array(da), + }) + + +def _likelihoods_vw_regular(da, var): + """ For each source type, calculates maximum likelihood value + """ + likelihoods = da.copy() + likelihoods.values = np.exp(-likelihoods.values/(2.*var)) + likelihoods.values /= likelihoods.values.sum() + + likelihoods = likelihoods.max(dim=('origin_idx', 'rho', 'kappa', 'sigma', 'h')) + likelihoods.values /= likelihoods.values.sum() + likelihoods /= vw_area + + return likelihoods.assign_attrs({ + 'best_mt': _min_mt(da), + 'best_vw': _min_vw(da), + 'lune_array': _lune_array(da), + 'maximum_likelihood_estimate': dataarray_idxmax(likelihoods).values(), + }) + + +def _marginals_vw_regular(da, var): + """ For each source type, calculates marginal likelihood value + """ + + likelihoods = da.copy() + likelihoods.values = np.exp(-likelihoods.values/(2.*var)) + likelihoods.values /= likelihoods.values.sum() + + marginals = likelihoods.sum(dim=('origin_idx', 'rho', 'kappa', 'sigma', 'h')) + marginals.values /= marginals.values.sum() + marginals /= vw_area + + return marginals.assign_attrs({ + 'best_vw': _max_vw(marginals), + 'marginal_vw': dataarray_idxmax(marginals).values(), + }) + + +def _magnitudes_vw_regular(da): + """ For each source type, calculates magnitude of best-fitting moment tensor + """ + v = da.coords['v'] + w = da.coords['w'] + + nv = len(v) + nw = len(w) + + misfit = da.min(dim=('origin_idx', 'kappa', 'sigma', 'h')) + magnitudes = np.empty((nv,nw)) + + for iv in range(nv): + for iw in range(nw): + sliced = misfit[:,iv,iw] + argmin = np.argmin(sliced.values, axis=None) + magnitudes[iv,iw] = to_Mw(da['rho'][argmin]) + + magnitudes = DataArray( + dims=('v','w'), + coords=(v,w), + data=magnitudes + ) + + return magnitudes.assign_attrs({ + 'best_mt': _min_mt(da), + 'best_vw': _min_vw(da), + 'lune_array': _lune_array(da), + }) + + +def _variance_reduction_vw_regular(da, data_norm): + """ For each source type, extracts maximum variance reduction + """ + variance_reduction = 1. - da.copy()/data_norm + + variance_reduction = variance_reduction.max( + dim=('origin_idx', 'rho', 'kappa', 'sigma', 'h')) + + # widely-used convention - variance reducation as a percentage + variance_reduction.values *= 100. + + return variance_reduction.assign_attrs({ + 'best_mt': _min_mt(da), + 'best_vw': _min_vw(da), + 'lune_array': _lune_array(da), + }) + + +def _lune_array(da): + """ For each source type, keeps track of best-fitting moment tensor + """ + nv = len(da.coords['v']) + nw = len(da.coords['w']) + + lune_array = np.empty((nv*nw,6)) + for iv in range(nv): + for iw in range(nw): + sliced = da[:,iv,iw,:,:,:,:] + argmin = np.argmin(sliced.values, axis=None) + idx = np.unravel_index(argmin, np.shape(sliced)) + + lune_array[nw*iv+iw,0] = da['rho'][idx[0]] + lune_array[nw*iv+iw,1] = da['v'][iv] + lune_array[nw*iv+iw,2] = da['w'][iw] + lune_array[nw*iv+iw,3] = da['kappa'][idx[1]] + lune_array[nw*iv+iw,4] = da['sigma'][idx[2]] + lune_array[nw*iv+iw,5] = da['h'][idx[3]] + + return lune_array + + +def _min_mt(da): + """ Returns moment tensor vector corresponding to minimum DataArray value + """ + da = dataarray_idxmin(da) + lune_keys = ['rho', 'v', 'w', 'kappa', 'sigma', 'h'] + lune_vals = [da[key].values for key in lune_keys] + return to_mij(*lune_vals) + + +def _max_mt(da): + """ Returns moment tensor vector corresponding to maximum DataArray value + """ + da = dataarray_idxmax(da) + lune_keys = ['rho', 'v', 'w', 'kappa', 'sigma', 'h'] + lune_vals = [da[key].values for key in lune_keys] + return to_mij(*lune_vals) + + +def _min_vw(da): + """ Returns v,w coordinates corresponding to minimum DataArray value + """ + da = dataarray_idxmin(da) + lune_keys = ['v', 'w'] + lune_vals = [da[key].values for key in lune_keys] + return lune_vals + +def _max_vw(da): + """ Returns v,w coordinates corresponding to maximum DataArray value + """ + da = dataarray_idxmax(da) + lune_keys = ['v', 'w'] + lune_vals = [da[key].values for key in lune_keys] + return lune_vals + + +def _product_vw(*arrays, best_vw='max'): + + # evaluates product of arbitrarily many arrays + da = product(*arrays) + + # any previous attributes no longer apply + da = da.assign_attrs({ + 'best_mt': None, + 'best_vw': None, + 'lune_array': None, + 'marginal_vw': None, + }) + + if best_vw=='min': + return da.assign_attrs({'best_vw': _min_vw(da)}) + + elif best_vw=='max': + return da.assign_attrs({'best_vw': _max_vw(da)}) + + else: + return da + + + +# +# for extracting misfit, variance reduction, or likelihood from +# irregularly-spaced grids +# + +def _misfit_vw_random(df, **kwargs): + df = df.copy() + df = df.reset_index() + da = _bin_vw_semiregular(df, lambda df: df.min(), **kwargs) + + return da.assign_attrs({ + 'best_vw': _min_vw(da), + }) + + +def _likelihoods_vw_random(df, var, **kwargs): + df = df.copy() + df = np.exp(-df/(2.*var)) + df = df.reset_index() + + da = _bin_vw_semiregular(df, lambda df: df.max(), **kwargs) + da.values /= da.values.sum() + da.values /= vw_area + + return da.assign_attrs({ + 'best_vw': _max_vw(da), + }) + + +def _marginals_vw_random(df, var, **kwargs): + df = df.copy() + df = np.exp(-df/(2.*var)) + df = df.reset_index() + + da = _bin_vw_semiregular(df, lambda df: df.sum()/len(df)) + da.values /= da.values.sum() + da.values /= vw_area + + return da + + +def _variance_reduction_vw_random(df, data_norm, **kwargs): + """ For each source type, extracts minimum misfit + """ + df = df.copy() + df = 1 - df/data_norm + df = df.reset_index() + da = _bin_vw_semiregular(df, lambda df: df.max(), **kwargs) + + return da.assign_attrs({ + 'best_vw': _max_vw(da), + }) + + +# +# bins irregularly-spaced moment tensors into v,w rectangles +# + +def _bin_vw_regular(df, handle, npts_v=20, npts_w=40): + """ Bins irregularly-spaced moment tensors into square v,w cells + """ + # define centers of cells + centers_v = open_interval(-1./3., 1./3., npts_v) + centers_w = open_interval(-3./8.*np.pi, 3./8.*np.pi, npts_w) + + # define corners of cells + v = closed_interval(-1./3., 1./3., npts_v+1) + w = closed_interval(-3./8.*np.pi, 3./8.*np.pi, npts_w+1) + + binned = np.empty((npts_w, npts_v)) + for _i in range(npts_w): + for _j in range(npts_v): + # which grid points lie within cell (i,j)? + subset = df.loc[ + df['v'].between(v[_j], v[_j+1]) & + df['w'].between(w[_i], w[_i+1])] + + binned[_i, _j] = handle(subset[0]) + + return DataArray( + dims=('v', 'w'), + coords=(centers_v, centers_w), + data=binned.transpose() + ) + + +def _bin_vw_semiregular(df, handle, npts_v=20, npts_w=40, tightness=0.6, normalize=False): + """ Bins irregularly-spaced moment tensors into rectangular v,w cells + """ + # at which points will we plot values? + centers_v, centers_w = _semiregular( + npts_v, npts_w, tightness=tightness) + + # what cell edges correspond to the above centers? + centers_gamma = to_gamma(centers_v) + edges_gamma = np.array(centers_gamma[:-1] + centers_gamma[1:])/2. + edges_v = to_v(edges_gamma) + + centers_delta = to_delta(centers_w) + edges_delta = np.array(centers_delta[:-1] + centers_delta[1:])/2. + edges_w = to_w(edges_delta) + + edges_v = np.pad(edges_v, 1) + edges_v[0] = -1./3. + edges_v[-1] = +1./3. + + edges_w = np.pad(edges_w, 1) + edges_w[0] = -3.*np.pi/8. + edges_w[-1] = +3.*np.pi/8 + + + # bin grid points into cells + binned = np.empty((npts_w, npts_v)) + binned[:] = np.nan + for _i in range(npts_w): + for _j in range(npts_v): + # which grid points lie within cell (i,j)? + subset = df.loc[ + df['v'].between(edges_v[_j], edges_v[_j+1]) & + df['w'].between(edges_w[_i], edges_w[_i+1])] + + if len(subset)==0: + print("Encountered empty bin") + + binned[_i, _j] = handle(subset[0]) + + if normalize: + # normalize by area of cell + binned[_i, _j] /= edges_v[_j+1] - edges_v[_j] + binned[_i, _j] /= edges_w[_i+1] - edges_w[_i] + + return DataArray( + dims=('v', 'w'), + coords=(centers_v, centers_w), + data=binned.transpose() + ) + + +# +# utility functions +# + +def _check(ds): + """ Checks data structures + """ + if type(ds) not in (DataArray, DataFrame, MTUQDataArray, MTUQDataFrame): + raise TypeError("Unexpected grid format") + + + + +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/_modules/mtuq/graphics/waveforms.html b/_modules/mtuq/graphics/waveforms.html new file mode 100644 index 000000000..53f21571c --- /dev/null +++ b/_modules/mtuq/graphics/waveforms.html @@ -0,0 +1,728 @@ + + + + + + + mtuq.graphics.waveforms — MTUQ Documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +

Source code for mtuq.graphics.waveforms

+
+#
+# graphics/waveform.py - plots of observed and synthetic waveforms
+#
+
+import numpy as np
+import matplotlib.pyplot as pyplot
+
+from collections import defaultdict
+from matplotlib.font_manager import FontProperties
+from mtuq.dataset import Dataset
+from mtuq.event import MomentTensor, Force
+from mtuq.graphics.annotations import trace_label_writer, station_label_writer,\
+    _getattr
+from mtuq.graphics.header import MomentTensorHeader, ForceHeader
+from mtuq.util import warn
+from mtuq.util.signal import get_components, m_to_deg
+from obspy import Stream, Trace
+
+
+#
+# high-level plotting functions
+#
+
+
[docs]def plot_waveforms1(filename, + data, + synthetics, + stations, + origin, + header=None, + total_misfit=1., + normalize='maximum_amplitude', + trace_label_writer=trace_label_writer, + station_label_writer=station_label_writer, + ): + + """ Creates data/synthetics comparison figure with 3 columns (Z, R, T) + """ + if _isempty(data): + raise Exception + + # how many stations have at least one trace? + nstations = _count([data]) + + # + # initialize figure + # + + fig, axes = _initialize( + nrows=nstations, + ncolumns=4, + column_width_ratios=[1.,1.,1.], + height=1.25*nstations, + width=8.5, + margin_right=0.5, + header=header, + header_height=1.5, + station_labels=bool(station_label_writer), + ) + + _add_component_labels1(axes) + + max_amplitude = _max(data, synthetics) + + # + # loop over stations + # + + ir = 0 + + for _i in range(len(stations)): + + # skip empty stations + if len(data[_i])==0: + continue + + # add station labels + if station_label_writer is not None: + station_label_writer(axes[ir][0], stations[_i], origin) + + # + # plot traces + # + + stream_dat = data[_i] + stream_syn = synthetics[_i] + + for dat in stream_dat: + component = dat.stats.channel[-1].upper() + weight = _getattr(dat, 'weight', 1.) + + if not weight: + continue + + # skip missing components + try: + syn = stream_syn.select(component=component)[0] + except: + warn('Missing component, skipping...') + continue + + _plot_ZRT(axes[ir], 1, dat, syn, component, + normalize, trace_label_writer, max_amplitude, total_misfit) + + ir += 1 + + _save(filename) + pyplot.close()
+ + + +
[docs]def plot_waveforms2(filename, + data_bw, + data_sw, + synthetics_bw, + synthetics_sw, + stations, + origin, + header=None, + total_misfit_bw=1., + total_misfit_sw=1., + normalize='maximum_amplitude', + trace_label_writer=trace_label_writer, + station_label_writer=station_label_writer, + ): + + + """ Creates data/synthetics comparison figure with 5 columns + (Pn Z, Pn R, Rayleigh Z, Rayleigh R, Love T) + """ + # how many stations have at least one trace? + nstations = _count([data_bw, data_sw]) + + # + # initialize figure + # + + fig, axes = _initialize( + nrows=nstations, + ncolumns=6, + column_width_ratios=[0.5,0.5,1.,1.,1.], + height=1.25*nstations, + width=10., + header=header, + header_height=2., + station_labels=bool(station_label_writer), + ) + + _add_component_labels2(axes) + + # determine maximum trace amplitudes + max_amplitude_bw = _max(data_bw, synthetics_bw) + max_amplitude_sw = _max(data_sw, synthetics_sw) + + + # + # loop over stations + # + + ir = 0 + + for _i in range(len(stations)): + + # skip empty stations + if len(data_bw[_i])==len(data_sw[_i])==0: + continue + + # add station labels + if station_label_writer is not None: + station_label_writer(axes[ir][0], stations[_i], origin) + + # + # plot body wave traces + # + + stream_dat = data_bw[_i] + stream_syn = synthetics_bw[_i] + + for dat in stream_dat: + component = dat.stats.channel[-1].upper() + weight = _getattr(dat, 'weight', 1.) + + if not weight: + continue + + # skip missing components + try: + syn = stream_syn.select(component=component)[0] + except: + warn('Missing component, skipping...') + continue + + _plot_ZR(axes[ir], 1, dat, syn, component, + normalize, trace_label_writer, max_amplitude_bw, total_misfit_bw) + + + # + # plot surface wave traces + # + + stream_dat = data_sw[_i] + stream_syn = synthetics_sw[_i] + + for dat in stream_dat: + component = dat.stats.channel[-1].upper() + weight = _getattr(dat, 'weight', 1.) + + if not weight: + continue + + # skip missing components + try: + syn = stream_syn.select(component=component)[0] + except: + warn('Missing component, skipping...') + continue + + _plot_ZRT(axes[ir], 3, dat, syn, component, + normalize, trace_label_writer, max_amplitude_sw, total_misfit_sw) + + + ir += 1 + + _save(filename) + pyplot.close()
+ + +
[docs]def plot_data_greens1(filename, + data, + greens, + process_data, + misfit, + stations, + origin, + source, + source_dict, + **kwargs): + + """ Creates data/synthetics comparison figure with 3 columns (Z, R, T) + + Different input arguments, same result as plot_waveforms1 + """ + + # collect synthetic waveforms with misfit attributes attached + synthetics = misfit.collect_synthetics(data, greens.select(origin), source) + + # calculate total misfit for display in figure header + total_misfit = misfit(data, greens.select(origin), source, optimization_level=0) + + # prepare figure header + if 'header' in kwargs: + header = kwargs.pop('header') + + else: + model = _get_tag(greens[0].tags, 'model') + solver = _get_tag(greens[0].tags, 'solver') + + header = _prepare_header( + model, solver, source, source_dict, origin, + process_data, misfit, total_misfit) + + plot_waveforms1(filename, + data, synthetics, stations, origin, + header=header, total_misfit=total_misfit, **kwargs)
+ + +
[docs]def plot_data_greens2(filename, + data_bw, + data_sw, + greens_bw, + greens_sw, + process_data_bw, + process_data_sw, + misfit_bw, + misfit_sw, + stations, + origin, + source, + source_dict, + **kwargs): + + """ Creates data/synthetics comparison figure with 5 columns + (Pn Z, Pn R, Rayleigh Z, Rayleigh R, Love T) + + Different input arguments, same result as plot_waveforms2 + """ + + # collect synthetic waveforms with misfit attributes attached + synthetics_bw = misfit_bw.collect_synthetics( + data_bw, greens_bw.select(origin), source) + + synthetics_sw = misfit_sw.collect_synthetics( + data_sw, greens_sw.select(origin), source) + + + # calculate total misfit for display in figure header + total_misfit_bw = misfit_bw( + data_bw, greens_bw.select(origin), source, optimization_level=0) + + total_misfit_sw = misfit_sw( + data_sw, greens_sw.select(origin), source, optimization_level=0) + + + # prepare figure header + if 'header' in kwargs: + header = kwargs.pop('header') + + else: + model = _get_tag(greens_sw[0].tags, 'model') + solver = _get_tag(greens_sw[0].tags, 'solver') + + header = _prepare_header( + model, solver, source, source_dict, origin, + process_data_bw, process_data_sw, + misfit_bw, misfit_sw, total_misfit_bw, total_misfit_sw) + + plot_waveforms2(filename, + data_bw, data_sw, synthetics_bw, synthetics_sw, stations, origin, + total_misfit_bw=total_misfit_bw, total_misfit_sw=total_misfit_sw, + header=header, **kwargs)
+ + + +# +# low-level plotting utilities +# + + +def _initialize(nrows=None, ncolumns=None, column_width_ratios=None, + header=None, height=None, width=None, margin_top=0.25, margin_bottom=0.25, + margin_left=0.25, margin_right=0.25, header_height=1.5, + station_labels=True, station_label_width=0.5): + + if header: + height += header_height + + if not station_labels: + station_label_width = 0. + + height += margin_bottom + height += margin_top + width += margin_left + width += margin_right + + fig, axes = pyplot.subplots(nrows, ncolumns, + figsize=(width, height), + subplot_kw=dict(clip_on=False), + gridspec_kw=dict(width_ratios=[station_label_width]+column_width_ratios) + ) + + pyplot.subplots_adjust( + left=margin_left/width, + right=1.-margin_right/width, + bottom=margin_bottom/height, + top=1.-(header_height+margin_top)/height, + wspace=0., + hspace=0., + ) + + _hide_axes(axes) + + if header: + header.write( + header_height, width, + margin_left, margin_top) + + # single station plotting workaround + if nrows==1: + axes = [axes] + + return fig, axes + + +def _plot_ZRT(axes, ic, dat, syn, component, + normalize='maximum_amplitude', trace_label_writer=None, + max_amplitude=1., total_misfit=1.): + + # plot traces + if component=='Z': + axis = axes[ic+0] + elif component=='R': + axis = axes[ic+1] + elif component=='T': + axis = axes[ic+2] + else: + return + + _plot(axis, dat, syn) + + # normalize amplitude + if normalize=='trace_amplitude': + max_trace = _max(dat, syn) + ylim = [-1.5*max_trace, +1.5*max_trace] + axis.set_ylim(*ylim) + elif normalize=='station_amplitude': + max_stream = _max(stream_dat, stream_syn) + ylim = [-1.5*max_stream, +1.5*max_stream] + axis.set_ylim(*ylim) + elif normalize=='maximum_amplitude': + ylim = [-0.75*max_amplitude, +0.75*max_amplitude] + axis.set_ylim(*ylim) + + if trace_label_writer is not None: + trace_label_writer(axis, dat, syn, total_misfit) + + +def _plot_ZR(axes, ic, dat, syn, component, + normalize='maximum_amplitude', trace_label_writer=None, + max_amplitude=1., total_misfit=1.): + + # plot traces + if component=='Z': + axis = axes[ic+0] + elif component=='R': + axis = axes[ic+1] + else: + return + + _plot(axis, dat, syn) + + # normalize amplitude + if normalize=='trace_amplitude': + max_trace = _max(dat, syn) + ylim = [-1.5*max_trace, +1.5*max_trace] + axis.set_ylim(*ylim) + elif normalize=='station_amplitude': + max_stream = _max(stream_dat, stream_syn) + ylim = [-1.5*max_stream, +1.5*max_stream] + axis.set_ylim(*ylim) + elif normalize=='maximum_amplitude': + ylim = [-0.75*max_amplitude, +0.75*max_amplitude] + axis.set_ylim(*ylim) + + + if trace_label_writer is not None: + trace_label_writer(axis, dat, syn, total_misfit) + + +def _plot(axis, dat, syn, label=None): + """ Plots data and synthetics time series on current axes + """ + t1,t2,nt,dt = _time_stats(dat) + + # which start and stop indices will correctly align synthetics? + start = _getattr(syn, 'idx_start', 0) + stop = _getattr(syn, 'idx_stop', len(syn.data)) + + t = np.linspace(0,t2-t1,nt,dt) + d = dat.data + s = syn.data + + axis.plot(t, d, 'k', linewidth=1.5, + clip_on=False, zorder=10) + axis.plot(t, s[start:stop], 'r', linewidth=1.25, + clip_on=False, zorder=10) + + +def _add_component_labels1(axes, body_wave_labels=True, surface_wave_labels=True): + """ Displays component name above each column + """ + font = FontProperties() + font.set_weight('bold') + + ax = axes[0][1] + pyplot.text(0.,0.70, 'Z', fontproperties=font, fontsize=16, + transform=ax.transAxes) + + ax = axes[0][2] + pyplot.text(0.,0.70, 'R', fontproperties=font, fontsize=16, + transform=ax.transAxes) + + ax = axes[0][3] + pyplot.text(0.,0.70, 'T', fontproperties=font, fontsize=16, + transform=ax.transAxes) + + +def _add_component_labels2(axes, body_wave_labels=True, surface_wave_labels=True): + """ Displays component name above each column + """ + font = FontProperties() + font.set_weight('bold') + + ax = axes[0][1] + pyplot.text(0.,0.70, 'Z', fontproperties=font, fontsize=16, + transform=ax.transAxes) + + ax = axes[0][2] + pyplot.text(0.,0.70, 'R', fontproperties=font, fontsize=16, + transform=ax.transAxes) + + ax = axes[0][3] + pyplot.text(0.,0.70, 'Z', fontproperties=font, fontsize=16, + transform=ax.transAxes) + + ax = axes[0][4] + pyplot.text(0.,0.70, 'R', fontproperties=font, fontsize=16, + transform=ax.transAxes) + + ax = axes[0][5] + pyplot.text(0.,0.70, 'T', fontproperties=font, fontsize=16, + transform=ax.transAxes) + + +# +# utility functions +# + +def _time_stats(trace): + # returns time scheme + return ( + float(trace.stats.starttime), + float(trace.stats.endtime), + trace.stats.npts, + trace.stats.delta, + ) + + +def _count(datasets): + # counts number of nonempty streams in dataset(s) + count = 0 + for streams in zip(*datasets): + for stream in streams: + if len(stream) > 0: + count += 1 + break + return count + + +def _isempty(dataset): + if not dataset: + return True + else: + return bool(_count([dataset])==0) + + +def _max(dat, syn): + if type(dat)==type(syn)==Trace: + return max( + abs(dat.max()), + abs(syn.max())) + + elif type(dat)==type(syn)==Stream: + return max( + max(map(abs, dat.max())), + max(map(abs, syn.max()))) + + elif type(dat)==type(syn)==Dataset: + return max( + abs(dat.max()), + abs(syn.max())) + + else: + raise TypeError + + + +def _hide_axes(axes): + # hides axes lines, ticks, and labels + for row in axes: + for col in row: + col.spines['top'].set_visible(False) + col.spines['right'].set_visible(False) + col.spines['bottom'].set_visible(False) + col.spines['left'].set_visible(False) + col.get_xaxis().set_ticks([]) + col.get_yaxis().set_ticks([]) + col.patch.set_visible(False) + + +def _prepare_header(model, solver, source, source_dict, origin, *args): + # prepares figure header + + if len(args)==3: + args = [None, args[0], None, args[1], 0., args[2]] + + if type(source)==MomentTensor: + return MomentTensorHeader( + *args, model, solver, source, source_dict, origin) + + elif type(source)==Force: + return ForceHeader( + *args, model, solver, source, source_dict, origin) + + else: + raise TypeError + + +def _save(filename): + pyplot.savefig(filename) + + +def _get_tag(tags, pattern): + for tag in tags: + parts = tag.split(':') + if parts[0]==pattern: + return parts[1] + else: + return None + + +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/_modules/mtuq/greens_tensor/base.html b/_modules/mtuq/greens_tensor/base.html new file mode 100644 index 000000000..da31f5eaf --- /dev/null +++ b/_modules/mtuq/greens_tensor/base.html @@ -0,0 +1,629 @@ + + + + + + + mtuq.greens_tensor.base — MTUQ Documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +

Source code for mtuq.greens_tensor.base

+
+import numpy as np
+import warnings
+
+from copy import copy, deepcopy
+from mtuq.event import Origin
+from mtuq.station import Station
+from mtuq.dataset import Dataset
+from mtuq.util.signal import check_time_sampling
+from obspy.core import Stream, Trace
+from obspy.geodetics import gps2dist_azimuth
+from scipy.signal import fftconvolve
+
+
+
[docs]class GreensTensor(Stream): + """ Holds multiple time series corresponding to the independent elements + of an elastic Green's tensor + + .. note:: + + Besides the methods below, `GreensTensor` includes many useful + data processing methods inherited from ``obspy.core.Stream``. See + `ObsPy documentation <https://docs.obspy.org/packages/autogen/obspy.core.stream.Stream.html>`_ + for more information. + + """ + def __init__(self, + traces=None, + station=None, + origin=None, + id=None, + tags=[], + include_mt=True, + include_force=False): + """ Constructor method + """ + + # argument checking starts now + for trace in traces: + assert isinstance(trace, Trace) + + assert check_time_sampling(traces), NotImplementedError( + "Time sampling differs from trace to trace.") + + super(GreensTensor, self).__init__(traces) + + if not isinstance(station, Station): + raise TypeError + + if not isinstance(origin, Origin): + raise TypeError + + # the main work of the constructor starts now + if id: + self.id = id + else: + self.id = station.id + + self.station = station.copy() + self.origin = origin.copy() + self.tags = tags + self.include_mt = include_mt + self.include_force = include_force + + self.distance_in_m, self.azimuth, _ = gps2dist_azimuth( + origin.latitude, + origin.longitude, + station.latitude, + station.longitude) + + +
[docs] def _set_components(self, components): + """ Gets called before or during `get_synthetics` to specify which + components are returned + + .. note: + + Sometimes it makes sense to call this method partway through a + script. For example, if all three componets are originally present + at a particular station but the transerve component is later + discovered to be bad, calling ``_set_components(['Z', 'R'])`` + would remove it + + """ + if hasattr(self, 'components') and\ + self.components==components: + # components already set + return + + if components is None: + components = [] + + for component in components: + assert component in ['Z', 'R', 'T'] + + self.components = components + + self._preallocate() + self._precompute()
+ + +
[docs] def _preallocate(self): + """ Preallocates structures used by `get_synthetics` + + .. note: + + Every time ``get_synthetics(inplace=True)`` is called, the numeric + trace data get overwritten. Every time ``_set_components`` is + called, the traces get overwritten. The stream itself never gets + overwritten. + """ + nc, nr, nt = self._get_shape() + + # allocate NumPy array to hold Green's function time series + self._array = np.zeros((nc, nr, nt)) + + # allocate ObsPy structures to hold synthetics + self._synthetics = self._allocate_stream()
+ + +
[docs] def _precompute(self): + """ Precomputes NumPy array used by `get_synthetics` + """ + # the formulas relating the original time series to the linear + # combination array vary depending on the scheme being used, so + # are deferred to the subclass + raise NotImplementedError("Must be implemented by subclass.")
+ + +
[docs] def _get_shape(self): + """ Returns shape of NumPy array used by `get_synthetics` + """ + nt = len(self[0].data) + nc = len(self.components) + nr = 0 + + if self.include_mt: + nr += 6 + if self.include_force: + nr+= 3 + + return nc, nr, nt
+ + +
[docs] def _allocate_stream(self, stats=None): + """ Allocates ObsPy stream used by `get_synthetics` + """ + nc, nr, nt = self._get_shape() + + if not stats: + stats = [] + for component in self.components: + stats += [self[0].stats.copy()] + stats[-1].update({'npts': nt, 'channel': component}) + + stream = Stream() + for _i, component in enumerate(self.components): + # add trace object + stream += Trace(np.zeros(nt), stats[_i]) + + return stream
+ + + +
[docs] def get_synthetics(self, source, components=None, stats=None, inplace=False): + """ Generates synthetics through a linear combination of time series + + Returns an ObsPy stream + + .. rubric :: Input arguments + + ``source`` (`MomentTensor`, `Force` or `CompositeSource`): + Source object + + ``components`` (`list`): + List containing zero or more of the following components: + ``Z``, ``R``, ``T``. (Defaults to ``['Z', 'R', 'T']``.) + + """ + + if components is None: + # Components argument was not given, so check that attribute is + # already set + assert(hasattr(self, 'components')) + + else: + self._set_components(components) + + # arrays used in linear combination + source = source.as_vector() + array = self._array + + if inplace: + synthetics = self._synthetics + else: + synthetics = self._allocate_stream(stats) + + for _i, component in enumerate(self.components): + # Even with careful attention to index order, np.dot is very slow. + # For some reason the following is faster + data = synthetics[_i].data + data[:] = 0. + for _j in range(len(source)): + data += source[_j]*array[_i, _j, :] + return synthetics
+ + +
[docs] def convolve(self, wavelet): + """ Convolves time series with given wavelet + + Returns MTUQ `GreensTensor` + + .. rubric :: Input arguments + + ``wavelet`` (`Wavelet` object): + Source wavelet + + """ + for trace in self: + wavelet.convolve(trace)
+ + +
[docs] def select(self, component=None, channel=None): + """ Selects time series that match the supplied metadata criteria + """ + return Stream([trace for trace in self]).select( + component=component, channel=channel)
+ + + def __add__(self, *args): + raise Exception("Adding time series to an existing GreensTensor is " + " not currently supported") + + + def __iadd__(self, *args): + raise Exception("Adding time series to an existing GreensTensor is " + " not currently supported")
+ + + +
[docs]class GreensTensorList(list): + """ Container for one or more `GreensTensor` objects + """ + + def __init__(self, tensors=[], id=None, tags=[]): + # typically the id is the event name or origin time + self.id = id + + for tensor in tensors: + self.append(tensor) + + for tag in copy(tags): + self.tag_add(tag) + + +
[docs] def append(self, tensor): + """ Appends `GreensTensor` to the container + """ + if not hasattr(tensor, 'station'): + raise Exception("GreensTensor lacks station metadata") + + elif not hasattr(tensor, 'origin'): + raise Exception("GreensTensor lacks origin metadata") + + super(GreensTensorList, self).append(tensor)
+ + +
[docs] def select(self, selector): + """ Selects `GreensTensors` that match the given station or origin + """ + if type(selector) is Station: + selected = self.__class__(id=self.id, tensors=filter( + lambda tensor: tensor.station==selector, self)) + + elif type(selector) is Origin: + selected = self.__class__(id=self.id, tensors=filter( + lambda tensor: tensor.origin==selector, self)) + + else: + raise TypeError("Bad selector: %s" % type(selector).__name__) + + if len(selected)==0: + if len(self) > 0: + warnings.warn("Nothing found matching given selector " + "(%s)\n" % type(selector).__name__) + + return selected
+ + +
[docs] def get_synthetics(self, source, components=None, stats=None, mode='apply', **kwargs): + """ Generates synthetics through a linear combination of time series + + Returns an MTUQ `Dataset` + + .. rubric :: Input arguments + + ``source`` (`MomentTensor`, `Force` or `CompositeSource`): + Source object + + ``components`` (`list`): + List containing zero or more of the following components: + ``Z``, ``R``, ``T``. (Defaults to ``['Z', 'R', 'T']``.) + + """ + if mode=='map': + synthetics = Dataset() + for _i, tensor in enumerate(self): + synthetics.append(tensor.get_synthetics( + source, components=components[_i], stats=stats[_i], **kwargs)) + return synthetics + + elif mode=='apply': + synthetics = Dataset() + for tensor in self: + synthetics.append(tensor.get_synthetics( + source, components=components, stats=stats, **kwargs)) + return synthetics + + else: + raise ValueError
+ + + # the next three methods can be used to apply signal processing or other + # operations to all time series in all GreensTensors +
[docs] def apply(self, function, *args, **kwargs): + """ Applies function to all `GreensTensors` + + Applies a function to each `GreensTensor` in the list, similar to the + Python built-in ``apply``. + + .. warning :: + + Although ``apply`` returns a new `GreensTensorList`, contents of the + original `GreensTensorList` may still be overwritten, depending on + the function. To preserve the original, consider making a + `copy` first. + + """ + processed = [] + for tensor in self: + processed += [function(tensor, *args, **kwargs)] + + return self.__class__(processed)
+ + +
[docs] def map(self, function, *sequences): + """ Maps function to all `GreensTensors` + + Maps a function to each `GreensTensor` in the list. If one or more + optional sequences are given, the function is called with an argument + list consisting of the corresponding item of each sequence, similar + to the Python built-in ``map``. + + .. warning :: + + Although ``map`` returns a new `GreensTensorList`, contents of the + original `GreensTensorList` may still be overwritten, depending on + the function. To preserve the original, consider making a + `copy` first. + + """ + processed = [] + for _i, tensor in enumerate(self): + args = [sequence[_i] for sequence in sequences] + processed += [function(tensor, *args)] + + return self.__class__(processed)
+ + +
[docs] def parallel_map(self, function, *sequences): + """ Version of `map` parallelized using mpi4py + + Maps a function to each `GreensTensor` in the list. If one or more + optional sequences are given, the function is called with an argument + list consisting of the corresponding item of each sequence, similar + to the Python built-in ``map``. + + .. warning :: + + Although ``map`` returns a new `GreensTensorList`, contents of the + original `GreensTensorList` may still be overwritten, depending on + the function. To preserve the original, consider making a + `copy` first. + + """ + from mpi4py import MPI + # Create a list of lists, where each sublist contains the indices of tensors that will be distributed to one process + num_tensors = len(self) + num_processes = MPI.COMM_WORLD.Get_size() + + if (num_tensors < num_processes): + raise ValueError("Number of tensors must be greater or equal to number of processes") + + # Distribute the indices over the available processes + tensor_indices = np.arange(num_tensors) + local_tensor_indices = np.array_split(tensor_indices, num_processes)[MPI.COMM_WORLD.Get_rank()] + + # Create a list of lists, where each sublist contains the tensors that will be distributed to one process + local_tensors = [] + for i in local_tensor_indices: + local_tensors.append(self[i]) + + # Apply function to each of the tensor lists, and gather them onto process 0 to return a new list + local_results = [] + for _i, tensor in enumerate(local_tensors): + args = [sequence[_i] for sequence in sequences] + + # Apply function to each of the tensor lists and gather the results onto process 0 to return a new list + local_results += [function(tensor, *args)] + + # Gather the results onto process 0 to return a new list of lists + global_results = MPI.COMM_WORLD.gather(local_results, root=0) + if MPI.COMM_WORLD.Get_rank() == 0: + final_list = [] + for list in global_results: + final_list += list + + if (MPI.COMM_WORLD.Get_rank() == 0): + return self.__class__(final_list)
+ + +
[docs] def convolve(self, wavelet): + """ Convolves time series with given wavelet + + Returns MTUQ `GreensTensorList` + + .. rubric :: Input arguments + + ``wavelet`` (`Wavelet` object): + Source wavelet + + """ + for tensor in self: + tensor.convolve(wavelet)
+ + +
[docs] def tag_add(self, tag): + """ Appends string to tags list + + Tags can be used to support customized uses, such as storing metdata not + included in ``mtuq.Station`` + """ + if type(tag) not in [str, unicode]: + raise TypeError + + for tensor in self: + if tag not in tensor.tags: + tensor.tags.append(tag)
+ + +
[docs] def tag_remove(self, tag): + """ Removes string from tags list + """ + for tensor in self: + if tag in tensor.tags: + tensor.tags.remove(tag)
+ + +
[docs] def sort_by_distance(self, reverse=False): + """ Sorts in-place by hypocentral distance + """ + self.sort_by_function(lambda stream: stream.distance, + reverse=reverse)
+ + +
[docs] def sort_by_azimuth(self, reverse=False): + """ Sorts in-place by source-receiver azimuth + """ + self.sort_by_function(lambda stream: stream.azimuth, + reverse=reverse)
+ + +
[docs] def sort_by_function(self, function, reverse=False): + """ Sorts in-place by user-supplied function + """ + self.sort(key=function, reverse=reverse)
+ + + def __copy__(self): + try: + new_id = self.id+'_copy' + except: + new_id = None + + new_ds = type(self)(id=new_id) + for stream in self: + new_ds.append(deepcopy(stream)) + return new_ds + + +
[docs] def copy(self): + return self.__copy__()
+ + +
[docs] def write(self, filename): + """ Writes a Python pickle of current `GreensTensorList` + """ + with open(filename, "wb") as file: + pickle.dump(self, file)
+ + +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/_modules/mtuq/grid/base.html b/_modules/mtuq/grid/base.html new file mode 100644 index 000000000..c8466e046 --- /dev/null +++ b/_modules/mtuq/grid/base.html @@ -0,0 +1,527 @@ + + + + + + + mtuq.grid.base — MTUQ Documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +

Source code for mtuq.grid.base

+
+
+import numpy as np
+
+from builtins import object
+from pandas import DataFrame
+from xarray import DataArray
+
+from mtuq.util import asarray
+
+
+
+
[docs]class Grid(object): + """ + A regularly-spaced grid defined by values along axes + + .. rubric:: Examples + + To cover the unit square with an `N`-by-`N` rectangular grid: + + .. code :: + + x = np.linspace(0., 1., N) + y = np.linspace(0., 1., N) + grid = Grid(dims=('x', 'y'), coords=(x, y)) + + + To parameterize the surface of the Earth with an `N`-by-`2N` Mercator grid: + + .. code :: + + lat = np.linspace(-90., 90., N) + lon = np.linspace(-180., 180., 2*N) + grid = Grid(dims=('lat', 'lon'), coords=(lat, lon)) + + + .. rubric:: Iterating over grids + + Iterating over a grid is similar to iterating over a multidimensional + NumPy array. The order of grid points is determined by the order of axes + used to create the grid. For instance, in the unit square example above, + ``'x'`` is the slow axis and ``'y'`` is the fast axis. + + If ``start`` and ``stop`` arguments are given when creating a grid, + iteration will begin and end at these indices. Otherwise, iteration will + begin at the first index (`i=0`) and stop at the last index. + + + .. rubric:: Accessing individual grid points + + Individual grid points can be accessed through the ``get`` and ``get_dict`` + methods. + + ``get(i)`` returns the `i`-th grid point as a NumPy array. + + If a ``callback`` function was given when creating the grid, then ``get`` + returns the result of applying the callback to the `i`-th grid point. This + behavior can be overridden by supplying a callback function as a keyword + argument to ``get`` itself. If ``callback`` is ``None``, then no function + is applied. + + ``get_dict(i)`` returns the `i`-th grid point as a dictionary of coordinate + axis names and coordinate values without applying any callback. + + """ + def __init__(self, dims=None, coords=None, start=0, stop=None, callback=None): + # list of axis names + self.dims = dims + + # corresponding list of axis coordinates + self.coords = list(map(asarray, coords)) + + # what is the length along each axis? + shape = [] + for array in self.coords: + shape += [len(array)] + + # what attributes would the grid have if stored as a numpy array? + self.ndim = len(shape) + self.shape = tuple(shape) + + # what part of the grid do we want to iterate over? + self.start = start + if stop: + self.stop = stop + self.size = stop-start + else: + self.stop = np.product(shape) + self.size = np.product(shape)-start + self.index = start + + self.callback = callback + + +
[docs] def to_array(self): + """ Returns the entire set of grid points as a NumPy array + """ + array = np.zeros((self.size, self.ndim)) + for _i in range(self.size): + array[_i, :] = self.get(_i+self.start, callback=None) + return array
+ + +
[docs] def to_dataarray(self, values=None): + """ Returns the entire set of grid points as an `xarray.DataArray` + """ + if values is None: + values = np.empty(self.shape) + values[:] = np.nan + + if values.size != self.size: + raise Exception("Mismatch between values and grid shape") + + if values.shape != self.shape: + values = np.reshape(values, self.shape) + + return DataArray(data=values, dims=self.dims, coords=self.coords)
+ + +
[docs] def to_dataframe(self, values=None): + """ Returns the entire set of grid points as a `pandas.DataFrame` + """ + if values is None: + values = np.empty(self.size) + values[:] = np.nan + + if values.size != self.size: + raise Exception("Mismatch between values and grid shape") + + array = self.to_array() + data_vars = {self.dims[_i]: array[:, _i] + for _i in range(self.ndim)} + data_vars.update({'values': values}) + + return DataFrame(data_vars)
+ + +
[docs] def get(self, i, **kwargs): + """ Returns `i`-th grid point + + .. rubric:: callback functions + + If a ``callback`` function was given when creating a grid, then + ``get`` returns the result of applying the callback to the + `i`-th grid point. This behavior can be overridden by supplying a + callback function as a keyword argument to ``get`` itself. + If ``callback`` is ``None``, then no function is applied. + """ + # optionally override default callback + if 'callback' in kwargs: + callback = kwargs['callback'] + else: + callback = self.callback + + vals = self.coords + array = np.zeros(self.ndim) + + for _k in range(self.ndim-1, -1, -1): + val = vals[_k] + array[_k] = val[int(i%len(val))] + i/=len(val) + + if callback: + return callback(*array) + else: + return array
+ + +
[docs] def get_dict(self, i): + """ Returns `i`-th grid point grid as a dictionary of parameter names + and values + """ + keys = self.dims + vals = self.get(i, callback=None) + + return dict(zip(keys, vals))
+ + +
[docs] def partition(self, nproc): + """ Partitions grid for parallel processing + """ + if self.start!=0: + raise Exception + + subsets = [] + for iproc in range(nproc): + start = int(iproc*self.size/nproc) + stop = int((iproc+1)*self.size/nproc) + + subsets += [Grid( + self.dims, self.coords, start, stop, callback=self.callback)] + return subsets
+ + + def __len__(self): + return self.size + + + + # the next two methods make it possible to iterate over the grid + def __next__(self): + """ Advances iteration index + """ + if self.index < self.stop: + # get the i-th point in grid + p = self.get(self.index) + else: + self.index = self.start + raise StopIteration + self.index += 1 + return p + + + def __iter__(self): + return self
+ + + + +
[docs]class UnstructuredGrid(object): + """ + An `UnstructuredGrid` is defined by lists of individual coordinate points, + which can be irregularly spaced + + .. rubric:: Example + + Unstructured grid consisting of `N` randomly-chosen points within the unit + square: + + .. code :: + + x = np.random.rand(N) + y = np.random.rand(N) + grid = UnstructuredGrid(dims=('x', 'y'), coords=(x, y)) + + + .. rubric:: Iterating over grids + + Iterating over an unstructured grid is similar to iterating over a list. + + If ``start`` and ``stop`` arguments are given when creating an unstructured + grid, iteration will begin and end at these indices. Otherwise, iteration + will begin at the first index (`i=0`) and stop at the last index. + + + .. rubric:: Accessing individual grid points + + Individual grid points can be accessed through the ``get`` and ``get_dict`` + methods. + + ``get(i)`` returns the `i`-th grid point as a NumPy array. + + If a ``callback`` function is given when creating an unstructured grid, then + ``get`` returns the result of applying the callback to the `i`-th grid point. + This behavior can be overridden by supplying a callback function as a + keyword argument to ``get`` itself. If ``callback`` is ``None``, then no + function is applied. + + ``get_dict(i)`` returns the `i`-th grid point as a dictionary of coordinate + axis names and coordinate values without applying any callback. + + + """ + def __init__(self, dims=None, coords=None, start=0, stop=None, callback=None): + # list of parameter names + self.dims = dims + + # corresponding list of parameter values + self.coords = list(map(asarray, coords)) + + # there is no shape attribute because it is an unstructured grid, + # however, ndim and size still make sense + self.ndim = len(self.dims) + size = len(self.coords[0]) + + # check consistency + for array in self.coords: + assert len(array) == size + + # what part of the grid do we want to iterate over? + self.start = start + if stop: + self.stop = stop + self.size = stop-start + else: + self.stop = size + self.size = size-start + + self.index = start + + # optional map from one parameterization to another + self.callback = callback + + +
[docs] def to_array(self): + """ Returns the entire set of grid points as a NumPy array + """ + array = np.zeros((self.size, self.ndim)) + for _i in range(self.size): + array[_i, :] = self.get(_i+self.start, callback=None) + return array
+ + +
[docs] def to_dataframe(self, values=None): + """ Returns the entire set of grid points as a `pandas.DataFrame` + """ + if values is None: + values = np.empty(self.size) + values[:] = np.nan + + if values.size != self.size: + raise Exception("Mismatch between values and grid shape") + + data_vars = {self.dims[_i]: self.coords[_i] + for _i in range(self.ndim)} + + data_vars.update({'values': values}) + + return DataFrame(data_vars)
+ + +
[docs] def get(self, i, **kwargs): + """ Returns `i`-th grid point + + .. rubric:: callback functions + + If a ``callback`` function was given when creating a grid, then + ``get`` returns the result of applying the callback to the + `i`-th grid point. This behavior can be overridden by supplying a + callback function as a keyword argument to ``get`` itself. + If ``callback`` is ``None``, then no function is applied. + + """ + # optionally override default callback + if 'callback' in kwargs: + callback = kwargs['callback'] + else: + callback = self.callback + + i -= self.start + vals = self.coords + array = np.zeros(self.ndim) + + for _k in range(self.ndim): + array[_k] = vals[_k][i] + + if callback: + return callback(*array) + else: + return array
+ + +
[docs] def get_dict(self, i): + """ Returns `i`-th grid point as a dictionary of parameter names and + values + """ + keys = self.dims + vals = self.get(i, callback=None) + + return dict(zip(keys, vals))
+ + +
[docs] def partition(self, nproc): + """ Partitions grid for parallel processing + """ + subsets = [] + for iproc in range(nproc): + start = int(iproc*self.size/nproc) + stop = int((iproc+1)*self.size/nproc) + + coords = [] + for array in self.coords: + coords += [array[start:stop]] + subsets += [UnstructuredGrid( + self.dims, coords, start, stop, callback=self.callback)] + + return subsets
+ + + def __len__(self): + return self.size + + + # the next two methods make it possible to iterate over the grid + def __next__(self): + """ Advances iteration index + """ + if self.index < self.stop: + # get the i-th point in grid + p = self.get(self.index) + else: + self.index = self.start + raise StopIteration + self.index += 1 + return p + + + def __iter__(self): + return self
+
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/_modules/mtuq/grid/force.html b/_modules/mtuq/grid/force.html new file mode 100644 index 000000000..55b08848b --- /dev/null +++ b/_modules/mtuq/grid/force.html @@ -0,0 +1,201 @@ + + + + + + + mtuq.grid.force — MTUQ Documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +

Source code for mtuq.grid.force

+
+import numpy as np
+
+from numpy.random import uniform as random
+
+from mtuq.event import Force
+from mtuq.grid import Grid, UnstructuredGrid
+from mtuq.util import asarray
+from mtuq.util.math import open_interval as regular
+from mtuq.util.math import to_rtp
+
+
+#
+# see here for usage and other practical information
+# https://uafgeotools.github.io/mtuq/user_guide/06/moment_tensor_and_force_grids.html
+#
+
+
+
[docs]def ForceGridRegular(magnitudes_in_N=1., npts_per_axis=80): + """ Force grid with regularly-spaced values + + Given input parameters ``magnitudes_in_N`` (`list`) and + ``npts_per_axis`` (`int`), returns a ``Grid`` of size + `len(magnitudes_in_N)*npts_per_axis^2`. + + """ + phi = regular(0., 360., npts_per_axis) + h = regular(-1., 1., npts_per_axis) + F0 = asarray(magnitudes_in_N) + + return Grid( + dims=('F0', 'phi', 'h'), + coords=(F0, phi, h), + callback=to_force)
+ + +
[docs]def ForceGridRandom(magnitudes_in_N=1., npts=10000): + """ Force grid with randomly-spaced values + + Given input parameters ``magnitudes_in_N`` (`list`) and + ``npts`` (`int`), returns an ``UnstructuredGrid`` of size + `npts*len(magnitudes_in_N)`. + + """ + phi = random(0., 360., npts) + h = random(-1., 1., npts) + F0 = asarray(magnitudes_in_N) + + phi = np.tile(phi, len(magnitudes_in_N)) + h = np.tile(h, len(magnitudes_in_N)) + F0 = np.repeat(F0, npts) + + return UnstructuredGrid( + dims=('F0', 'phi', 'h'), + coords=(F0, phi, h), + callback=to_force)
+ + +# +# utility functions +# + +def to_force(F0, phi, h): + """ Converts from spherical coordinates to Force object + + .. note:: + + - `phi` is measured in degrees counterclockwise from east + + """ + rtp = to_rtp(F0, phi, h) + return Force(rtp, convention='USE') + +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/_modules/mtuq/grid/moment_tensor.html b/_modules/mtuq/grid/moment_tensor.html new file mode 100644 index 000000000..f1cd731d2 --- /dev/null +++ b/_modules/mtuq/grid/moment_tensor.html @@ -0,0 +1,393 @@ + + + + + + + mtuq.grid.moment_tensor — MTUQ Documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +

Source code for mtuq.grid.moment_tensor

+
+import numpy as np
+
+from numpy import pi
+from numpy.random import uniform as random
+
+from mtuq.event import Force, MomentTensor
+from mtuq.grid import Grid, UnstructuredGrid
+from mtuq.util import asarray
+from mtuq.util.math import open_interval as regular
+from mtuq.util.math import open_interval, closed_interval,\
+   to_delta, to_gamma, to_mij, to_rho, to_v, to_w
+
+
+#
+# see here for usage and other practical information
+# https://uafgeotools.github.io/mtuq/user_guide/06/moment_tensor_and_force_grids.html
+#
+
+
[docs]def FullMomentTensorGridRandom(magnitudes=[1.], npts=1000000): + """ Grid with randomly-drawn full moment tensors + + Given input parameters ``magnitudes`` (`list`) and ``npts`` (`int`), + returns an ``UnstructuredGrid`` of size `npts*len(magnitudes)`. + + """ + + v = random(-1./3., 1./3., npts) + w = random(-3./8.*pi, 3./8.*pi, npts) + kappa = random(0., 360, npts) + sigma = random(-90., 90., npts) + h = random(0., 1., npts) + rho = list(map(to_rho, asarray(magnitudes))) + + v = np.tile(v, len(magnitudes)) + w = np.tile(w, len(magnitudes)) + kappa = np.tile(kappa, len(magnitudes)) + sigma = np.tile(sigma, len(magnitudes)) + h = np.tile(h, len(magnitudes)) + rho = np.repeat(rho, npts) + + return UnstructuredGrid( + dims=('rho', 'v', 'w', 'kappa', 'sigma', 'h'), + coords=(rho, v, w, kappa, sigma, h), + callback=to_mt)
+ + +
[docs]def FullMomentTensorGridSemiregular(magnitudes=[1.], npts_per_axis=20, + tightness=0.8, uniformity=0.8): + """ Grid with regularly-spaced full moment tensors + + Given input parameters ``magnitudes`` (`list`) and ``npts`` (`int`), + returns a ``Grid`` of roughly size `2*len(magnitudes)*npts_per_axis^5`. + + The grid is `semiregular` in the sense of an interpolation between + two parameterizations. `See here + <mtuq.grid.moment_tensor._semiregular.html>`_ for details. + + """ + v, w = _semiregular(npts_per_axis, 2*npts_per_axis + 1, tightness, uniformity) + + kappa = regular(0., 360, npts_per_axis) + sigma = regular(-90., 90., npts_per_axis) + h = regular(0., 1., npts_per_axis) + rho = list(map(to_rho, asarray(magnitudes))) + + return Grid( + dims=('rho', 'v', 'w', 'kappa', 'sigma', 'h'), + coords=(rho, v, w, kappa, sigma, h), + callback=to_mt)
+ + +
[docs]def DeviatoricGridRandom(magnitudes=[1.], npts=100000): + """ Grid with randomly-drawn deviatoric moment tensors + + Given input parameters ``magnitudes`` (`list`) and ``npts`` (`int`), + returns an ``UnstructuredGrid`` of size `npts*len(magnitudes)`. + + """ + + v = random(-1./3., 1./3., npts) + w = np.zeros(npts) + kappa = random(0., 360, npts) + sigma = random(-90., 90., npts) + h = random(0., 1., npts) + rho = list(map(to_rho, asarray(magnitudes))) + + v = np.tile(v, len(magnitudes)) + w = np.tile(w, len(magnitudes)) + kappa = np.tile(kappa, len(magnitudes)) + sigma = np.tile(sigma, len(magnitudes)) + h = np.tile(h, len(magnitudes)) + rho = np.repeat(rho, npts) + + return UnstructuredGrid( + dims=('rho', 'v', 'w', 'kappa', 'sigma', 'h'), + coords=(rho, v, w, kappa, sigma, h), + callback=to_mt)
+ + + +
[docs]def DeviatoricGridSemiregular(magnitudes=[1.], npts_per_axis=20, + tightness=0.8, uniformity=0.8): + """ Grid with reguarly-spaced deviatoric moment tensors + + Given input parameters ``magnitudes`` (`list`) and ``npts`` (`int`), + returns a ``Grid`` of size `len(magnitudes)*npts_per_axis^4`. + + The grid is `semiregular` in the sense of an interpolation between + two parameterizations. `See here + <mtuq.grid.moment_tensor._semiregular.html>`_ for details. + + """ + + v, _ = _semiregular(npts_per_axis, 1, tightness, uniformity) + w = 0 + + kappa = regular(0., 360, npts_per_axis) + sigma = regular(-90., 90., npts_per_axis) + h = regular(0., 1., npts_per_axis) + rho = list(map(to_rho, asarray(magnitudes))) + + return Grid( + dims=('rho', 'v', 'w', 'kappa', 'sigma', 'h'), + coords=(rho, v, w, kappa, sigma, h), + callback=to_mt)
+ + +
[docs]def DoubleCoupleGridRandom(magnitudes=[1.], npts=50000): + """ Grid with randomly-drawn double couple moment tensors + + Given input parameters ``magnitudes`` (`list`) and ``npts`` (`int`), + returns an ``UnstructuredGrid`` of size `npts*len(magnitudes)`. + + """ + v = np.zeros(npts) + w = np.zeros(npts) + kappa = random(0., 360, npts) + sigma = random(-90., 90., npts) + h = random(0., 1., npts) + rho = list(map(to_rho, asarray(magnitudes))) + + v = np.tile(v, len(magnitudes)) + w = np.tile(w, len(magnitudes)) + kappa = np.tile(kappa, len(magnitudes)) + sigma = np.tile(sigma, len(magnitudes)) + h = np.tile(h, len(magnitudes)) + rho = np.repeat(rho, npts) + + return UnstructuredGrid( + dims=('rho', 'v', 'w', 'kappa', 'sigma', 'h'), + coords=(rho, v, w, kappa, sigma, h), + callback=to_mt)
+ + +
[docs]def DoubleCoupleGridRegular(magnitudes=[1.], npts_per_axis=40): + """ Grid with reguarly-spaced double couple moment tensors + + Given input parameters ``magnitudes`` (`list`) and ``npts`` (`int`), + returns a ``Grid`` of size `len(magnitudes)*npts_per_axis^3`. + + """ + v = 0. + w = 0. + + kappa = regular(0., 360, npts_per_axis) + sigma = regular(-90., 90., npts_per_axis) + h = regular(0., 1., npts_per_axis) + rho = list(map(to_rho, asarray(magnitudes))) + + return Grid( + dims=('rho', 'v', 'w', 'kappa', 'sigma', 'h'), + coords=(rho, v, w, kappa, sigma, h), + callback=to_mt)
+ + +# +# utility functions +# + +def to_mt(rho, v, w, kappa, sigma, h): + """ Converts from lune parameters to MomentTensor object + """ + mt = to_mij(rho, v, w, kappa, sigma, h) + return MomentTensor(mt, convention='USE') + + +
[docs]def _semiregular(npts_v, npts_w, tightness=0.8, uniformity=0.8): + """ Returns coordinate vectors along the `v, w` axes + + .. rubric :: Keyword arguments + + ``tightness`` (`float`): + Value in range `[0,1)` that controls how close the extremal points lie to the + boundary of the `v, w` rectangle + + + ``uniformity`` (`float`): + Value in range `[0,1]` that controls the spacing between points + + - For `uniformity=0`, the spacing will be regular in `Tape2012 + <https://uafgeotools.github.io/mtuq/references.html>`_ parameters + `delta`, `gamma`, which is good for avoiding distortion near the upper + and lower edges. + - For `uniformity=1`, the spacing will be regular in `Tape2015 + <https://uafgeotools.github.io/mtuq/references.html>`_ parameters `v, w`, + which means that points are uniformly-spaced in terms of moment tensor + Frobenius norms. + - For intermediate values, the spacing will be `semiregular` in the sense of + a linear interpolation between the above cases. + + """ + assert 0. <= tightness < 1.,\ + Exception("Allowable range: 0. < tightness < 1.") + + assert 0. <= uniformity <= 1.,\ + Exception("Allowable range: 0. <= uniformity <= 1.") + + + v1 = (tightness * closed_interval(-1./3., 1./3., npts_v) + + (1.-tightness) * open_interval(-1./3., 1./3., npts_v)) + + w1 = (tightness * closed_interval(-3./8.*np.pi, 3./8.*np.pi, npts_w) + + (1.-tightness) * open_interval(-3./8.*np.pi, 3./8.*np.pi, npts_w)) + + gamma2 = (tightness * closed_interval(-30., 30., npts_v) + + (1.-tightness) * open_interval(-30, 30., npts_v)) + + delta2 = (tightness * closed_interval(-90., 90., npts_w) + + (1.-tightness) * open_interval(-90, 90., npts_w)) + + delta = to_delta(w1)*(1.-uniformity) + delta2*uniformity + gamma = to_gamma(v1)*(1.-uniformity) + gamma2*uniformity + + return to_v(gamma), to_w(delta)
+ + +# +# deprecated +# + +def FullMomentTensorPlottingGrid(magnitudes=[1.], npts_per_axis=11): + # depracated now that separate tightness and uniformity options have been + # added to FullMomentTensorGridSemiregular + + v1, v2, nv = -30, 30, 13 + w1, w2, nw = -1, 1, 35 + dv = (v2-v1)/nv + dw = (w2-w1)/nw + v = np.arange((v1+dv/2), (v2-dv/2), dv) + w = np.arange((w1+dw/2), (w2+dw/2), dw) + gamma = v + delta = np.arcsin(w)*(180/pi) + v,w = to_v(gamma), to_w(delta) + + kappa = regular(0., 360, npts_per_axis) + sigma = regular(-90., 90., npts_per_axis) + h = regular(0., 1., npts_per_axis) + rho = list(map(to_rho, asarray(magnitudes))) + + return Grid( + dims=('rho', 'v', 'w', 'kappa', 'sigma', 'h'), + coords=(rho, v, w, kappa, sigma, h), + callback=to_mt) + +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/_modules/mtuq/grid_search.html b/_modules/mtuq/grid_search.html new file mode 100644 index 000000000..47a2c8e61 --- /dev/null +++ b/_modules/mtuq/grid_search.html @@ -0,0 +1,522 @@ + + + + + + + mtuq.grid_search — MTUQ Documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +

Source code for mtuq.grid_search

+
+import h5py
+import netCDF4
+import numpy as np
+import pandas
+import xarray
+
+from collections.abc import Iterable
+from mtuq.event import Origin
+from mtuq.grid import DataFrame, DataArray, Grid, UnstructuredGrid
+from mtuq.util import gather2, iterable, timer, remove_list, warn,\
+    ProgressCallback, dataarray_idxmin, dataarray_idxmax
+from os.path import splitext
+from xarray.core.formatting import unindexed_dims_repr
+
+
+xarray.set_options(keep_attrs=True)
+
+
+
+
+
+
+@timer
+def _grid_search_serial(data, greens, misfit, origins, sources, 
+    timed=True, msg_interval=25):
+    """ Evaluates misfit over origin and source grids 
+    (serial implementation)
+    """
+    ni = len(origins)
+    nj = len(sources)
+
+    values = []
+    for _i, origin in enumerate(origins):
+
+        msg_handle = ProgressCallback(
+            start=_i*nj, stop=ni*nj, percent=msg_interval)
+
+        # evaluate misfit function
+        values += [misfit(
+            data, greens.select(origin), sources, msg_handle)]
+
+    # returns NumPy array of shape `(len(sources), len(origins))` 
+    return np.concatenate(values, axis=1)
+
+
+
+
[docs]class MTUQDataArray(xarray.DataArray): + """ Data structure for storing values on regularly-spaced grids + + .. note:: + + Besides the methods below, `MTUQDataArray` includes many useful methods + inherited from ``xarray.DataArray``. See + `xarray documentation <http://xarray.pydata.org/en/stable/generated/xarray.DataArray.html>`_ + for more information. + + """ + +
[docs] def origin_idxmin(self): + """ Returns `origins` index corresponding to minimum misfit + """ + return int(dataarray_idxmin(self)['origin_idx'])
+ +
[docs] def source_idxmin(self): + """ Returns `sources` index corresponding to minimum misfit + """ + shape = self._get_shape() + return np.unravel_index(self.argmin(), shape)[0]
+ +
[docs] def _get_shape(self): + """ Private helper method + """ + nn = len(self.coords['origin_idx']) + return (int(self.size/nn), nn)
+ +
[docs] def save(self, filename, *args, **kwargs): + """ Saves grid search results to NetCDF file + """ + print(' saving NetCDF file: %s' % filename) + self.to_netcdf(filename)
+ + def __repr__(self): + summary = [ + 'Summary:', + ' grid shape: %s' % self.shape.__repr__(), + ' grid size: %d' % self.size, + ' mean: %.3e' % np.mean(self.values), + ' std: %.3e' % np.std(self.values), + ' min: %.3e' % self.values.min(), + ' max: %.3e' % self.values.max(), + '', + ] + + if hasattr(self, "coords"): + if self.coords: + summary.append(repr(self.coords)) + + unindexed_dims_str = unindexed_dims_repr(self.dims, self.coords) + if unindexed_dims_str: + summary.append(unindexed_dims_str) + + return "\n".join(summary+[''])
+ + + +
[docs]class MTUQDataFrame(pandas.DataFrame): + """ Data structure for storing values on irregularly-spaced grids + + .. note:: + + Besides the methods below, `MTUQDataFrame` includes many useful methods + inherited from ``pandas.DataFrame``. See `pandas documentation + <https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html>`_ + for more information. + + """ +
[docs] def origin_idxmin(self): + """ Returns coordinates corresponding to minimum misfit + """ + df = self.reset_index() + return df['origin_idx'][df[0].idxmin()]
+ +
[docs] def source_idxmin(self): + """ Returns coordinates corresponding to minimum misfit + """ + df = self.reset_index() + return df['source_idx'][df[0].idxmin()]
+ +
[docs] def save(self, filename, *args, **kwargs): + """ Saves grid search results to HDF5 file + """ + print(' saving HDF5 file: %s' % filename) + df = pandas.DataFrame(self.values, index=self.index) + df.to_hdf(filename, key='df', mode='w')
+ + @property + def _constructor(self): + return MTUQDataFrame
+ + +# +# utility functions +# + +def _is_mpi_env(): + try: + import mpi4py + except ImportError: + return False + + try: + import mpi4py.MPI + except ImportError: + return False + + if mpi4py.MPI.COMM_WORLD.Get_size()>1: + return True + else: + return False + + +def _to_dataarray(origins, sources, values): + """ Converts grid_search inputs to DataArray + """ + origin_dims = ('origin_idx',) + origin_coords = [np.arange(len(origins))] + origin_shape = (len(origins),) + + source_dims = sources.dims + source_coords = sources.coords + source_shape = sources.shape + + return MTUQDataArray(**{ + 'data': np.reshape(values, source_shape + origin_shape), + 'coords': source_coords + origin_coords, + 'dims': source_dims + origin_dims, + }) + + +def _to_dataframe(origins, sources, values, index_type=2): + """ Converts grid_search inputs to DataFrame + """ + if len(origins)*len(sources) > 1.e7: + print(" pandas indexing becomes very slow with >10 million rows\n" + " consider using index_type=1 in mtuq.grid_search._to_dataframe\n" + ) + + origin_idx = np.arange(len(origins), dtype='int') + source_idx = np.arange(len(sources), dtype='int') + + # Cartesian products + origin_idx = list(np.repeat(origin_idx, len(sources))) + source_idx = list(np.tile(source_idx, len(origins))) + source_coords = [] + for _i, coords in enumerate(sources.coords): + source_coords += [list(np.tile(coords, len(origins)))] + + # assemble coordinates + coords = [origin_idx, source_idx] + dims = ('origin_idx', 'source_idx') + if index_type==2: + coords += source_coords + dims += sources.dims + + # construct DataFrame + data = {dims[_i]: coords[_i] for _i in range(len(dims))} + data.update({0: values.flatten()}) + df = MTUQDataFrame(data=data) + df = df.set_index(list(dims)) + return df + + +# +# I/O functions +# + +
[docs]def open_ds(filename, format=None): + """ Reads grid search results from disk + + .. rubric :: Parameters + + ``filename`` (`str`): + File containing grid search results + + ``format`` (`str`): + File format ('NetCDF' or 'HDF5') + + """ + if not format: + # try to determine file format, if not given + if h5py.is_hdf5(filename): + format = 'HDF' + else: + try: + netCDF.Dataset(filename, "r") + format = 'NETCDF4' + except: + raise Exception('File format not recognized: %s' % filename) + + if format.upper() in ['H5', 'HDF','HDF5']: + return _open_df(filename) + + elif format.upper() in ['NC', 'NC4', 'NETCDF', 'NETCDF4']: + return _open_da(filename) + + else: + raise Exception('File format not supported: %s' % filename)
+ + +def _open_da(filename): + """ Reads MTUQDataArray from NetCDF file + """ + da = xarray.open_dataarray(filename) + return MTUQDataArray(data=da.values, coords=da.coords, dims=da.dims) + + +def _open_df(filename): + """ Reads MTUQDataFrame from HDF5 file + """ + df = pandas.read_hdf(filename) + return MTUQDataFrame(df.values, index=df.index) + +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/_modules/mtuq/io/clients/AxiSEM_NetCDF.html b/_modules/mtuq/io/clients/AxiSEM_NetCDF.html new file mode 100644 index 000000000..4a27da8f4 --- /dev/null +++ b/_modules/mtuq/io/clients/AxiSEM_NetCDF.html @@ -0,0 +1,289 @@ + + + + + + + mtuq.io.clients.AxiSEM_NetCDF — MTUQ Documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +

Source code for mtuq.io.clients.AxiSEM_NetCDF

+
+try:
+    import instaseis
+except:
+    pass
+
+import obspy
+import numpy as np
+
+from obspy.core import Stream
+from os.path import basename
+from mtuq.greens_tensor.AxiSEM import GreensTensor
+from mtuq.io.clients.base import Client as ClientBase
+from mtuq.util.signal import get_distance_in_deg, resample
+
+
+
+
[docs]class Client(ClientBase): + """ + AxiSEM NetCDF database client (based on `instaseis <https://instaseis.net/>`_) + + + .. rubric:: Usage + + To instantiate a database client, supply a path or url: + + .. code:: + + from mtuq.io.clients.AxiSEM_NetCDF import Client + db = Client(path_or_url) + + Then the database client can be used to generate GreensTensors: + + .. code:: + + greens_tensors = db.get_greens_tensors(stations, origin) + + + .. note:: + + For instructions on creating AxiSEM NetCDF databases, see + `AxiSEM user manual - Output wavefields in netcdf format needed for Instaseis + <https://raw.githubusercontent.com/geodynamics/axisem/master/MANUAL/manual_axisem1.3.pdf>`_ + + """ + + def __init__(self, path_or_url='', model='', kernelwidth=12, + include_mt=True, include_force=False): + + if not path_or_url: + raise Exception + self.db = instaseis.open_db(path_or_url) + self.kernelwidth=12 + + if not model: + model = path_or_url + self.model = model + + self.include_mt = include_mt + self.include_force = include_force + + +
[docs] def get_greens_tensors(self, stations=[], origins=[], verbose=False): + """ Extracts Green's tensors from database + + Returns a ``GreensTensorList`` in which each element corresponds to a + (station, origin) pair from the given lists + + .. rubric :: Input arguments + + ``stations`` (`list` of `mtuq.Station` objects) + + ``origins`` (`list` of `mtuq.Origin` objects) + + ``verbose`` (`bool`) + """ + return super(Client, self).get_greens_tensors(stations, origins, verbose)
+ + +
[docs] def _get_greens_tensor(self, station=None, origin=None): + + stream = Stream() + + if self.include_mt: + stream += self.db.get_greens_function( + epicentral_distance_in_degree=get_distance_in_deg(station, origin), + source_depth_in_m=origin.depth_in_m, + origin_time=origin.time, + kind='displacement', + kernelwidth=self.kernelwidth, + definition='seiscomp') + + if self.include_force: + receiver = _get_instaseis_receiver(station) + + for _i, force in enumerate([{'f_r': 1.}, {'f_t': 1.}, {'f_p': 1.}]): + stream += self.db.get_seismograms( + source=_get_instaseis_source(origin, **force), + receiver=receiver, + components=['Z','R','T'], + kind='displacement', + kernelwidth=self.kernelwidth) + + stream[-3].stats.channel = "Z"+str(_i) + stream[-2].stats.channel = "R"+str(_i) + stream[-1].stats.channel = "T"+str(_i) + + + # what are the start and end times of the data? + t1_new = float(station.starttime) + t2_new = float(station.endtime) + dt_new = float(station.delta) + + # what are the start and end times of the Green's function? + trace = stream[0] + t1_old = float(trace.stats.starttime) + t2_old = float(trace.stats.endtime) + dt_old = float(trace.stats.delta) + + for trace in stream: + trace.stats._component = trace.stats.channel[0] + + # resample Green's functions + data_old = trace.data + data_new = resample(data_old, t1_old, t2_old, dt_old, + t1_new, t2_new, dt_new) + trace.data = data_new + trace.stats.starttime = t1_new + trace.stats.delta = dt_new + + tags = [ + 'model:%s' % self.model, + 'solver:%s' % 'AxiSEM', + ] + + return GreensTensor(traces=[trace for trace in stream], + station=station, origin=origin, tags=tags, + include_mt=self.include_mt, include_force=self.include_force)
+ + + +# +# utility functions +# + +def _get_instaseis_source(origin, **kwargs): + return instaseis.ForceSource( + origin.latitude, + origin.longitude, + depth_in_m=origin.depth_in_m, + origin_time=origin.time, + **kwargs) + +def _get_instaseis_receiver(station): + return instaseis.Receiver( + station.latitude, + station.longitude, + network=station.network, + station=station.station, + location=station.location) + +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/_modules/mtuq/io/clients/FK_SAC.html b/_modules/mtuq/io/clients/FK_SAC.html new file mode 100644 index 000000000..9acb0d759 --- /dev/null +++ b/_modules/mtuq/io/clients/FK_SAC.html @@ -0,0 +1,296 @@ + + + + + + + mtuq.io.clients.FK_SAC — MTUQ Documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +

Source code for mtuq.io.clients.FK_SAC

+
+import obspy
+import numpy as np
+
+from os.path import basename, exists
+from mtuq.greens_tensor.FK import GreensTensor 
+from mtuq.io.clients.base import Client as ClientBase
+from mtuq.util.signal import resample
+from obspy.core import Stream
+from obspy.geodetics import gps2dist_azimuth
+
+
+# An FK simulation outputs 12 SAC files each with filename extensions
+# 0,1,2,3,4,5,6,7,8,9,a,b.  The SAC files ending in .2 and .9 contain 
+# only zero data, so we exclude them from the following list. 
+# The order of traces in the list is the order in which CAP stores
+# the time series.
+EXTENSIONS = [
+    '8','5',           # t
+    'b','7','4','1',   # r
+    'a','6','3','0',   # z
+    ]
+
+CHANNELS = [
+    'TSS', 'TDS',
+    'REP', 'RSS', 'RDS', 'RDD',
+    'ZEP', 'ZSS', 'ZDS', 'ZDD',
+    ]
+
+
+
+
+
[docs]class Client(ClientBase): + """ FK database client + + .. rubric:: Usage + + To instantiate a database client, supply a path or url: + + .. code:: + + from mtuq.io.clients.FK_SAC import Client + db = Client(path_or_url) + + Then the database client can be used to generate GreensTensors: + + .. code:: + + greens_tensors = db.get_greens_tensors(stations, origin) + + + .. note:: + + `GreensTensor`s are obtained by reading precomputed time series from an + FK directory tree. Such trees contain SAC files organized by model, + event depth, and event distance, as used by the `Zhu1994` + software packages. + + """ + def __init__(self, path_or_url=None, model=None, + include_mt=True, include_force=False): + + if not path_or_url: + raise Exception + + if not exists(path_or_url): + raise Exception + + if include_force: + raise NotImplementedError + + if not model: + model = basename(path_or_url) + + # path to fk directory tree + self.path = path_or_url + + # model from which fk Green's functions were computed + self.model = model + + self.include_mt = include_mt + self.include_force = include_force + + + +
[docs] def get_greens_tensors(self, stations=[], origins=[], verbose=False): + """ Extracts Green's tensors from database + + Returns a ``GreensTensorList`` in which each element corresponds to a + (station, origin) pair from the given lists + + .. rubric :: Input arguments + + ``stations`` (`list` of `mtuq.Station` objects) + + ``origins`` (`list` of `mtuq.Origin` objects) + + ``verbose`` (`bool`) + + """ + return super(Client, self).get_greens_tensors(stations, origins, verbose)
+ + +
[docs] def _get_greens_tensor(self, station=None, origin=None): + if station is None: + raise Exception("Missing station input argument") + + if origin is None: + raise Exception("Missing station input argument") + + traces = [] + + distance_in_m, _, _ = gps2dist_azimuth( + origin.latitude, + origin.longitude, + station.latitude, + station.longitude) + + # what are the start and end times of the data? + t1_new = float(station.starttime) + t2_new = float(station.endtime) + dt_new = float(station.delta) + + #dep = str(int(round(origin.depth_in_m/1000.))) + dep = str(int(np.ceil(origin.depth_in_m/1000.))) + #dst = str(int(round(distance_in_m/1000.))) + dst = str(int(np.ceil(distance_in_m/1000.))) + + if self.include_mt: + + for _i, ext in enumerate(EXTENSIONS): + trace = obspy.read('%s/%s_%s/%s.grn.%s' % + (self.path, self.model, dep, dst, ext), + format='sac')[0] + + trace.stats.channel = CHANNELS[_i] + trace.stats._component = CHANNELS[_i][0] + + + # what are the start and end times of the Green's function? + t1_old = float(origin.time)+float(trace.stats.starttime) + t2_old = float(origin.time)+float(trace.stats.endtime) + dt_old = float(trace.stats.delta) + data_old = trace.data + + # resample Green's function + data_new = resample(data_old, t1_old, t2_old, dt_old, + t1_new, t2_new, dt_new) + trace.data = data_new + # convert from 10^-20 dyne to N^-1 + trace.data *= 1.e-15 + trace.stats.starttime = t1_new + trace.stats.delta = dt_new + + traces += [trace] + + tags = [ + 'model:%s' % self.model, + 'solver:%s' % 'FK', + ] + + return GreensTensor(traces=[trace for trace in traces], + station=station, origin=origin, tags=tags, + include_mt=self.include_mt, include_force=self.include_force)
+ + + + +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/_modules/mtuq/io/clients/SPECFEM3D_SGT.html b/_modules/mtuq/io/clients/SPECFEM3D_SGT.html new file mode 100644 index 000000000..be797a50a --- /dev/null +++ b/_modules/mtuq/io/clients/SPECFEM3D_SGT.html @@ -0,0 +1,316 @@ + + + + + + + mtuq.io.clients.SPECFEM3D_SGT — MTUQ Documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +

Source code for mtuq.io.clients.SPECFEM3D_SGT

+
+import os.path
+import seisgen
+import obspy
+import numpy as np
+import pickle
+
+from mtuq.greens_tensor.SPECFEM3D import GreensTensor
+from mtuq.io.clients.base import Client as ClientBase
+from mtuq.util.signal import resample
+
+
+
[docs]class Client(ClientBase): + """ SPECFEM3D strain Green's tensor database client based on `seisgen + <https://github.com/Liang-Ding/seisgen>`_ + + .. rubric:: Usage + + To instantiate a database client, supply a path or url: + + .. code:: + + from mtuq.io.clients.SPECFEM3D_SGT import Client + db = Client(path_or_url) + + Then the database client can be used to generate GreensTensors: + + .. code:: + + greens_tensors = db.get_greens_tensors(stations, origin) + + + .. note :: + + For instructions on creating SPECFEM3D/3D_GLOBE strain Green's tensor + databases, see `seisgen documentation + <https://github.com/Liang-Ding/seisgen>`_ + + + """ + + def __init__(self, path_or_url=None, model=None, + include_mt=True, include_force=False): + + self.path = path_or_url + + if not model: + model = path_or_url + self.model = model + + self.include_mt = include_mt + self.include_force = include_force + + self.b_initial_db = False + self.b_new_origin = True + self.origin = 0 + +
[docs] def set_local_db(self, sgt_database_folder, model3D_folder, info_grid_file): + """ Set and utilize the local database. """ + try: + self.sgtMgr = seisgen.DSGTMgr(sgt_database_folder, model3D_folder, info_grid_file) + self.b_initial_db = True + except: + raise Exception
+ +
[docs] def set_remote_db(self): + """ Set and utilize the remote database. """ + raise NotImplementedError
+ + +
[docs] def get_greens_tensors(self, stations=[], origins=[], verbose=False): + """ Extracts Green's tensors from database + + Returns a ``GreensTensorList`` in which each element corresponds to a + (station, origin) pair from the given lists + + .. rubric :: Input arguments + + ``stations`` (`list` of `mtuq.Station` objects) + + ``origins`` (`list` of `mtuq.Origin` objects) + + ``verbose`` (`bool`) + + """ + return super(Client, self).get_greens_tensors(stations, origins, verbose)
+ + +
[docs] def _get_greens_tensor(self, station=None, origin=None): + if station is None: + raise Exception("Missing station input argument") + + if origin is None: + raise Exception("Missing station input argument") + + if self.include_mt: + # Check if the Green's Function (GF) exists, + # Read from the PKL file storing the GF or generate from SGT. + + prefix = station.id + data_type = '3DGF' + fmt = 'PKL' + GF_name = '%s.%.6f.%.6f.%.2f.%s.%s' % (prefix, + np.round(origin.latitude, 6), + np.round(origin.longitude, 6), + np.round(origin.depth_in_m, 2), + data_type, + fmt) + GF_file_path = os.path.join(str(self.path), str(GF_name)) + + b_exist = False + b_generate = True + try: + b_exist = os.path.exists(GF_file_path) + except: + b_exist = False + + if b_exist: + try: + with open(GF_file_path, 'rb') as f: + stream = pickle.load(f) + b_generate = False + except: + b_exist = False + b_generate = True + try: + os.remove(GF_file_path) + except: + pass + + if b_generate: + # Generate Green's function from SGT. + if not self.b_initial_db: + raise Exception + + if not self.b_new_origin: + try: + for key in ('latitude','longitude','depth_in_m','elevation_in_m'): + assert origin[key] == self.origin[key] + except: + self.b_new_origin = True + + stream = self.sgtMgr.get_greens_function(station, origin, b_new_origin=self.b_new_origin) + + if self.b_new_origin: + self.origin = origin + self.b_new_origin = False + + try: + # save the GF as pickle file for future use. + with open(GF_file_path, 'wb') as f: + pickle.dump(stream, f) + except: + print("! Unable to dump Green's function at {}.".format(GF_file_path)) + + + if self.include_force: + raise NotImplementedError + + + # what are the start and end times of the data? + t1_new = float(station.starttime) + t2_new = float(station.endtime) + dt_new = float(station.delta) + + # what are the start and end times of the Green's function? + t1_old = float(origin.time) + float(stream[0].stats.starttime) + t2_old = float(origin.time) + float(stream[0].stats.endtime) + dt_old = float(stream[0].stats.delta) + + for trace in stream: + # resample Green's functions + data_old = trace.data + data_new = resample(data_old, t1_old, t2_old, dt_old, + t1_new, t2_new, dt_new) + trace.data = data_new + trace.stats.starttime = t1_new + trace.stats.delta = dt_new + trace.stats.npts = len(data_new) + + tags = [ + 'model:%s' % self.model, + 'solver:%s' % 'SPECFEM3D', + ] + + return GreensTensor(traces=[trace for trace in stream], + station=station, origin=origin, tags=tags, + include_mt=self.include_mt, include_force=self.include_force)
+
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/_modules/mtuq/io/clients/syngine.html b/_modules/mtuq/io/clients/syngine.html new file mode 100644 index 000000000..f2058accd --- /dev/null +++ b/_modules/mtuq/io/clients/syngine.html @@ -0,0 +1,304 @@ + + + + + + + mtuq.io.clients.syngine — MTUQ Documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +

Source code for mtuq.io.clients.syngine

+
+import obspy
+import numpy as np
+import os
+
+from obspy.core import Stream
+from mtuq.greens_tensor.syngine import GreensTensor
+from mtuq.io.clients.base import Client as ClientBase
+from mtuq.util.signal import resample
+from mtuq.util import unzip
+from mtuq.util.syngine import download_unzip_mt_response, download_force_response,\
+     resolve_model,\
+     GREENS_TENSOR_FILENAMES, SYNTHETICS_FILENAMES_BX, SYNTHETICS_FILENAMES_MX
+
+
+
+
[docs]class Client(ClientBase): + """ Syngine web service client + + .. rubric:: Usage + + To instantiate a syngine client, supply a model name from one of the + `available Earth models <http://ds.iris.edu/ds/products/syngine/#models>`_ + + .. code:: + + from mtuq.io.clients.syngine import Client + db = Client(model=model) + + Then the client can be used to download GreensTensors: + + .. code:: + + greens_tensors = db.get_greens_tensors(stations, origin) + + + .. note:: + + Syngine is an webservice that provides Green's functions and synthetic + seismograms for download as compressed SAC files. + + """ + + def __init__(self, path_or_url=None, model=None, + include_mt=True, include_force=False): + + if not path_or_url: + path_or_url = 'http://service.iris.edu/irisws/syngine/1' + self.url = path_or_url + + # Checks against list of currently supported models. If necessary, + # appends required period band suffix + self.model = resolve_model(model) + + self.include_mt = include_mt + self.include_force = include_force + + +
[docs] def get_greens_tensors(self, stations=[], origins=[], verbose=False): + """ Downloads Green's tensors + + Returns a ``GreensTensorList`` in which each element corresponds to a + (station, origin) pair from the given lists + + .. rubric :: Input arguments + + ``stations`` (`list` of `mtuq.Station` objects) + + ``origins`` (`list` of `mtuq.Origin` objects) + + ``verbose`` (`bool`) + + """ + return super(Client, self).get_greens_tensors(stations, origins, verbose)
+ + +
[docs] def _get_greens_tensor(self, station=None, origin=None): + stream = Stream() + + # read time series + stream = Stream() + + if self.include_mt: + dirname = download_unzip_mt_response( + self.url, self.model, station, origin) + + for filename in GREENS_TENSOR_FILENAMES: + stream += obspy.read(dirname+'/'+filename, format='sac') + + if self.include_force: + filenames = download_force_response( + self.url, self.model, station, origin) + + dirnames = [] + for filename in filenames: + dirnames += [unzip(filename)] + + for _i, dirname in enumerate(dirnames): + # Attempt to read using the BX naming convention + files_read = False + for filename in SYNTHETICS_FILENAMES_BX: + file_path = os.path.join(dirname, filename) + if os.path.isfile(file_path): + stream += obspy.read(file_path, format='sac') + stream[-1].stats.channel = stream[-1].stats.channel[-1] + str(_i) + files_read = True + + # If no files were read with the BX naming convention, try the MX naming convention + if not files_read: + for filename in SYNTHETICS_FILENAMES_MX: + file_path = os.path.join(dirname, filename) + if os.path.isfile(file_path): + stream += obspy.read(file_path, format='sac') + stream[-1].stats.channel = stream[-1].stats.channel[-1] + str(_i) + + + + # what are the start and end times of the data? + t1_new = float(station.starttime) + t2_new = float(station.endtime) + dt_new = float(station.delta) + + # what are the start and end times of the Green's function? + t1_old = float(stream[0].stats.starttime) + t2_old = float(stream[0].stats.endtime) + dt_old = float(stream[0].stats.delta) + + for trace in stream: + trace.stats._component = trace.stats.channel[0] + + # resample Green's functions + data_old = trace.data + data_new = resample(data_old, t1_old, t2_old, dt_old, + t1_new, t2_new, dt_new) + trace.data = data_new + trace.stats.starttime = t1_new + trace.stats.delta = dt_new + trace.stats.npts = len(data_new) + + tags = [ + 'model:%s' % self.model, + 'solver:%s' % 'syngine', + ] + + return GreensTensor(traces=[trace for trace in stream], + station=station, origin=origin, tags=tags, + include_mt=self.include_mt, include_force=self.include_force)
+ + + +
[docs]def download_greens_tensors(stations=[], origins=[], model='', verbose=False, **kwargs): + """ Downloads Green's tensors from syngine + + Downloads Green's functions for all combinations of stations and origins + using the `syngine <http://ds.iris.edu/ds/products/syngine/>`_ web service. + Returns an `mtuq.GreensTensorList` of length `len(stations)*len(origins)`. + + + .. rubric :: Input arguments + + + ``stations`` (list of `mtuq.Station` objects): + Stations for which Green's functions will be downloaded + + + ``origins`` (list of `mtuq.Origin` objects): + Origins for which Green's functions will be downloaded + + + ``model`` (str): + Earth model for which Green's functions will be downloaded, from list of + `available models <http://ds.iris.edu/ds/products/syngine/>`_ + + """ + client = Client(model=model, **kwargs) + return client.get_greens_tensors(stations, origins, verbose=verbose)
+
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/_modules/mtuq/io/readers/SAC.html b/_modules/mtuq/io/readers/SAC.html new file mode 100644 index 000000000..0f22de8e3 --- /dev/null +++ b/_modules/mtuq/io/readers/SAC.html @@ -0,0 +1,319 @@ + + + + + + + mtuq.io.readers.SAC — MTUQ Documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +

Source code for mtuq.io.readers.SAC

+
+import glob
+import os
+import numpy as np
+import obspy
+import warnings
+
+from copy import deepcopy
+from os.path import join
+from obspy.core import Stream
+from mtuq import Dataset, Origin, Station
+from mtuq.util import iterable, warn
+from mtuq.util.signal import check_components, check_time_sampling
+
+
+
[docs]def read(filenames, station_id_list=None, event_id=None, tags=[]): + """ + Reads SAC files and returns an `mtuq.Dataset` + + .. rubric :: Parameters + + ``filenames`` (`str` or `list`): + Wildcard string or list of filenames + + ``station_id_list`` (`list`): + Any traces not from one of the listed stations will be excluded + + ``event_id`` (`str`): + Identifier to be suppplied to the Dataset + + ``tags`` (`list`): + Tags to be supplied to the Dataset + + """ + # read traces one at a time + data = Stream() + for filename in _glob(filenames): + try: + data += obspy.read(filename, format='sac') + except: + print('Not a SAC file: %s' % filename) + + assert len(data) > 0, Exception( + "Failed to read in any SAC files.") + + + # sort by station + data_sorted = {} + for trace in data: + station_id = '.'.join(( + trace.stats.network, + trace.stats.station, + trace.stats.location)) + + if station_id not in data_sorted: + data_sorted[station_id] = Stream(trace) + else: + data_sorted[station_id] += trace + + if station_id_list is not None: + keys = list(data_sorted.keys()) + # remove traces not from station_id_list + for station_id in keys: + if station_id not in station_id_list: + data_sorted.pop(station_id) + + streams = [] + for station_id in data_sorted: + streams += [data_sorted[station_id]] + + # check for duplicate components + for stream in streams: + check_components(stream) + + # collect event metadata + preliminary_origin = _get_origin(streams[0], event_id) + for stream in streams: + assert preliminary_origin==_get_origin(stream, event_id) + stream.origin = preliminary_origin + tags += ['origin_type:preliminary'] + + # collect station metadata + for stream in streams: + stream.station = _get_station(stream, preliminary_origin) + + # create MTUQ Dataset + return Dataset(streams, id=event_id, tags=tags)
+ + +def _get_origin(stream, event_id): + """ Extracts event metadata from SAC headers + + At the beginning of an inversion, MTUQ requires preliminary estimates for + event location and depth. We obtain these from SAC headers, which for IRIS + data represent catalog solutions + """ + sac_headers = stream[0].stats.sac + + try: + latitude = sac_headers.evla + longitude = sac_headers.evlo + except (TypeError, ValueError): + warn("Could not determine event location from sac headers. " + "Setting location to nan...") + latitude = np.nan + longitudue = np.nan + + try: + depth_in_m = sac_headers.evdp*1000. + except (TypeError, ValueError): + warn("Could not determine event depth from sac headers. " + "Setting depth to nan...") + depth_in_m = 0. + + try: + origin_time = obspy.UTCDateTime( + year=sac_headers.nzyear, + julday=sac_headers.nzjday, + hour=sac_headers.nzhour, + minute=sac_headers.nzmin, + second=sac_headers.nzsec) + except (TypeError, ValueError): + warn("Could not determine origin time from sac headers. " + "Setting origin time to zero...") + origin_time = obspy.UTCDateTime(0) + + return Origin({ + 'id': event_id, + 'time': origin_time, + 'longitude': longitude, + 'latitude': latitude, + 'depth_in_m': depth_in_m + }) + + +def _get_station(stream, origin, attach_sac_headers=True): + """ Extracts station metadata from SAC headers + """ + # + # extract metadata from ObsPy structures + # + meta = deepcopy(stream[0].meta.__dict__) + + sac_headers = meta.pop('sac') + + # remove channel-specific attributes + for attr in ['channel', 'component']: + if attr in meta: + meta.pop(attr) + + # + # populate station object + # + station = Station(meta) + + station.update({ + 'id': '.'.join([ + stream[0].stats.network, + stream[0].stats.station, + stream[0].stats.location])}) + + try: + station_latitude = sac_headers.stla + station_longitude = sac_headers.stlo + station.update({ + 'latitude': station_latitude, + 'longitude': station_longitude}) + except: + raise Exception( + "Could not determine station location from SAC headers.") + + try: + station.update({ + 'station_elevation_in_m': sac_headers.stel, + 'station_depth_in_m': sac_headers.stdp}) + except: + pass + + if attach_sac_headers: + station.sac = sac_headers + + return station + + +def _glob(filenames): + # glob any wildcards + _list = list() + for filename in iterable(filenames): + _list.extend(glob.glob(filename)) + return sorted(_list) + +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/_modules/mtuq/misfit/polarity.html b/_modules/mtuq/misfit/polarity.html new file mode 100644 index 000000000..4986bbcd0 --- /dev/null +++ b/_modules/mtuq/misfit/polarity.html @@ -0,0 +1,480 @@ + + + + + + + mtuq.misfit.polarity — MTUQ Documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +

Source code for mtuq.misfit.polarity

+
+import numpy as np
+
+import mtuq
+from mtuq.util import AttribDict, Null, iterable, warn
+from mtuq.misfit.waveform.level2 import _to_array, _type
+from obspy.taup import TauPyModel
+from mtuq.util.signal import m_to_deg
+
+
+
[docs]class PolarityMisfit(object): + """ Polarity misfit function + + .. rubric:: Usage + + Evaluating polarity misfit is a two-step procedure. + + First, the user supplies parameters such as the method used to calculate + predicted polarities (see below for detailed parameter descriptions): + + .. code:: + + polarity_misfit = PolarityMisfit(**parameters) + + Second, the user invokes the misfit function: + + .. code:: + + values = polarity_misfit(data, greens, sources) + + During misfit evaluation + + - observed polarities are collected from the `data` argument, which can be + either a list of integers or a `Dataset` with observed polarity values + attached (see convention below for more information) + + - predicted polarities are calculated from the `greens` argument (see + parameter descriptions below for more information) + + - a NumPy array of length `len(sources)` is returned, giving the number of + mismatches between observed and predicted + + + .. rubric:: Parameters + + ``method`` (`str`) + + - ``'taup'`` + Calculate polarities using Taup-P + + - ``'FK_metadata'`` + Read polarities from FK database + + - ``'waveform'`` + Determine polarity from full-waveform synthetics (not implemented yet) + + + .. rubric:: Other input arguments that may be required, depending on the above + + ``taup_model`` (`str`): Name of built-in ObsPy TauP model or path to custom + ObsPy TauP model, required for `method=taup` + + ``FK_database`` (`str`): Path to FK database, required for for `method=FK_metadata`. + + .. note:: + + *Convention* : Positive vertical first motions are encoded as +1 and + negative vertical first motions are encoded as -1. Unpicked or + indeterminate first motions can be encoded as 0. + + """ + + def __init__(self, + method='taup', + taup_model='ak135', + FK_database=None, + FK_model=None, + **parameters): + + if not method: + raise Exception('Undefined parameter: method') + + self.method = method + self.taup_model = taup_model + self.FK_database = FK_database + self.FK_model = FK_model + + + # + # check parameters + # + if self.method == 'taup': + assert self.taup_model is not None + self._taup = TauPyModel(self.taup_model) + + elif self.method == 'FK_metadata': + assert self.FK_database is not None + assert exists(self.FK_database) + if self.FK_model is None: + self.FK_model = basename(self.FK_database) + + else: + raise TypeError('Bad parameter: method') + + + def __call__(self, data, greens, sources, progress_handle=Null(), + set_attributes=False): + + # check input arguments + _check(greens, self.method) + + + # + # evaluate misfit + # + observed = self.get_observed(data) + predicted = self.get_predicted(greens, sources) + + values = np.abs(predicted - observed)/2. + + # mask unpicked + mask = (observed != 0).astype(int) + values = np.dot(values, mask) + + # returns a NumPy array of shape (len(sources), 1) + return values.reshape(len(values), 1) + + +
[docs] def get_observed(self, data): + """ Extracts observed polarities from data + """ + + if isinstance(data, mtuq.Dataset): + observed = np.array([_get_polarity(stream) for stream in data]) + + elif isinstance(data, list): + observed = np.array(data) + + elif isinstance(data, np.ndarray): + observed = data + + else: + raise TypeError + + return observed
+ + +
[docs] def get_predicted(self, greens, sources): + """ Calculates predicted polarities + """ + + if type(sources) == mtuq.MomentTensor: + sources = sources.as_vector().reshape((1,6)) + _calculate = _polarities_mt + + elif type(sources) == mtuq.Force: + raise NotImplementedError + + elif _type(sources.dims) == 'MomentTensor': + sources = _to_array(sources) + _calculate = _polarities_mt + + elif _type(sources.dims) == 'Force': + raise NotImplementedError + else: + raise TypeError + + if self.method=='taup': + takeoff_angles = _takeoff_angles_taup(self._taup, greens) + + azimuths = _get_azimuths(greens) + + predicted = _calculate(sources, takeoff_angles, azimuths) + + elif self.method=='FK_metadata': + takeoff_angles = _takeoff_angles_FK(self.FK_database, greens) + + azimuths = _get_azimuths(greens) + + predicted = _calculate(sources, takeoff_angles, azimuths) + + elif self.method=='waveform': + raise NotImplementedError + + return predicted
+ + +
[docs] def collect_attributes(self, data, greens): + """ Collect polarity-related attributes (used for beachball plots) + """ + + if self.method=='taup': + takeoff_angles = _takeoff_angles_taup( + self._taup, greens) + + elif self.method=='FK_metadata': + takeoff_angles = _takeoff_angles_FK( + self.FK_database, greens) + + observed = self.get_observed(data) + + attrs_list = [] + for _i, greens_tensor in enumerate(greens): + attrs = AttribDict() + + try: + attrs.azimuth = greens_tensor.azimuth + attrs.distance_in_m = greens_tensor.distance_in_m + except: + pass + try: + attrs.network = greens_tensor.station.network + attrs.station = greens_tensor.station.station + attrs.location = greens_tensor.station.location + attrs.latitude = greens_tensor.station.latitude + attrs.longitude = greens_tensor.station.longitude + except: + pass + try: + attrs.takeoff_angle = takeoff_angles[_i] + except: + pass + try: + attrs.polarity = observed[_i] + except: + pass + + attrs_list += [attrs] + + return attrs_list
+ + +def _takeoff_angles_taup(taup, greens): + """ Calculates takeoff angles from Tau-P model + """ + + takeoff_angles = np.zeros(len(greens)) + + for _i, greens_tensor in enumerate(greens): + + depth_in_km = greens_tensor.origin.depth_in_m/1000. + distance_in_deg = m_to_deg(greens_tensor.distance_in_m) + + takeoff_angles[_i] = _takeoff_angle_taup( + taup, depth_in_km, distance_in_deg) + + return takeoff_angles + + +def _takeoff_angle_taup(taup, depth_in_km, distance_in_deg): + + arrivals = taup.get_travel_times( + depth_in_km, distance_in_deg, phase_list=['p', 'P']) + + phases = [] + for arrival in arrivals: + phases += [arrival.phase.name] + + if 'p' in phases: + return arrivals[phases.index('p')].takeoff_angle + + elif 'P' in phases: + return arrivals[phases.index('P')].takeoff_angle + + else: + raise Exception + + +def _polarities_mt(mt_array, takeoff, azimuth): + + n1,n2 = mt_array.shape + if n2!= 6: + raise Exception('Inconsistent dimensions') + + n3,n4 = len(takeoff), len(azimuth) + if n3!=n4: + raise Exception('Inconsistent dimensions') + + # prepare arrays + polarities = np.zeros((n1,n3)) + drc = np.empty((n1, 3)) + takeoff = np.deg2rad(takeoff) + azimuth = np.deg2rad(azimuth) + + for _i, angles in enumerate(zip(takeoff, azimuth)): + sth = np.sin(angles[0]) + cth = np.cos(angles[0]) + sphi = np.sin(angles[1]) + cphi = np.cos(angles[1]) + + drc[:, 0] = sth*cphi + drc[:, 1] = sth*sphi + drc[:, 2] = cth + + # Aki & Richards 2ed, p. 108, eq. 4.88 + cth = mt_array[:, 0]*drc[:, 2]*drc[:, 2] +\ + mt_array[:, 1]*drc[:, 0]*drc[:, 0] +\ + mt_array[:, 2]*drc[:, 1]*drc[:, 1] +\ + 2*(mt_array[:, 3]*drc[:, 0]*drc[:, 2] - + mt_array[:, 4]*drc[:, 1]*drc[:, 2] - + mt_array[:, 5]*drc[:, 0]*drc[:, 1]) + + polarities[cth > 0, _i] = +1 + polarities[cth < 0, _i] = -1 + + return polarities + + +def _polarities_force(force_array, takeoff_array, azimuth_array): + raise NotImplementedError + + +def _get_azimuths(greens): + return np.array([stream.azimuth for stream in greens]) + + +# +# input argument checking +# + +def _model_type(greens): + try: + solver = greens[0].attrs.solver + except: + solver = 'Unknown' + + if solver in ('AxiSEM', 'FK', 'syngine'): + model_type = '1D model' + + elif solver in ('SPECFEM3D', 'SPECFEM3D_GLOBE'): + model_type = '3D model' + + else: + model_type = 'Unknown model' + + return model_type + + +def _check(greens, method): + return + + #model = _model_type(greens) + #method = _method_type(method) + + #if model != method: + # print() + # print(' Possible inconsistency?') + # print(' Green''s functions are from: %s' % model) + # print(' Polarities are from: %s' % method) + # print() + + +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/_modules/mtuq/misfit/waveform.html b/_modules/mtuq/misfit/waveform.html new file mode 100644 index 000000000..a75b6aff4 --- /dev/null +++ b/_modules/mtuq/misfit/waveform.html @@ -0,0 +1,407 @@ + + + + + + + mtuq.misfit.waveform — MTUQ Documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +

Source code for mtuq.misfit.waveform

+
+import numpy as np
+
+from copy import deepcopy
+from mtuq.misfit.waveform import level0, level1, level2
+from mtuq.misfit.waveform._stats import estimate_sigma, calculate_norm_data
+from mtuq.util import Null, iterable, warn
+from mtuq.util.math import isclose, list_intersect_with_indices
+from mtuq.util.signal import check_padding, get_components, isempty
+
+
+
[docs]class WaveformMisfit(object): + """ Waveform misfit function + + Evaluates misfit between data and synthetics using time shifts followed by + waveform differences. This approach, due to `Zhao1994` and `Zhu1996`, has + become widely used in regional seismology. See `docs/references` for more + information. + + .. rubric:: Usage + + Evaluating misfit is a two-step procedure. + + First, the user supplies parameters such as the type of norm (see below for + detailed argument descriptions): + + .. code:: + + misfit = Misfit(**parameters) + + Second, the user supplies data, Green's functions, and sources: + + .. code:: + + values = misfit(data, greens, sources) + + During misfit evaluation, synthetics are then generated and compared with + data, and a NumPy array of misfit values is returned of the same length as + `sources`. + + + .. rubric:: Parameters + + ``norm`` (`str`) + + - ``'L2'``: conventional L2 norm (fast) + .. r1**2 + r1**2 + ... + + - ``'L1'``: conventional L1 norm (slow) + .. \|r1\| + \|r2\| + ... + + - ``'hybrid'``: hybrid L1-L2 norm (much faster than L1 but still robust) + .. (r11**2 + r12**2 + ...)**0.5 + (r21**2 + r22**2 + ...)**0.5 + ... + + + ``time_shift_groups`` (`list`) + + - ``['ZRT']``: forces all three components to have the same time shift + + - ``['ZR','T'``]: forces vertical and radial components to have the same + time shift, while transverse time shift is allowed to vary independently + + - ``['Z','R','T']``: allows time shifts of all three components to vary + independently + + ``time_shift_min`` (`float`): minimum allowable time shift (s) + + ``time_shift_max`` (`float`): maximum allowable time shift (s) + + ``optimization_level`` (`int`): optimization level + (see further details below) + + + .. note:: + + *Convention* : A positive time shift means synthetics are arriving too + early and need to be shifted forward in time to match the observed data. + + + .. rubric:: Optimization Levels + + Because waveform misfit evaluation is the most computationally expensive + task, we have implemented three different versions: + + - a readable pure Python version (``mtuq.misfit.level0``) + + - a fast pure Python version (``mtuq.misfit.level1``) + + - a very fast Python/C version (``mtuq.misfit.level2``) + + + While having exactly the same input argument syntax, these three versions + differ in the following ways: + + - ``level0`` provides a reference for understanding what the code is doing + and for checking the correctness of the fast implementations + + - ``level1`` is an optimized pure Python implementation which provides + significant computational savings for `len(sources)` > 100. This + version is the closest to `Zhu1996`'s original C software. + + - ``level2`` is an optimized Python/C implementation, in which a Python + wrapper is used to combine ObsPy traces into multidimensional arrays. + These arrays are passed to a C extension module, which does the + main computational work. Unlike the other two versions, this + implementation requires that all ObsPy traces have the same time + discretization. + + + .. note:: + + During installation, C extension modules are automatically compiled by + `build_ext.sh` using compiler flags given in `setup.py`. For performance + tuning or compiler troubleshooting, users may wish to modify the + `get_compiler_args` function in `setup.py`. + + """ + + def __init__(self, + norm='hybrid', + time_shift_groups=['ZRT'], + time_shift_min=0., + time_shift_max=0., + optimization_level=2, + ): + """ Function handle constructor + """ + + if norm.lower()=='hybrid': + norm = 'hybrid' + + assert norm in ['L1', 'L2', 'hybrid'],\ + ValueError("Bad input argument: norm") + + assert time_shift_min <= 0.,\ + ValueError("Bad input argument: time_shift_min") + + assert time_shift_max >= 0.,\ + ValueError("Bad input argument: time_shift_max") + + if norm=='L1': + warn( + "Consider using norm='hybrid', which is much faster than " + "norm='L1' but still robust against outliers." + ) + + if type(time_shift_groups) not in (list, tuple): + raise TypeError + + for group in time_shift_groups: + for component in group: + assert component in ['Z','R','T'],\ + ValueError("Bad input argument") + + assert optimization_level in [0,1,2] + + self.norm = norm + self.time_shift_min = time_shift_min + self.time_shift_max = time_shift_max + self.time_shift_groups = time_shift_groups + self.optimization_level = optimization_level + + + def __call__(self, data, greens, sources, progress_handle=Null(), + set_attributes=False, optimization_level=None): + """ Evaluates misfit on given data + """ + if optimization_level is None: + optimization_level = self.optimization_level + + assert optimization_level in [0,1,2] + + # normally misfit is evaluated over a grid of sources; `iterable` + # makes things work if just a single source is given + sources = iterable(sources) + + # checks that dataset is nonempty + if isempty(data): + warn("Empty data set. No misfit evaluations will be carried out") + return np.zeros((len(sources), 1)) + + # checks that the container lengths are consistent + if len(data) != len(greens): + raise Exception("Inconsistent container lengths\n\n "+ + "len(data): %d\n len(greens): %d\n" % + (len(data), len(greens))) + + + # checks that optional Green's function padding is consistent with time + # shift bounds + check_padding(greens, self.time_shift_min, self.time_shift_max) + + + if optimization_level==0 or set_attributes: + return level0.misfit( + data, greens, sources, self.norm, self.time_shift_groups, + self.time_shift_min, self.time_shift_max, progress_handle, + set_attributes) + + if optimization_level==1: + return level1.misfit( + data, greens, sources, self.norm, self.time_shift_groups, + self.time_shift_min, self.time_shift_max, progress_handle) + + if optimization_level==2: + return level2.misfit( + data, greens, sources, self.norm, self.time_shift_groups, + self.time_shift_min, self.time_shift_max, progress_handle) + + +
[docs] def collect_attributes(self, data, greens, source): + """ Collects misfit, time shifts and other attributes corresponding to + each trace + """ + # checks that dataset is nonempty + if isempty(data): + warn("Empty data set. No attributes will be returned") + return [] + + # checks that optional Green's function padding is consistent with time + # shift bounds + check_padding(greens, self.time_shift_min, self.time_shift_max) + + synthetics = greens.get_synthetics( + source, components=data.get_components(), stats=data.get_stats(), + mode='map', inplace=True) + + # attaches attributes to synthetics + _ = level0.misfit( + data, greens, iterable(source), self.norm, self.time_shift_groups, + self.time_shift_min, self.time_shift_max, msg_handle=Null(), + set_attributes=True) + + # collects attributes + attrs = [] + for stream in synthetics: + attrs += [{}] + for trace in stream: + component = trace.stats.channel[-1] + if component in attrs[-1]: + print('Warning multiple traces for same component') + if hasattr(trace, 'attrs'): + attrs[-1][component] = trace.attrs + + return deepcopy(attrs)
+ + +
[docs] def collect_synthetics(self, data, greens, source): + """ Collects synthetics with misfit, time shifts and other attributes attached + """ + # checks that dataset is nonempty + if isempty(data): + warn("Empty data set. No attributes will be returned") + return [] + + # checks that optional Green's function padding is consistent with time + # shift bounds + check_padding(greens, self.time_shift_min, self.time_shift_max) + + synthetics = greens.get_synthetics( + source, components=data.get_components(), stats=data.get_stats(), + mode='map', inplace=True) + + # attaches attributes to synthetics + _ = level0.misfit( + data, greens, iterable(source), self.norm, self.time_shift_groups, + self.time_shift_min, self.time_shift_max, msg_handle=Null(), + set_attributes=True) + + return deepcopy(synthetics)
+ + + +# +# for backward compatibility +# +Misfit = WaveformMisfit + + +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/_modules/mtuq/misfit/waveform/level0.html b/_modules/mtuq/misfit/waveform/level0.html new file mode 100644 index 000000000..340ef9af1 --- /dev/null +++ b/_modules/mtuq/misfit/waveform/level0.html @@ -0,0 +1,297 @@ + + + + + + + mtuq.misfit.waveform.level0 — MTUQ Documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +

Source code for mtuq.misfit.waveform.level0

+"""
+Waveform misfit module (non-optimized pure Python version)
+
+See ``mtuq/misfit/waveform/__init__.py`` for more information
+"""
+
+import numpy as np
+
+from mtuq.util import AttribDict
+from mtuq.util.math import isclose, list_intersect_with_indices
+from mtuq.util.signal import get_components
+
+
+
[docs]def misfit(data, greens, sources, norm, time_shift_groups, + time_shift_min, time_shift_max, msg_handle, set_attributes=False): + """ + Waveform misfit function (non-optimized pure Python version) + + See ``mtuq/misfit/waveform/__init__.py`` for more information + """ + values = np.zeros((len(sources), 1)) + + # + # initialize Green's function machinery + # + for _j, d in enumerate(data): + greens[_j]._set_components(get_components(d)) + + # + # iterate over sources + # + for _i, source in enumerate(sources): + + # optional progress message + msg_handle() + + # + # iterate over stations + # + for _j, d in enumerate(data): + + components = greens[_j].components + if not components: + continue + + # generate synthetics + s = greens[_j].get_synthetics(source, inplace=True) + + # time sampling scheme + npts = d[0].data.size + dt = d[0].stats.delta + + padding_left = int(round(+time_shift_max/dt)) + padding_right = int(round(-time_shift_min/dt)) + npts_padding = padding_left + padding_right + + # array to hold cross correlations + corr = np.zeros(npts_padding+1) + + for group in time_shift_groups: + # Finds the time-shift between data and synthetics that yields + # the maximum cross-correlation value across all components in + # a given group, subject to min/max constraints + _, indices = list_intersect_with_indices( + components, group) + + corr[:] = 0. + for _k in indices: + corr += np.correlate(d[_k].data, s[_k].data, 'valid') + + npts_shift = corr.argmax() - padding_right + time_shift = npts_shift*dt + + # what start and stop indices will correctly shift synthetics + # relative to data? + idx_start = padding_left - npts_shift + idx_stop = idx_start + npts + + for _k in indices: + + # substract data from shifted synthetics + r = s[_k].data[idx_start:idx_stop] - d[_k].data + + # sum the resulting residuals + if norm=='L1': + value = np.sum(abs(r))*dt + + elif norm=='L2': + value = np.sum(r**2)*dt + + elif norm=='hybrid': + value = np.sqrt(np.sum(r**2))*dt + + try: + values[_i] += d[_k].weight * value + except: + values[_i] += value + + + if set_attributes: + if not hasattr(s[_k], 'attrs'): + s[_k].attrs = AttribDict() + + # + # waveform-related attributes + # + + s[_k].attrs.norm = norm + + s[_k].attrs.misfit = value + + s[_k].attrs.idx_start = idx_start + s[_k].attrs.idx_stop = idx_stop + + + # + # phase-related attributes + # + + s[_k].attrs.cc_max = corr.max() + + # "static_shift" is an optional user-supplied + # time shift applied during data processing + + try: + static_shift = d[_k].attrs.static_shift + except: + static_shift = 0. + + s[_k].attrs.static_shift = static_shift + + + # "time_shift" is the subsequent cross-correlation time shift + # applied during misfit evaluation + + s[_k].attrs.time_shift = time_shift + + Ns = np.dot(s[_k].data,s[_k].data)**0.5 + Nd = np.dot(d[_k].data,d[_k].data)**0.5 + + if Ns*Nd > 0: + max_cc = np.correlate(s[_k].data,d[_k].data,'valid').max() + s[_k].attrs.normalized_cc_max = max_cc/(Ns*Nd) + else: + s[_k].attrs.normalized_cc_max = np.nan + + s[_k].attrs.time_shift_min = time_shift_min + s[_k].attrs.time_shift_max = time_shift_max + + + # "total_shift" is the total correction, or in other words + # the sum of static and cross-correlation time shifts + + s[_k].attrs.total_shift = time_shift + static_shift + + + # + # amplitude-related attributes + # + + s_max = s[_k].data[idx_start:idx_stop].max() + d_max = d[_k].data.max() + + s[_k].attrs.amplitude_ratio = d_max/s_max + s[_k].attrs.log_amplitude_ratio = np.log(d_max/s_max) + + return values
+ + +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/_modules/mtuq/misfit/waveform/level1.html b/_modules/mtuq/misfit/waveform/level1.html new file mode 100644 index 000000000..60c64076a --- /dev/null +++ b/_modules/mtuq/misfit/waveform/level1.html @@ -0,0 +1,380 @@ + + + + + + + mtuq.misfit.waveform.level1 — MTUQ Documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +

Source code for mtuq.misfit.waveform.level1

+"""
+Waveform misfit module (fast pure Python version)
+
+See ``mtuq/misfit/waveform/__init__.py`` for more information
+"""
+
+import numpy as np
+from mtuq.util.math import correlate, isclose, list_intersect_with_indices
+from mtuq.util.signal import get_components, get_time_sampling
+
+
+
+
[docs]def misfit(data, greens, sources, norm, time_shift_groups, + time_shift_min, time_shift_max, msg_handle): + """ + Waveform misfit function (fast pure Python version) + + See ``mtuq/misfit/waveform/__init__.py`` for more information + """ + helpers = [] + values = np.zeros((len(sources), 1)) + + # + # initialize Green's function machinery + # + for _j, d in enumerate(data): + greens[_j]._set_components(get_components(d)) + + helpers += [Helper(data[_j], greens[_j], norm, + time_shift_min, time_shift_max)] + + # + # iterate over sources + # + for _i, source in enumerate(sources): + source = source.as_vector() + + # optional progress message + msg_handle() + + # + # iterate over stations + # + for _j, d in enumerate(data): + components = greens[_j].components + if not components: + continue + + # time sampling scheme + npts, dt = get_time_sampling(d) + padding_left = int(+time_shift_max/dt) + padding_right = int(-time_shift_min/dt) + + + for group in time_shift_groups: + # Finds the time-shift between data and synthetics that yields + # the maximum cross-correlation value across all components in + # a given group, subject to min/max constraints + _, indices = list_intersect_with_indices( + components, group) + + ic = helpers[_j].get_time_shift(source, indices) + + for _k in indices: + value = 0. + + if norm=='L1': + start = ic + stop = start + npts + + value = dt * helpers[_j].get_L1_norm( + source, _k, start, stop) + + elif norm=='L2': + value = dt * helpers[_j].get_L2_norm( + source, _k, ic) + + elif norm=='hybrid': + value = dt * helpers[_j].get_L2_norm( + source, _k, ic)**0.5 + + try: + values[_i] += d[_k].weight * value + except: + values[_i] += value + + return values
+ + + +
[docs]class Helper(object): + """ + Stores data and Green's functions for a given station and provides very + efficient numerical implementation of L2 norm + """ + +
[docs] def get_L2_norm(self, source, index, it): + """ + Calculates L2 norm of data and shifted synthetics via + ||s - d||^2 = s^2 + d^2 - 2sd + """ + misfit = 0 + + # d^2 contribution + misfit += self.d_d[index] + + # s^2 contribution + misfit += np.dot(np.dot(self.g_g[index, it, :, :], source), source) + + # -2sd contribution + misfit -= 2*np.dot(self.g_d[index, :, it], source) + + if self.debug: + synthetics = self.get_synthetics(source)[index] + + dd = np.sum(data**2) + #print 'error dd:',\ + # (dd - data_data[index])/dd + print('dd:',dd) + + ss = np.sum(synthetics**2) + #print 'error ss:',\ + # (ss - np.dot(np.dot(greens_greens[index, it, :, :], source), source))/ss + print('ss:',ss) + + sd = np.sum(synthetics*data) + #print 'error sd:',\ + # (sd - np.dot(greens_data[index, :, it], source))/sd + print('sd:',sd) + + print('') + + return misfit
+ + +
[docs] def get_L1_norm(self, source, index, start, stop): + """ + Calculates L1 norm of data and shifted synthetics + """ + synthetics = self.get_synthetics(source) + + return np.sum(np.abs( + synthetics[index][start:stop] - + self.data[index][start:stop]))
+ + +
[docs] def get_synthetics(self, source): + """ + Generates synthetic waveforms using entire set of Green's functions + """ + if source != self.source: + self.source = source + self.synthetics = self.greens.get_synthetics(source) + return self.synthetics
+ + +
[docs] def get_time_shift(self, source, indices): + """ + Finds optimal time shift between the given data and synthetics + generated from the given source + """ + cc = self.g_d + + cc_sum = self.cc_sum + cc_sum[:] = 0. + + for _i in indices: + cc_sum += np.dot(source, cc[_i, :, :]) + + return cc_sum.argmax()
+ + + def __init__(self, d, g, norm, time_shift_min, time_shift_max, debug=False): + """ + Computes auto- and cross-correlations between data and synthetics + for use by the other two methods + """ + components = get_components(d) + if not components: + return + + self.norm = norm + self.time_shift_max = time_shift_max + self.debug = debug + + npts, dt = get_time_sampling(d) + + self.padding_left = int(round(+time_shift_max/dt)) + self.padding_right = int(round(-time_shift_min/dt)) + npts_padding = self.padding_left+self.padding_right + + ncomp = len(components) + + greens = g._array + ngreens = greens.shape[1] + + self.source = None + self.cc_sum = np.zeros(npts_padding+1) + + + # + # correlate greens and data + # + corr = np.zeros((ncomp, ngreens, npts_padding+1)) + + # the main work starts now + for _i, component in enumerate(g.components): + trace = d.select(component=component)[0] + + for _j in range(ngreens): + corr[_i, _j, :] =\ + correlate(greens[_i, _j, :], trace.data) + + self.g_d = corr + + + # + # autocorrelate data + # + corr = np.zeros(ncomp) + + # the main work starts now + for _i1, trace in enumerate(d): + corr[_i1] = np.dot(trace.data, trace.data) + + self.d_d = corr + + + # + # autocorrelate greens + # + npts, dt = get_time_sampling(g) + ones = np.pad(np.ones(npts-npts_padding), npts_padding, 'constant') + corr = np.zeros((ncomp, npts_padding+1, ngreens, ngreens)) + + # the main work starts now + for _i in range(ncomp): + for _j1 in range(ngreens): + for _j2 in range(ngreens): + + if _j1<=_j2: + # calculate upper elements + corr[_i, :, _j1, _j2] = correlate( + greens[_i, _j1, :]*greens[_i, _j2, :], ones) + + else: + # fill in lower elements by symmetry + corr[_i, :, _j1, _j2] = corr[_i, :, _j2, _j1] + + self.g_g = corr
+ + +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/_modules/mtuq/misfit/waveform/level2.html b/_modules/mtuq/misfit/waveform/level2.html new file mode 100644 index 000000000..243099882 --- /dev/null +++ b/_modules/mtuq/misfit/waveform/level2.html @@ -0,0 +1,531 @@ + + + + + + + mtuq.misfit.waveform.level2 — MTUQ Documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +

Source code for mtuq.misfit.waveform.level2

+"""
+Waveform misfit module (fast Python/C version)
+
+See ``mtuq/misfit/waveform/__init__.py`` for more information
+"""
+
+import numpy as np
+import time
+from copy import deepcopy
+from mtuq.misfit.waveform.level1 import correlate
+from mtuq.util.math import to_mij, to_rtp
+from mtuq.util.signal import get_components, get_time_sampling
+from mtuq.misfit.waveform import c_ext_L2
+
+
+
[docs]def misfit(data, greens, sources, norm, time_shift_groups, + time_shift_min, time_shift_max, msg_handle, debug_level=0): + """ + Data misfit function (fast Python/C version) + + See ``mtuq/misfit/waveform/__init__.py`` for more information + """ + # + # collect metadata + # + nt, dt = _get_time_sampling(data) + stations = _get_stations(data) + components = _get_components(data) + + + # collect user-supplied data weights + weights = _get_weights(data, stations, components) + + # which components will be used to determine time shifts (boolean array)? + groups = _get_groups(time_shift_groups, components) + + + # + # collapse main structures into NumPy arrays + # + data = _get_data(data, stations, components) + greens = _get_greens(greens, stations, components) + sources = _to_array(sources) + + # sanity checks + _check(data, greens, sources) + + + # + # cross-correlate data and synthetics + # + padding = _get_padding(time_shift_min, time_shift_max, dt) + data_data = _autocorr_1(data) + greens_greens = _autocorr_2(greens, padding) + greens_data = _corr_1_2(data, greens, padding) + + if norm=='hybrid': + hybrid_norm = 1 + else: + hybrid_norm = 0 + + # + # collect message attributes + # + try: + msg_args = [getattr(msg_handle, attrib) for attrib in + ['start', 'stop', 'percent']] + except: + msg_args = [0, 0, 0] + + # + # call C extension + # + + start_time = time.time() + + if norm in ['L2', 'hybrid']: + results = c_ext_L2.misfit( + data_data, greens_data, greens_greens, sources, groups, weights, + hybrid_norm, dt, padding[0], padding[1], debug_level, *msg_args) + + elif norm in ['L1']: + raise NotImplementedError + + if debug_level > 0: + print(' Elapsed time (C extension) (s): %f' % \ + (time.time() - start_time)) + + return results
+ + +# +# utility functions +# + +
[docs]def _get_time_sampling(dataset): + for stream in dataset: + if len(stream) > 0: + return get_time_sampling(stream)
+ + +
[docs]def _get_padding(time_shift_min, time_shift_max, dt): + padding_left = int(round(+time_shift_max/dt)) + padding_right = int(round(-time_shift_min/dt)) + return [padding_left, padding_right]
+ + +
[docs]def _get_greens(greens, stations, components): + Ncomponents = len(components) + Nstations = len(stations) + Npts = len(greens[0][0]) + + Ngreens = 0 + if greens[0].include_mt: + Ngreens += 6 + if greens[0].include_force: + Ngreens += 3 + + array = np.zeros(( + Nstations, + Ncomponents, + Ngreens, + Npts, + )) + + for _i, station in enumerate(stations): + tensor = greens.select(station)[0] + + # fill in array + tensor._set_components(components) + array[_i, :, :, :] = tensor._array + + return array
+ + +
[docs]def _get_data(data, stations, components): + # Collects numeric trace data from all streams as a single NumPy array; + # compared with iterating over streams and traces, provides a potentially + # faster way of accessing numeric trace data + + #.. warning:: + + # Requires that all streams have the same time discretization + # (or else an error is raised) + + nt, dt = _get_time_sampling(data) + + ns = len(stations) + nc = len(components) + array = np.zeros((ns, nc, nt)) + + for _i, station in enumerate(stations): + stream = data.select(station)[0] + for _j, component in enumerate(components): + try: + trace = stream.select(component=component)[0] + except: + continue + array[_i, _j, :] = trace.data + + return array
+ + + +
[docs]def _get_components(data): + components = list() + for stream in data: + components.extend(get_components(stream)) + components = list(set(components)) + + components_sorted = [] + if 'Z' in components: + components_sorted += ['Z'] + if 'R' in components: + components_sorted += ['R'] + if 'T' in components: + components_sorted += ['T'] + + return components_sorted
+ + +
[docs]def _get_weights(data, stations, components): + # user-supplied data weights + + Ncomponents = len(components) + Nstations = len(stations) + + weights = np.ones(( + Nstations, + Ncomponents, + )) + + for _i, station in enumerate(stations): + for _j, component in enumerate(components): + + stream = data.select(station)[0] + stream = stream.select(component=component) + + if len(stream) > 0: + try: + weights[_i, _j] = stream[0].attrs.weight + except: + print('Error reading user-suppled data weight') + weights[_i, _j] = 1. + else: + weights[_i, _j] = 0. + + return weights
+ + +
[docs]def _get_mask(data, stations, components): + # which components are absent from the data (boolean array)? + + Ncomponents = len(components) + Nstations = len(stations) + + mask = np.ones(( + Nstations, + Ncomponents, + )) + + for _i, station in enumerate(stations): + for _j, component in enumerate(components): + + stream = data.select(station)[0] + stream = stream.select(component=component) + + if len(stream)==0: + mask[_i, _j] = 0. + + return mask
+ + +
[docs]def _get_stations(data): + stations = [] + for stream in data: + if len(stream)==0: + continue + stations += [stream.station] + return stations
+ + +
[docs]def _get_groups(groups, components): + Ncomponents = len(components) + Ngroups = len(groups) + + array = np.zeros(( + Ngroups, + Ncomponents, + )) + + for _i, group in enumerate(groups): + for _j, component in enumerate(components): + if component in group: + array[_i, _j] = 1 + + return array
+ + +
[docs]def _check(data, greens, sources): + # array shape sanity checks + + if data.shape[0] != greens.shape[0]: + print() + print('Number of stations (data): %d' % data.shape[0]) + print('Number of stations (Green''s): %d' % data.shape[0]) + print() + raise TypeError('Inconsistent shape') + + if data.shape[1] != greens.shape[1]: + print() + print('Number of components (data): %d' % data.shape[1]) + print('Number of components (Green''s): %d' % data.shape[1]) + print() + raise TypeError('Inconsistent shape') + + if greens.shape[2] != sources.shape[1]: + print() + print('Number of Green''s functions in linear combination: %d' % greens.shape[2]) + print('Number of weights in linear combination: %d' % sources.shape[1]) + print()
+ + +
[docs]def _to_array(sources): + dims = sources.dims + df = sources.to_dataframe() + + if _type(dims)=='MomentTensor': + return np.ascontiguousarray(to_mij( + df['rho'].to_numpy(), + df['v'].to_numpy(), + df['w'].to_numpy(), + df['kappa'].to_numpy(), + df['sigma'].to_numpy(), + df['h'].to_numpy(), + )) + + elif _type(dims)=='Force': + return np.ascontiguousarray(to_rtp( + df['F0'].to_numpy(), + df['phi'].to_numpy(), + df['h'].to_numpy(), + ))
+ + +
[docs]def _type(dims): + if 'rho' in dims\ + and 'v' in dims\ + and 'w' in dims\ + and 'kappa' in dims\ + and 'sigma' in dims\ + and 'h' in dims: + return 'MomentTensor' + + elif 'F0' in dims\ + and 'phi' in dims\ + and 'h' in dims: + return 'Force' + + else: + raise ValueError
+ + +# +# cross-correlation utilities +# + +
[docs]def _corr_1_2(data, greens, padding): + # correlates 1D and 2D data structures + Ncomponents = greens.shape[1] + Nstations = greens.shape[0] + Ngreens = greens.shape[2] + + corr = np.zeros(( + Nstations, + Ncomponents, + Ngreens, + padding[0]+padding[1]+1, + )) + + for _i in range(Nstations): + for _j in range(Ncomponents): + for _k in range(Ngreens): + + corr[_i, _j, _k, :] = correlate( + greens[_i, _j, _k, :], data[_i, _j, :]) + + return corr
+ + +
[docs]def _autocorr_1(data): + # autocorrelates 1D data strucutres (reduces to dot product) + Ncomponents = data.shape[1] + Nstations = data.shape[0] + + corr = np.zeros(( + Nstations, + Ncomponents, + )) + + for _i in range(Nstations): + for _j in range(Ncomponents): + corr[_i, _j] = np.dot( + data[_i, _j, :], data[_i, _j, :]) + + return corr
+ + +
[docs]def _autocorr_2(greens, padding): + # autocorrelates 2D data structures + + Ncomponents = greens.shape[1] + Nstations = greens.shape[0] + Ngreens = greens.shape[2] + Npts = greens.shape[3] + + ones = np.pad(np.ones(Npts), + (padding[0], padding[1]), 'constant') + + corr = np.zeros(( + Nstations, + Ncomponents, + padding[0]+padding[1]+1, + Ngreens, + Ngreens, + )) + + for _i in range(Nstations): + for _j in range(Ncomponents): + for _k1 in range(Ngreens): + for _k2 in range(Ngreens): + + if _k1<=_k2: + corr[_i, _j, :, _k1, _k2] = correlate( + greens[_i, _j, _k1, :]*greens[_i, _j, _k2, :], + ones) + + else: + corr[_i, _j, :, _k1, _k2] = corr[_i, _j, :, _k2, _k1] + + return corr
+ + +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/_modules/mtuq/process_data.html b/_modules/mtuq/process_data.html new file mode 100644 index 000000000..9b9b8910a --- /dev/null +++ b/_modules/mtuq/process_data.html @@ -0,0 +1,875 @@ + + + + + + + mtuq.process_data — MTUQ Documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +

Source code for mtuq.process_data

+
+import csv
+import obspy
+import numpy as np
+import warnings
+
+from copy import deepcopy
+from io import TextIOBase
+from obspy import taup
+from obspy.geodetics import gps2dist_azimuth
+from os.path import basename, exists
+from mtuq.util import AttribDict, warn
+from mtuq.util.cap import WeightParser, taper
+from mtuq.util.signal import cut, get_arrival, m_to_deg, _window_warnings
+
+
+
[docs]class ProcessData(object): + """ An attempt at a one-size-fits-all data processing class + + + .. rubric :: Usage + + Processing data is a two-step procedure. First, the user supplies parameters + (see available choices below) to create a data processing function: + + .. code:: + + function = ProcessData(**parameters) + + Second, an ObsPy stream is given as input to the data processing function + and a processed stream returned as output: + + .. code:: + + processed_stream = function(stream) + + + Data processing can also be applied to an entire ``Dataset`` at once: + + .. code:: + + processed_dataset = dataset.map(function) + + + See `mtuq/examples/` for further illustration. + + + .. rubric :: Parameters + + ``filter_type`` (`str`) + + - ``'bandpass'`` + Butterworth-Bandpass (uses `obspy.signal.filter.bandpass`) + + - ``'lowpass'`` + Butterworth-Lowpass (uses `obspy.signal.filter.lowpass`) + + - ``'highpass'`` + Butterworth-Highpass (uses `obspy.signal.filter.highpass`) + + - ``None`` + no filter will be applied + + + ``pick_type`` (`str`) + + - ``'taup'`` + calculates P, S travel times from Tau-P model + (uses `obspy.taup.TauPyModel.get_arrival_times`) + + - ``'FK_metadata'`` + reads P, S travel times from FK metadata + + - ``'SAC_metadata'`` + reads P, S travel times from SAC metadata fields `t5`, `t6` + + - ``'user_supplied'`` + reads P, S travel times from columns 8, 10 of `capuaf_file` + + - ``None`` + no P,S travel times will be calculated + + + ``window_type`` (`str`) + + - ``'body_wave'`` + regional-distance body-wave window + + - ``'surface_wave'`` + regional-distance surface-wave window + + - ``'group_velocity'`` + surface-wave window centered on given group velocity + + - ``None`` + no windows will be applied + + + ``apply_statics`` (`bool`) + Whether or not to apply static time shifts from columns 11-12 of `capuaf_file` + + + ``apply_weights`` (`bool`) + Whether or not to apply objective function weights from columns 3-8 of `capuaf_file` + + + ``apply_scaling`` (`bool`) + Whether or not to apply distance-dependent amplitude scaling + + + ``apply_padding`` (`bool`) + Whether or not to use longer Green's window relative to observed data + window (allows for more accurate cross-correlations) + + + .. rubric:: Other input arguments that may be required, depending on the above + + ``freq_min`` (`float`) + Required for `filter_type=bandpass` + + ``freq_max`` (`float`) + Required for `filter_type=bandpass` + + ``freq`` (`float`) + Required for `filter_type=lowpass` or `filter_type=highpass` + + ``window_length`` (`float`) + Window length in seconds + + ``group_velocity`` (`float`) + Group velocity in m/s, required for `window_type=group_velocity` + + ``window_alignment`` (`float`) + Optional window alignment for `window_type=group_velocity` + (`float` between 0. and 1.) + + ``time_shift_min`` (`float`) + Required for `apply_padding=True` + + ``time_shift_max`` (`float`) + Required for `apply_padding=True` + + ``taup_model`` (`str`) + Name of built-in ObsPy TauP model or path to custom ObsPy TauP model, + required for `pick_type=taup` + + ``FK_database`` (`str`) + Path to FK database, required for `pick_type=FK_metadata` + + ``capuaf_file`` (`str`) + Path to `CAPUAF`-style text file, required for `pick_type=user_supplied` + + """ + + def __init__(self, + + filter_type=None, + window_type=None, + pick_type=None, + + # for filter_type='Bandpass' + # (specify corners in terms of frequency or period, but not both) + freq_min=None, + freq_max=None, + period_min=None, + period_max=None, + + # for filter_type='Lowpass' or filter_type='Highpass' + # (specify corner in terms of frequency or period, but not both) + freq=None, + period=None, + + # window parameters + window_length=None, + apply_padding=False, + apply_statics=False, + time_shift_min=None, + time_shift_max=None, + + # data weighting parameters + # (control contribution of particular traces or components to the + # data misfit function) + apply_weights=True, + apply_scaling=True, + scaling_power=None, + scaling_coefficient=None, + capuaf_file=None, + + # P and S pick parameters + # (default body_wave and surface_wave windows are defined relative to + # P and S picks, which can be calculated on the fly from tau-P or + # read from FK database) + taup_model=None, + FK_database=None, + FK_model=None, + + # any user-supplied keyword arguments not included above go into + # this dictionary (can be helpful for user customization) + **parameters): + + + if not filter_type: + warn("No filter will be applied") + + if not window_type: + warn("No windows will be applied") + + if filter_type: + filter_type = filter_type.lower() + self.filter_type = filter_type + + if window_type: + window_type = window_type.lower() + self.window_type = window_type + + # note that we make pick_type case sensitive + # (could be helpful because p,P s,S are meaningful differences?) + self.pick_type = pick_type + + + # + # check filter parameters + # + + if not self.filter_type: + # nothing to check + pass + + elif self.filter_type == 'bandpass': + + # filter corners can be specified in terms of either period [s] + # or frequency [Hz], but not both + if period_min is not None and\ + period_max is not None: + + assert freq_min is None + assert freq_max is None + freq_min = period_max**-1 + freq_max = period_min**-1 + + else: + assert freq_min is not None + assert freq_max is not None + + assert 0 < freq_min + assert freq_min < freq_max + assert freq_max < np.inf + + self.freq_min = freq_min + self.freq_max = freq_max + + + elif self.filter_type == 'lowpass' or\ + self.filter_type == 'highpass': + + # filter corner can be specified in terms of either period [s] + # or frequency [Hz], but not both + if period is not None: + assert freq is None + freq = period*-1 + else: + assert freq is not None + + assert 0 < freq < np.inf + + self.freq = freq + + else: + raise ValueError('Bad parameter: filter_type') + + + # + # check window parameters + # + + if not self.window_type: + # nothing to check now + pass + + elif self.window_type == 'body_wave': + # regional body-wave window in the manner of Zhu1996 + assert pick_type is not None, "Must be defined: pick_type" + assert window_length > 0. + self.window_length = window_length + + elif self.window_type == 'surface_wave': + # regional surface-wave window in the manner of Zhu1996 + assert pick_type is not None, "Must be defined: pick_type" + assert window_length > 0. + self.window_length = window_length + + elif self.window_type == 'group_velocity': + assert 'group_velocity' in parameters + assert parameters['group_velocity'] >= 0. + self.group_velocity = parameters['group_velocity'] + self.window_alignment = getattr(parameters, 'window_alignment', 0.5) + assert 0. <= self.window_alignment <= 1. + assert window_length > 0. + self.window_length = window_length + + elif self.window_type == 'min_max': + assert 'v_min' in parameters + assert 'v_max' in parameters + assert 0. <= parameters['v_min'] + assert parameters['v_min'] <= parameters['v_max'] + assert parameters['v_max'] <= np.inf + self.v_min = parameters['v_min'] + self.v_max = parameters['v_max'] + + assert window_length >= 0. + self.window_length = window_length + _window_warnings(window_type, window_length) + + else: + raise ValueError('Bad parameter: window_type') + + + if apply_statics: + assert self.window_type is not None + + if apply_padding: + assert self.time_shift_min <= 0.,\ + ValueError("Bad parameter: time_shift_min") + + assert self.time_shift_max >= 0.,\ + ValueError("Bad parameter: time_shift_max") + + self.time_shift_min = time_shift_min + self.time_shift_max = time_shift_max + + self.apply_padding = apply_padding + self.apply_statics = apply_statics + + + + # + # check phase pick parameters + # + + if not self.pick_type: + # nothing to check now + pass + + elif self.pick_type == 'taup': + assert taup_model is not None + self.taup_model = taup_model + self._taup = taup.TauPyModel(self.taup_model) + + elif self.pick_type == 'FK_metadata': + assert FK_database is not None + assert exists(FK_database) + + if FK_model is None: + FK_model = basename(FK_database) + + self.FK_database = FK_database + self.FK_model = FK_model + + elif self.pick_type == 'SAC_metadata': + pass + + elif self.pick_type == 'user_supplied': + pass + + else: + raise ValueError('Bad parameter: pick_type, %s' % self.pick_type) + + + # + # check weight parameters + # + self.apply_scaling = apply_scaling + self.apply_weights = apply_weights + + if apply_scaling: + if self.window_type == 'body_wave': + if scaling_power is None: + scaling_power = 1. + + if scaling_coefficient is None: + scaling_coefficient = 1.e5 + + else: + if scaling_power is None: + scaling_power = 0.5 + + if scaling_coefficient is None: + scaling_coefficient = 1.e5 + + self.scaling_power = scaling_power + self.scaling_coefficient = scaling_coefficient + + + + # + # parse text files + # + if self.apply_statics or\ + self.apply_weights or\ + self.pick_type == 'user_supplied': + assert capuaf_file is not None + + if isinstance(capuaf_file, TextIOBase): + parser = WeightParser(capuaf_file) + else: + assert exists(capuaf_file) + parser = WeightParser(capuaf_file) + + if self.apply_statics: + self.statics = parser.parse_statics() + + if self.apply_weights: + self.weights = parser.parse_weights() + + if self.pick_type == 'user_supplied': + self.picks = parser.parse_picks() + + + + + def __call__(self, traces, station=None, origin=None, overwrite=False): + ''' + Carries out data processing operations on ObsPy traces or + MTUQ GreensTensors + ''' + if station is None: + station = getattr(traces, 'station', None) + + if origin is None: + origin = getattr(traces, 'origin', None) + + # overwrite existing data? + if overwrite: + traces = traces + else: + traces = deepcopy(traces) + + if not hasattr(traces, 'id'): + raise Exception('Missing station identifier') + id = traces.id + + # collect location information + distance_in_m, azimuth, _ = gps2dist_azimuth( + origin.latitude, + origin.longitude, + station.latitude, + station.longitude) + + # collect time sampling information + nt, dt = traces[0].stats.npts, traces[0].stats.delta + + # Tags can be added through dataset.add_tag to keep track of custom + # metadata or support other customized uses. Here we use tags to + # distinguish data from Green's functions and displacement time series + # from velcoity time series + if not hasattr(traces, 'tags'): + raise Exception('Missing tags attribute') + tags = traces.tags + + if 'units:m' in tags: + # nothing to do + pass + + elif 'units:cm' in tags: + # convert to meters + for trace in traces: + trace.data *= 1.e-2 + index = tags.index('units:cm') + tags[index] = 'units:m' + + else: + warn('Units not specified.') + + for trace in traces: + if not hasattr(trace, 'attrs'): + trace.attrs = AttribDict() + + + # + # part 1: filter traces + # + + if self.filter_type == 'bandpass': + for trace in traces: + trace.detrend('demean') + trace.detrend('linear') + trace.taper(0.05, type='hann') + trace.filter('bandpass', zerophase=False, + freqmin=self.freq_min, + freqmax=self.freq_max) + + elif self.filter_type == 'lowpass': + for trace in traces: + trace.detrend('demean') + trace.detrend('linear') + trace.taper(0.05, type='hann') + trace.filter('lowpass', zerophase=False, + freq=self.freq) + + elif self.filter_type == 'highpass': + for trace in traces: + trace.detrend('demean') + trace.detrend('linear') + trace.taper(0.05, type='hann') + trace.filter('highpass', zerophase=False, + freq=self.freq) + + if 'type:velocity' in tags: + # convert to displacement + for trace in traces: + trace.data = np.cumsum(trace.data)*dt + index = tags.index('type:velocity') + tags[index] = 'type:displacement' + + + # + # part 2a: apply distance scaling + # + + if self.apply_scaling: + for trace in traces: + trace.data *=\ + (distance_in_m/self.scaling_coefficient)**self.scaling_power + + # + # part 2b: apply user-supplied data weights + # + if 'type:greens' in tags: + pass + + elif self.apply_weights: + for trace in traces: + try: + component = trace.stats.channel[-1].upper() + + if self.window_type == 'body_wave': + key = 'body_wave_'+component + else: + key = 'surface_wave_'+component + + weight = self.weights[id][key] + + except: + weight = None + + if weight: + trace.attrs.weight = weight + else: + traces.remove(trace) + + + # + # part 3: determine phase picks + # + + if not self.pick_type: + pass + + elif self.pick_type == 'user_supplied': + picks = self.picks[id] + + else: + picks = dict() + + if self.pick_type=='taup': + with warnings.catch_warnings(): + # suppress obspy warning that gets raised even when taup is + # used correctly (someone should submit an ObsPy fix) + warnings.filterwarnings('ignore') + arrivals = self._taup.get_travel_times( + origin.depth_in_m/1000., + m_to_deg(distance_in_m), + phase_list=['p', 's', 'P', 'S']) + try: + picks['P'] = get_arrival(arrivals, 'p') + except: + picks['P'] = get_arrival(arrivals, 'P') + try: + picks['S'] = get_arrival(arrivals, 's') + except: + picks['S'] = get_arrival(arrivals, 'S') + + + elif self.pick_type=='FK_metadata': + sac_headers = obspy.read('%s/%s_%s/%s.grn.0' % + (self.FK_database, + self.FK_model, + str(int(np.ceil(origin.depth_in_m/1000.))), + str(int(np.ceil(distance_in_m/1000.)))), + format='sac')[0].stats.sac + picks['P'] = sac_headers.t1 + picks['S'] = sac_headers.t2 + + + elif self.pick_type=='SAC_metadata': + sac_headers = traces[0].sac + picks['P'] = sac_headers.t5 + picks['S'] = sac_headers.t6 + + + for trace in traces: + + # + # part 4a: determine window start and end times + # + + if self.window_type == 'body_wave': + # regional body-wave window in the manner of Zhu1996 + # (closely based on CAP code) + + starttime = picks['P'] - 0.4*self.window_length + endtime = starttime + self.window_length + + starttime += float(origin.time) + endtime += float(origin.time) + + + elif self.window_type == 'surface_wave': + # regional surface-wave window in the manner of Zhu1996 + # (closely based on CAP code) + + starttime = picks['S'] - 0.3*self.window_length + endtime = starttime + self.window_length + + starttime += float(origin.time) + endtime += float(origin.time) + + + elif self.window_type == 'group_velocity': + # surface-wave window based on given group velocity [m/s] + + group_arrival = distance_in_m/self.group_velocity + + # alignment=0.0 - window starts at group arrival + # alignment=0.5 - window centered on group arrival (default) + # alignment=1.0 - window ends at group arrival + alignment = self.alignment + + starttime = group_arrival - self.window_length*window_alignment + endtime = group_arrival + self.window_length*(1.-window_alignment) + + starttime += float(origin.time) + endtime += float(origin.time) + + + elif self.window_type == 'min_max': + # experimental window type defined by minimum and maximum + # group velocities [m/s] + + # WARNING - results in distance-dependent window lengths, + # which may not work with other MTUQ functions + + starttime = distance_in_m/self.v_max + endtime = distance_in_m/self.v_min + + # optionally, enforce minimum window length + if endtime - starttime < self.window_length: + average_time = (starttime + endtime)/2. + starttime = average_time - self.window_length/2. + endtime = average_time + self.window_length/2. + + starttime += float(origin.time) + endtime += float(origin.time) + + + else: + starttime = trace.stats.starttime + endtime = trace.stats.endtime + + + # + # part 4b: apply statics + # + + # STATIC CONVENTION: A positive static time shift means synthetics + # are arriving too early and need to be shifted forward in time + # (positive shift) to match the observed data + + if self.apply_statics: + try: + # _component is a custom metadata attribute added by + # mtuq.io.clients + + # Even though obspy.read doesn't return a stats.component + # attribute, "component" is still reserved by ObsPy, + # thus we use "_component" instead + component = trace.stats._component + + except: + # This way of getting the component from the channel is + # actually what is hardwired into ObsPy, and is implemented + # here as a fallback + component = trace.stats.channel[-1].upper() + + try: + if self.window_type == 'body_wave': + key = 'body_wave_'+component + + else: + key = 'surface_wave_'+component + + static = self.statics[id][key] + trace.attrs.static_shift = static + + except: + print('Error reading static time shift: %s' % id) + static = 0. + + if self.window_type is not None and\ + 'type:greens' in tags: + + trace.stats.starttime += static + + + + # + # part 4c: apply padding + # + + # using a longer window for Green's functions than for data allows for + # more accurate time-shift corrections + + if self.apply_padding and\ + 'type:greens' in tags: + + starttime += self.time_shift_min + endtime += self.time_shift_max + + trace.stats.npts_padding_left = int(round(-self.time_shift_min/dt)) + trace.stats.npts_padding_right = int(round(+self.time_shift_max/dt)) + + + # + # part 4d: cut and taper trace + # + + # cuts trace and adjusts metadata + if self.window_type is not None: + cut(trace, starttime, endtime) + + elif self.apply_statics and 'type:greens' in tags: + print('Not implemented warning') + + taper(trace.data) + + + return traces
+
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/_modules/mtuq/station.html b/_modules/mtuq/station.html new file mode 100644 index 000000000..1ac7aba23 --- /dev/null +++ b/_modules/mtuq/station.html @@ -0,0 +1,239 @@ + + + + + + + mtuq.station — MTUQ Documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +

Source code for mtuq.station

+
+import obspy
+
+from mtuq.util import AttribDict
+from obspy.core import UTCDateTime
+from obspy.geodetics import gps2dist_azimuth
+
+
+
[docs]class Station(AttribDict): + """Station metadata object + + Holds the following information + + - latitude and longitude + - depth and elevation + - network, station, and location codes + + .. note:: + + Each supported file format has a corresponding reader that reads + waveforms and creates Station objects from metadata + (see ``mtuq.io.readers``). + + """ + + + defaults = { + 'latitude': None, + 'longitude': None, + 'depth_in_m': None, + 'elevation_in_m': None, + 'network': '', + 'station': '', + 'location': '', + } + + readonly = [] + _refresh_keys = [] + + + if True: + # optional time discretization attributes + defaults.update({ + 'sampling_rate': 1.0, + 'delta': 1.0, + 'starttime': UTCDateTime(0), + 'endtime': UTCDateTime(0), + 'npts': 0, + }) + + readonly.extend([ + 'endtime', + ]) + + _refresh_keys.extend([ + 'sampling_rate', + 'delta', + 'starttime', + 'endtime', + 'npts', + ]) + + + def __init__(self, *args, **kwargs): + super(Station, self).__init__(*args, **kwargs) + + + def __setitem__(self, key, value): + if key in self._refresh_keys: + self._refresh(key, value) + + elif isinstance(value, dict): + super(Station, self).__setitem__(key, AttribDict(value)) + + else: + super(Station, self).__setitem__(key, value) + + +
[docs] def _refresh(self, key, value): + # adapted from obspy.core.trace.Stats + + if key == 'npts': + value = int(value) + + elif key == 'sampling_rate': + value = float(value) + + elif key == 'starttime': + value = UTCDateTime(value) + + elif key == 'delta': + key = 'sampling_rate' + try: + value = 1.0 / float(value) + except ZeroDivisionError: + value = 0. + + super(Station, self).__setitem__(key, value) + + try: + self.__dict__['delta'] = 1.0 / float(self.sampling_rate) + except ZeroDivisionError: + self.__dict__['delta'] = 0. + + if self.npts > 0: + self.__dict__['endtime'] = self.starttime +\ + float(self.npts-1)*self.delta + else: + self.__dict__['endtime'] = self.starttime
+ + +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/_modules/mtuq/util/math.html b/_modules/mtuq/util/math.html new file mode 100644 index 000000000..321f23d28 --- /dev/null +++ b/_modules/mtuq/util/math.html @@ -0,0 +1,467 @@ + + + + + + + mtuq.util.math — MTUQ Documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +

Source code for mtuq.util.math

+
+import numpy as np
+from obspy.geodetics import gps2dist_azimuth
+from scipy.signal import fftconvolve
+
+
+#
+# numerical
+#
+
+def isclose(X, Y):
+    EPSVAL = 1.e-6
+    X = np.array(X)
+    Y = np.array(Y)
+    return bool(
+        np.linalg.norm(X-Y) < EPSVAL)
+
+
+def correlate(v1, v2):
+    """ Fast cross-correlation function
+
+    Correlates unpadded array v1 and padded array v2, producing result of
+    shape ``len(v2) - len(v1)``
+    """
+    n1, n2 = len(v1), len(v2)
+
+    if n1>2000 or n2-n1>200:
+        # for long traces, frequency-domain implementation is usually faster
+        return fftconvolve(v1, v2[::-1], 'valid')
+    else:
+        # for short traces, time-domain implementation is usually faster
+        return np.correlate(v1, v2, 'valid')
+
+
+def wrap_180(angle_in_deg):
+    """ Wraps angle to (-180, 180)
+    """
+    angle_in_deg %= 360.
+    idx = np.where(angle_in_deg > 180.)
+    angle_in_deg[idx] -= 360.
+    return angle_in_deg
+
+
+#
+# statistical
+#
+
+def apply_cov(C, r):
+    """ Applies covariance matrix to residuals vector
+    """
+    #
+    # TODO - more robust for different array types, more efficient
+    #
+
+    if type(C) not in [np.array, float]:
+        raise Exception
+
+    ndim = getattr(C, 'ndim', 0)
+
+    if ndim not in [0,1,2]:
+        raise Exception
+
+    if ndim==2:
+        Cinv = np.linalg.inv(C)
+        return np.dot(r, np.dot(Cinv, r))
+
+    else:
+        return np.sum(r**2/C)
+
+
+#
+# set theoretic
+#
+
+
+def list_intersect(a, b):
+    """ Intersection of two lists
+    """
+    return list(set(a).intersection(set(b)))
+
+
+def list_intersect_with_indices(a, b):
+    intersection = list(set(a).intersection(set(b)))
+    indices = [a.index(item) for item in intersection]
+    return intersection, indices
+
+
+def open_interval(x1, x2, N):
+    """ Covers the open interval (x1, x2) with N regularly-spaced points
+    """
+
+    # NOTE: np.linspace(x1, x2, N)[1:-1] would be slightly simpler
+    # but not as readily used by matplotlib.pyplot.pcolor
+
+    return np.linspace(x1, x2, 2*N+1)[1:-1:2]
+
+
+def closed_interval(x1, x2, N):
+    """ Covers the closed interval [x1, x2] with N regularly-spaced points
+    """
+    return np.linspace(x1, x2, N)
+
+
+def tight_interval(x1,x2,N,tightness=0.999):
+    # tightness (float)
+    # 0. reduces to ``open_intervel``, 1. reduces to ``closed_intervel``
+    Lo = open_interval(x1,x2,N)
+    Lc = closed_interval(x1,x2,N)
+    return Lo*(1.-tightness) + Lc*tightness
+
+
+
+#
+# moment tensor and force
+#
+
+def lune_det(delta, gamma):
+    """ Determinant of lune mapping as function of lune coordinates
+    """
+    delta, gamma = np.meshgrid(np.deg2rad(delta), np.deg2rad(gamma))
+    beta = np.pi/2. - delta
+    return 4./np.pi * np.sin(beta)**3 * np.cos(3.*gamma)
+
+
+def to_mij(rho, v, w, kappa, sigma, h):
+    """ Converts from lune parameters to moment tensor parameters
+    (up-south-east convention)
+    """
+    kR3 = np.sqrt(3.)
+    k2R6 = 2.*np.sqrt(6.)
+    k2R3 = 2.*np.sqrt(3.)
+    k4R6 = 4.*np.sqrt(6.)
+    k8R6 = 8.*np.sqrt(6.)
+
+    m0 = rho/np.sqrt(2.)
+
+    delta, gamma = to_delta_gamma(v, w)
+    beta = 90. - delta
+
+    gamma = np.deg2rad(gamma)
+    beta = np.deg2rad(90. - delta)
+    kappa = np.deg2rad(kappa)
+    sigma = np.deg2rad(sigma)
+    theta = np.arccos(h)
+
+    Cb  = np.cos(beta)
+    Cg  = np.cos(gamma)
+    Cs  = np.cos(sigma)
+    Ct  = np.cos(theta)
+    Ck  = np.cos(kappa)
+    C2k = np.cos(2.0*kappa)
+    C2s = np.cos(2.0*sigma)
+    C2t = np.cos(2.0*theta)
+
+    Sb  = np.sin(beta)
+    Sg  = np.sin(gamma)
+    Ss  = np.sin(sigma)
+    St  = np.sin(theta)
+    Sk  = np.sin(kappa)
+    S2k = np.sin(2.0*kappa)
+    S2s = np.sin(2.0*sigma)
+    S2t = np.sin(2.0*theta)
+
+    mt0 = m0 * (1./12.) * \
+        (k4R6*Cb + Sb*(kR3*Sg*(-1. - 3.*C2t + 6.*C2s*St*St) + 12.*Cg*S2t*Ss))
+
+    mt1 = m0* (1./24.) * \
+        (k8R6*Cb + Sb*(-24.*Cg*(Cs*St*S2k + S2t*Sk*Sk*Ss) + kR3*Sg * \
+        ((1. + 3.*C2k)*(1. - 3.*C2s) + 12.*C2t*Cs*Cs*Sk*Sk - 12.*Ct*S2k*S2s)))
+
+    mt2 = m0* (1./6.) * \
+        (k2R6*Cb + Sb*(kR3*Ct*Ct*Ck*Ck*(1. + 3.*C2s)*Sg - k2R3*Ck*Ck*Sg*St*St +
+        kR3*(1. - 3.*C2s)*Sg*Sk*Sk + 6.*Cg*Cs*St*S2k +
+        3.*Ct*(-4.*Cg*Ck*Ck*St*Ss + kR3*Sg*S2k*S2s)))
+
+    mt3 = m0* (-1./2.)*Sb*(k2R3*Cs*Sg*St*(Ct*Cs*Sk - Ck*Ss) +
+        2.*Cg*(Ct*Ck*Cs + C2t*Sk*Ss))
+
+    mt4 = -m0* (1./2.)*Sb*(Ck*(kR3*Cs*Cs*Sg*S2t + 2.*Cg*C2t*Ss) +
+        Sk*(-2.*Cg*Ct*Cs + kR3*Sg*St*S2s))
+
+    mt5 = -m0* (1./8.)*Sb*(4.*Cg*(2.*C2k*Cs*St + S2t*S2k*Ss) +
+        kR3*Sg*((1. - 2.*C2t*Cs*Cs - 3.*C2s)*S2k + 4.*Ct*C2k*S2s))
+
+    if type(mt0) is np.ndarray:
+        return np.column_stack([mt0, mt1, mt2, mt3, mt4, mt5])
+    else:
+        return np.array([mt0, mt1, mt2, mt3, mt4, mt5])
+
+
+def to_xyz(F0, phi, h):
+    """ Converts from spherical to Cartesian coordinates (east-north-up)
+    """
+    # spherical coordinates in "physics convention"
+    r = F0
+    phi = np.radians(phi)
+    theta = np.arccos(h)
+
+    x = F0*np.sin(theta)*np.cos(phi)
+    y = F0*np.sin(theta)*np.sin(phi)
+    z = F0*np.cos(theta)
+
+    if type(F0) is np.ndarray:
+        return np.column_stack([x, y, z])
+    else:
+        return np.array([x, y, z])
+
+
+
[docs]def to_rtp(F0, phi, h): + """ Converts from spherical to Cartesian coordinates (up-south-east) + + Parameters: + F0 (float or numpy array): The radial distance from the origin + phi (float or numpy array): The azimuthal angle in degrees - 0 to 360 range, where 0 is East. Anticlockwise positive. + h (float or numpy array): The cosine of the polar angle - -1 to 1 range, where 1 is Up + + Returns: + numpy array: The Cartesian coordinates in the up-south-east system + """ + # spherical coordinates in "physics convention" + + r = F0 + phi = np.radians(phi) + theta = np.arccos(h) + + x = F0*np.sin(theta)*np.cos(phi) + y = F0*np.sin(theta)*np.sin(phi) + z = F0*np.cos(theta) + + if type(F0) is np.ndarray: + return np.column_stack([z, -y, x,]) + else: + return np.array([z, -y, x])
+ + +def to_delta_gamma(v, w): + """ Converts from Tape2015 parameters to lune coordinates + """ + return to_delta(w), to_gamma(v) + + +def to_gamma(v): + """ Converts from Tape2015 parameter v to lune longitude + """ + gamma = (1./3.)*np.arcsin(3.*v) + return np.rad2deg(gamma) + + +def to_delta(w): + """ Converts from Tape2015 parameter w to lune latitude + """ + beta0 = np.linspace(0, np.pi, 100) + u0 = 0.75*beta0 - 0.5*np.sin(2.*beta0) + 0.0625*np.sin(4.*beta0) + beta = np.interp(3.*np.pi/8. - w, u0, beta0) + delta = np.rad2deg(np.pi/2. - beta) + return delta + + +def to_v_w(delta, gamma): + """ Converts from lune coordinates to Tape2015 parameters + """ + return to_v(gamma), to_w(delta) + + +def to_v(gamma): + """ Converts from lune longitude to Tape2015 parameter v + """ + v = (1./3.)*np.sin(3.*np.deg2rad(gamma)) + return v + + +def to_w(delta): + """ Converts from lune latitude to Tape2015 parameter w + """ + beta = np.deg2rad(90. - delta) + u = (0.75*beta - 0.5*np.sin(2.*beta) + 0.0625*np.sin(4.*beta)) + w = 3.*np.pi/8. - u + return w + + +def to_M0(Mw): + """ Converts from moment magnitude to scalar moment + """ + return 10.**(1.5*float(Mw) + 9.1) + + +def to_rho(Mw): + """ Converts from moment magnitude to Tape2012 magnitude parameter + """ + return to_M0(Mw)*np.sqrt(2.) + +def to_Mw(rho): + """ Converts from Tape2012 magnitude parameter to moment magnitude + """ + return ((np.log10(rho/np.sqrt(2))-9.1)/1.5) + + +# +# structured grids +# + +def lat_lon_tuples(center_lat=None,center_lon=None, + spacing_in_m=None, npts_per_edge=None, perturb_in_deg=0.1): + """ Geographic grid + """ + + # calculate spacing in degrees latitude + perturb_in_m, _, _ = gps2dist_azimuth( + center_lat, center_lon, center_lat + perturb_in_deg, center_lon) + + spacing_lat = spacing_in_m * (perturb_in_deg/perturb_in_m) + + + # calculate spacing in degrees longitude + perturb_in_m, _, _ = gps2dist_azimuth( + center_lat, center_lon, center_lat, center_lon + perturb_in_deg) + + spacing_lon = spacing_in_m * (perturb_in_deg/perturb_in_m) + + edge_length_lat = spacing_lat*(npts_per_edge-1) + edge_length_lon = spacing_lon*(npts_per_edge-1) + + + # construct regularly-spaced grid + lat_vec = np.linspace( + center_lat-edge_length_lat/2., center_lat+edge_length_lat/2., npts_per_edge) + + lon_vec = np.linspace( + center_lon-edge_length_lon/2., center_lon+edge_length_lon/2., npts_per_edge) + + lat, lon = np.meshgrid(lat_vec, lon_vec) + + # return tuples + lat = lat.flatten() + lon = lon.flatten() + + return zip(lat, lon) + + +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/_modules/mtuq/wavelet.html b/_modules/mtuq/wavelet.html new file mode 100644 index 000000000..936222758 --- /dev/null +++ b/_modules/mtuq/wavelet.html @@ -0,0 +1,391 @@ + + + + + + + mtuq.wavelet — MTUQ Documentation + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +

Source code for mtuq.wavelet

+
+import warnings
+import numpy as np
+from scipy import signal
+
+
+
+
[docs]class Wavelet(object): + """ Source wavelet/source-time function base class + + Most easily, an analytical expression can be used to define the wavelet, but + a user-supplied time series or on-the-fly numerical procedure can also be + used. By inheriting from this class and implementing the ``evaluate`` + method, all of these differents types of wavelets can be defined. + + .. rubric:: Example + + We can implement a Gaussian function with unit standard deviation + as follows: + + .. code:: + + class SimpleGaussian(Wavelet): + def evaluate(self, t): + return ((2*np.pi)**0.5)**(-1.)*np.exp(-0.5*(t)**2.) + + We can now evaluate ``SimpleGaussian`` on any given set, say, on the + interval [-5, +5]: + + .. code:: + + wavelet = SimpleGaussian() + + t = np.linspace(-5,. +5., 101) + y = wavelet.evaluate(t) + + Or we can convolve it with an ObsPy trace: + + .. code:: + + from obspy import read + trace = read('http://examples.obspy.org/exaple_data.sac')[0] + convolved_trace = wavelet.convolve(trace) + + """ +
[docs] def evaluate(self, t): + """ Evaluates wavelet at chosen points + """ + raise NotImplementedError("Must be implemented by subclass")
+ + +
[docs] def convolve(self, trace): + """ Convolves ObsPy trace with given wavelet + """ + try: + y = trace.data + dt = trace.stats.delta + except: + raise Exception + trace.data = self._convolve_array(y, dt) + return trace
+ + +
[docs] def _evaluate_on_interval(self, half_duration=None, nt=100): + """ Evaluates wavelet on an interval about zero + """ + if not half_duration: + raise ValueError + assert half_duration > 0. + + t = np.linspace(-half_duration, +half_duration, nt) + w = self.evaluate(t) + + if _is_symmetric(w): + # trim symmetric wavelets only, otherwise any convolution results + # will be off-center + w = np.trim_zeros(w) + + return w
+ + +
[docs] def _convolve_array(self, y, dt, mode=1): + """ Convolves NumPy array with given wavelet + """ + nt = len(y) + half_duration = (nt-1)*dt/2. + w = self._evaluate_on_interval(half_duration, nt) + w *= dt + + if mode==1: + # frequency-domain implementation + return signal.fftconvolve(y, w, mode='same') + + elif mode==2: + # time-domain implementation + return np.convolve(y, w, mode='same')
+ + + +# +# user-supplied wavelet +# + + +class UserSupplied(Wavelet): + """ Wavelet obtained from an arbitrary user-supplied time series + """ + def __init__(self): + raise NotImplementedError + + +# +# basic mathematical shapes and functions +# + +class Triangle(Wavelet): + """ Triangle with unit area, symmetric about t=0 + """ + def __init__(self, half_duration=None): + if half_duration: + self.half_duration = half_duration + else: + raise ValueError + + def evaluate(self, t): + # construct a triangle with height = 1 and base = 2*half_duration + w = 1. - abs(t)/self.half_duration + w = np.clip(w, 0., np.inf) + + # area = (0.5)*(base)*(height) + area = (0.5)*(2.*self.half_duration)*(1.) + + # normalize by area + w /= area + + return w + + +class Trapezoid(Wavelet): + """ Trapezoid with unit area, symmetric about t=0 + """ + def __init__(self, rise_time=None, half_duration=None): + if rise_time: + self.rise_time = rise_time + else: + raise ValueError + + if half_duration: + self.half_duration = half_duration + else: + raise ValueError + + assert rise_time <= half_duration + + + def evaluate(self, t): + # construct a trapezoid with height = 1 + w = (self.half_duration - abs(t))/self.rise_time + w = np.clip(w, 0., 1.) + + top = 2*(self.half_duration-self.rise_time) + bottom = 2.*self.half_duration + height = 1. + + # normalize by area + area = (0.5)*(top + bottom)*(height) + w /= area + + return w + + +class Gaussian(Wavelet): + """ Gaussian with unit area + """ + def __init__(self, sigma=1., mu=0.): + self.sigma = sigma + self.mu = mu + + def evaluate(self, t): + return ((2*np.pi)**0.5*self.sigma)**(-1.)*\ + np.exp(-0.5*((t-self.mu)/self.sigma)**2.) + + +class Gabor(Wavelet): + def __init__(self, a=1., b=2.): + self.a = a + self.b = b + + def evaluate(self, t): + return np.exp(-(self.a*t)**2.)*np.cos(self.b*t) + + +# +# earthquake seismology "source-time functions" defined in terms of earthquake +# source parameters +# + +def EarthquakeTrapezoid(rise_time=None, rupture_time=None): + if not rise_time: + raise ValueError + + if not rupture_time: + raise ValueError + + assert rupture_time >= rise_time + + return Trapezoid( + rise_time=rise_time, + half_duration=(rise_time + rupture_time)/2.) + + +# +# exploration seismology "wavelets," defined in terms of dominant frequency +# + +class GaussianWavelet(Wavelet): + def __init__(self, dominant_frequency): + raise NotImplementedError + + +class RickerWavelet(Wavelet): + def __init__(self, dominant_frequency): + # dominant frequency + self.freq = dominant_frequency + + def evaluate(self, t): + a = 2.*np.pi*self.freq + return (1-0.5*(a*t)**2.)*np.exp(-0.25*(a*t)**2.) + + +class GaborWavelet(Wavelet): + def __init__(self, dominant_frequency): + # dominant frequency + self.freq = dominant_frequency + + def evaluate(self, t): + a = np.pi*self.freq + b = 2*np.pi*self.freq + return np.exp(-(a*t)**2.)*np.cos(b*t) + + +# +# utility functions +# + +def _is_symmetric(w): + npts = int(len(w)) + + if np.remainder(npts, 2) == 0: + half = int(npts/2) + # even number of points + return _is_close(w[half-1::-1], w[half:]) + + else: + # odd number of points + half = int((npts-1)/2) + return _is_close(w[half::-1], w[half:]) + + +def _is_close(w1, w2): + return np.all(np.isclose(w1, w2)) + + +
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/_sources/index.rst.txt b/_sources/index.rst.txt new file mode 100644 index 000000000..cb2a26617 --- /dev/null +++ b/_sources/index.rst.txt @@ -0,0 +1,28 @@ +MTUQ +==== + +Getting started +--------------- + +.. toctree:: + :maxdepth: 2 + + install/index + quick_start + + +User guide +---------- + +.. toctree:: + :maxdepth: 2 + + user_guide/01 + user_guide/02 + user_guide/03 + user_guide/04 + user_guide/05 + user_guide/06 + library/index + + diff --git a/_sources/install/arm64.rst.txt b/_sources/install/arm64.rst.txt new file mode 100644 index 000000000..9635138f7 --- /dev/null +++ b/_sources/install/arm64.rst.txt @@ -0,0 +1,65 @@ + +.. warning:: + + With newer versions of MTUQ, the same installation procedure works for Macs + as for other computers. Thus, the following modified procedure may no longer + be necessary (though it should still continue to work). + + + +Modified installation procedure for Apple M1 and Apple M2 Macs +============================================================== + +Newer Mac computers use proprietary Apple processors based on the ARM64 architecture. + +To install MTUQ on ARM64 systems, create a conda virtual environment: + +.. code:: + + conda create -n mtuq python=3 + + +Download the MTUQ source code: + +.. code:: + + git clone https://github.com/uafgeotools/mtuq.git + cd mtuq + + +Install MTUQ in editable mode: + +.. code:: + + conda activate mtuq + conda env update --file env_arm64.yaml + + +Unpack seismic waveforms used by examples: + +.. code:: + + bash ./data/examples/unpack.bash + bash ./data/tests/unpack.bash + + +Finally, install PyGMT: + +.. code:: + + conda install 'pygmt=0.9' + + +.. note:: + + Users may receive the following Instaseis warning: + + `UserWarning: Please don't install from a tarball. Use the proper pypi release or install from git.` + + In fact, env_arm64.yaml does install Instaseis from git, and the above message can be ignored. + + +.. note:: + + If `linux-aarch64` or `osx-arm64` builds are ever added to the Instaseis `conda-forge channel `_, the above workaround may become unnecessary. + diff --git a/_sources/install/index.rst.txt b/_sources/install/index.rst.txt new file mode 100644 index 000000000..324d206ce --- /dev/null +++ b/_sources/install/index.rst.txt @@ -0,0 +1,53 @@ +Installation +============ + +We recommend installing MTUQ under Miniconda, which can be obtained following `these instructions `_. + + +To install MTUQ, create a conda virtual environment: + +.. code:: + + conda create -n mtuq + + +Download the MTUQ source code: + +.. code:: + + git clone https://github.com/uafgeotools/mtuq.git + cd mtuq + + +Install in editable mode: + +.. code:: + + conda activate mtuq + conda env update --file env.yaml + + +Unpack seismic waveforms used by examples: + +.. code:: + + bash ./data/examples/unpack.bash + bash ./data/tests/unpack.bash + + +Finally, install PyGMT: + +.. code:: + + conda install 'pygmt=0.9' + +.. note:: + + PyGMT installation has been finicky at times, so we include it as a separate step after the main env.yaml-based installation. Most MTUQ functions will continue to work without PyGMT. (`See here `_ for more information.) + + +**Troubleshooting** + +For troubleshooting common installation issues, please `see here `_. + + diff --git a/_sources/install/issues.rst.txt b/_sources/install/issues.rst.txt new file mode 100644 index 000000000..5ac380216 --- /dev/null +++ b/_sources/install/issues.rst.txt @@ -0,0 +1,52 @@ + +Troubleshooting +=============== + + +PyGMT installation +------------------ + +MTUQ uses full moment tensor plotting functions from the PyGMT graphics library. + +To avoid a known issue with PyGMT installation under conda, it is necessary to specify a minimum PyGMT version as follows: + +.. code:: + + conda install 'pygmt>=0.9' + + +A more conservative approach, which avoids possible issues with PyGMT 0.10 releases, is to specify the more stable PyGMT 0.9 version: + +.. code:: + + conda install 'pygmt=0.9' + + +If PyGMT installation fails, most MTUQ functions will still work, but some plotting functions will fall back to GMT or ObsPy. + +We note that some versions of GMT and ObsPy do not plot `full moment tensors `_ correctly. + + + +Speeding up conda installs +-------------------------- + +Older versions of the conda package manager can be very slow. For a potential speed up, conda can be updated as follows: + +.. code:: + + conda update -n base conda + +For reference, the largest potential speed up comes from the new `mamba `_ dependency solver, which was `adopted `_ in the 23.10 release. + + + +MTUQ installation on Apple M1 and Apple M2 Macs +----------------------------------------------- + +Installation on Apple M1 and Apple M2 Macs is now possible using the default installation procedure. + +For older versions of MTUQ, a modified installation procedure may still be necessary. For more information, please see: + +`MTUQ installation on ARM64 systems `_ + diff --git a/_sources/install/virtualenv.rst.txt b/_sources/install/virtualenv.rst.txt new file mode 100644 index 000000000..4838c1d8f --- /dev/null +++ b/_sources/install/virtualenv.rst.txt @@ -0,0 +1,50 @@ +Installation under virtualenv +============================= + +Install virtualenv, if not already present, following these `instructions `_. + +Create a virtual environment: + +.. code:: + + virtualenv --python=python3 mtuq_env + + +Download MTUQ source code: + +.. code:: + + git clone https://github.com/uafgeotools/mtuq.git mtuq_src + + +Install MTUQ: + +.. code:: + + source mtuq_env/bin/activate + cd mtuq_src + pip install numpy + pip install scipy obspy instaseis pandas xarray netCDF4 h5py mpi4py + pip install -e . + + +If Instaseis installation fails, try: + +.. code:: + + CC=gfortran; pip install instaseis + + + +Unpack seismic waveforms used by examples: + +.. code:: + + bash ./data/examples/unpack.bash + bash ./data/tests/unpack.bash + + +Finally, `install PyGMT manually `_. + +(For an automated PyGMT installation, consider `installing MTUQ under conda `_ instead.) + diff --git a/_sources/library/autogen.rst.txt b/_sources/library/autogen.rst.txt new file mode 100644 index 000000000..bc738ef10 --- /dev/null +++ b/_sources/library/autogen.rst.txt @@ -0,0 +1,85 @@ +autogen +======= + +.. rubric:: Classes + +.. autosummary:: + :toctree: generated + + mtuq.Dataset + mtuq.GreensTensor + mtuq.GreensTensorList + mtuq.Origin + mtuq.Station + mtuq.graphics.plot_beachball + mtuq.graphics.plot_polarities + mtuq.graphics.plot_data_greens1 + mtuq.graphics.plot_data_greens2 + mtuq.graphics.plot_waveforms1 + mtuq.graphics.plot_waveforms2 + mtuq.graphics.plot_likelihood_lune + mtuq.graphics.plot_marginal_lune + mtuq.graphics.plot_misfit_lune + mtuq.graphics._plot_lune + mtuq.graphics.plot_likelihood_vw + mtuq.graphics.plot_marginal_vw + mtuq.graphics.plot_misfit_vw + mtuq.graphics._plot_vw + mtuq.graphics.plot_likelihood_dc + mtuq.graphics.plot_marginal_dc + mtuq.graphics.plot_misfit_dc + mtuq.graphics._plot_dc + mtuq.graphics.plot_likelihood_force + mtuq.graphics.plot_marginal_force + mtuq.graphics.plot_misfit_force + mtuq.graphics._plot_force + mtuq.graphics.plot_likelihood_depth + mtuq.graphics.plot_marginal_depth + mtuq.graphics.plot_misfit_depth + mtuq.graphics._plot_depth + mtuq.graphics.plot_likelihood_latlon + mtuq.graphics.plot_marginal_latlon + mtuq.graphics.plot_misfit_latlon + mtuq.graphics._plot_latlon + mtuq.graphics.plot_time_shifts + mtuq.graphics.plot_amplitude_ratios + mtuq.graphics.plot_log_amplitude_ratios + mtuq.graphics.plot_cross_corr + mtuq.graphics._plot_attrs + mtuq.graphics.attrs._default_backend + mtuq.graphics.attrs._pygmt_backend + mtuq.graphics.attrs.PyGMTUtilities + mtuq.grid.DeviatoricGridRandom + mtuq.grid.DeviatoricGridSemiregular + mtuq.grid.DoubleCoupleGridRandom + mtuq.grid.DoubleCoupleGridRegular + mtuq.grid.FullMomentTensorGridRandom + mtuq.grid.FullMomentTensorGridSemiregular + mtuq.grid.ForceGridRandom + mtuq.grid.ForceGridRegular + mtuq.grid.Grid + mtuq.grid.UnstructuredGrid + mtuq.grid.moment_tensor._semiregular + mtuq.grid_search.grid_search + mtuq.grid_search.open_ds + mtuq.grid_search.MTUQDataArray + mtuq.grid_search.MTUQDataFrame + mtuq.util.math.to_rtp + mtuq.Force + mtuq.MomentTensor + mtuq.Wavelet + mtuq.ProcessData + mtuq.PolarityMisfit + mtuq.WaveformMisfit + mtuq.download_greens_tensors + mtuq.open_db + mtuq.read + mtuq.io.clients.AxiSEM_NetCDF.Client + mtuq.io.clients.FK_SAC.Client + mtuq.io.clients.SPECFEM3D_SGT.Client + mtuq.io.clients.syngine.Client + mtuq.io.readers.SAC.read + mtuq.misfit.waveform.level0 + mtuq.misfit.waveform.level1 + mtuq.misfit.waveform.level2 + diff --git a/_sources/library/generated/mtuq.Dataset.append.rst.txt b/_sources/library/generated/mtuq.Dataset.append.rst.txt new file mode 100644 index 000000000..b91c8f6a7 --- /dev/null +++ b/_sources/library/generated/mtuq.Dataset.append.rst.txt @@ -0,0 +1,6 @@ +mtuq.Dataset.append +=================== + +.. currentmodule:: mtuq + +.. automethod:: Dataset.append \ No newline at end of file diff --git a/_sources/library/generated/mtuq.Dataset.apply.rst.txt b/_sources/library/generated/mtuq.Dataset.apply.rst.txt new file mode 100644 index 000000000..19fc933e0 --- /dev/null +++ b/_sources/library/generated/mtuq.Dataset.apply.rst.txt @@ -0,0 +1,6 @@ +mtuq.Dataset.apply +================== + +.. currentmodule:: mtuq + +.. automethod:: Dataset.apply \ No newline at end of file diff --git a/_sources/library/generated/mtuq.Dataset.copy.rst.txt b/_sources/library/generated/mtuq.Dataset.copy.rst.txt new file mode 100644 index 000000000..adb8eeb5e --- /dev/null +++ b/_sources/library/generated/mtuq.Dataset.copy.rst.txt @@ -0,0 +1,6 @@ +mtuq.Dataset.copy +================= + +.. currentmodule:: mtuq + +.. automethod:: Dataset.copy \ No newline at end of file diff --git a/_sources/library/generated/mtuq.Dataset.get_components.rst.txt b/_sources/library/generated/mtuq.Dataset.get_components.rst.txt new file mode 100644 index 000000000..736a03f03 --- /dev/null +++ b/_sources/library/generated/mtuq.Dataset.get_components.rst.txt @@ -0,0 +1,6 @@ +mtuq.Dataset.get_components +=========================== + +.. currentmodule:: mtuq + +.. automethod:: Dataset.get_components \ No newline at end of file diff --git a/_sources/library/generated/mtuq.Dataset.get_origins.rst.txt b/_sources/library/generated/mtuq.Dataset.get_origins.rst.txt new file mode 100644 index 000000000..22e8f779e --- /dev/null +++ b/_sources/library/generated/mtuq.Dataset.get_origins.rst.txt @@ -0,0 +1,6 @@ +mtuq.Dataset.get_origins +======================== + +.. currentmodule:: mtuq + +.. automethod:: Dataset.get_origins \ No newline at end of file diff --git a/_sources/library/generated/mtuq.Dataset.get_stations.rst.txt b/_sources/library/generated/mtuq.Dataset.get_stations.rst.txt new file mode 100644 index 000000000..ccd812317 --- /dev/null +++ b/_sources/library/generated/mtuq.Dataset.get_stations.rst.txt @@ -0,0 +1,6 @@ +mtuq.Dataset.get_stations +========================= + +.. currentmodule:: mtuq + +.. automethod:: Dataset.get_stations \ No newline at end of file diff --git a/_sources/library/generated/mtuq.Dataset.get_stats.rst.txt b/_sources/library/generated/mtuq.Dataset.get_stats.rst.txt new file mode 100644 index 000000000..12a74c39c --- /dev/null +++ b/_sources/library/generated/mtuq.Dataset.get_stats.rst.txt @@ -0,0 +1,6 @@ +mtuq.Dataset.get_stats +====================== + +.. currentmodule:: mtuq + +.. automethod:: Dataset.get_stats \ No newline at end of file diff --git a/_sources/library/generated/mtuq.Dataset.map.rst.txt b/_sources/library/generated/mtuq.Dataset.map.rst.txt new file mode 100644 index 000000000..0091b4694 --- /dev/null +++ b/_sources/library/generated/mtuq.Dataset.map.rst.txt @@ -0,0 +1,6 @@ +mtuq.Dataset.map +================ + +.. currentmodule:: mtuq + +.. automethod:: Dataset.map \ No newline at end of file diff --git a/_sources/library/generated/mtuq.Dataset.max.rst.txt b/_sources/library/generated/mtuq.Dataset.max.rst.txt new file mode 100644 index 000000000..37b95f229 --- /dev/null +++ b/_sources/library/generated/mtuq.Dataset.max.rst.txt @@ -0,0 +1,6 @@ +mtuq.Dataset.max +================ + +.. currentmodule:: mtuq + +.. automethod:: Dataset.max \ No newline at end of file diff --git a/_sources/library/generated/mtuq.Dataset.rst.txt b/_sources/library/generated/mtuq.Dataset.rst.txt new file mode 100644 index 000000000..9121ed9e6 --- /dev/null +++ b/_sources/library/generated/mtuq.Dataset.rst.txt @@ -0,0 +1,221 @@ +mtuq.Dataset +============ + +.. currentmodule:: mtuq +.. autoclass:: Dataset + :show-inheritance: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .. rubric:: Public Methods + + .. autosummary:: + :toctree: . + :nosignatures: + + ~Dataset.append + ~Dataset.apply + ~Dataset.copy + ~Dataset.get_components + ~Dataset.get_origins + ~Dataset.get_stations + ~Dataset.get_stats + ~Dataset.map + ~Dataset.max + ~Dataset.select + ~Dataset.sort_by_azimuth + ~Dataset.sort_by_distance + ~Dataset.sort_by_function + ~Dataset.tag_add + ~Dataset.tag_remove + ~Dataset.write + + + + + + \ No newline at end of file diff --git a/_sources/library/generated/mtuq.Dataset.select.rst.txt b/_sources/library/generated/mtuq.Dataset.select.rst.txt new file mode 100644 index 000000000..f2a42b570 --- /dev/null +++ b/_sources/library/generated/mtuq.Dataset.select.rst.txt @@ -0,0 +1,6 @@ +mtuq.Dataset.select +=================== + +.. currentmodule:: mtuq + +.. automethod:: Dataset.select \ No newline at end of file diff --git a/_sources/library/generated/mtuq.Dataset.sort_by_azimuth.rst.txt b/_sources/library/generated/mtuq.Dataset.sort_by_azimuth.rst.txt new file mode 100644 index 000000000..1b3a48108 --- /dev/null +++ b/_sources/library/generated/mtuq.Dataset.sort_by_azimuth.rst.txt @@ -0,0 +1,6 @@ +mtuq.Dataset.sort_by_azimuth +============================ + +.. currentmodule:: mtuq + +.. automethod:: Dataset.sort_by_azimuth \ No newline at end of file diff --git a/_sources/library/generated/mtuq.Dataset.sort_by_distance.rst.txt b/_sources/library/generated/mtuq.Dataset.sort_by_distance.rst.txt new file mode 100644 index 000000000..2d0b562d5 --- /dev/null +++ b/_sources/library/generated/mtuq.Dataset.sort_by_distance.rst.txt @@ -0,0 +1,6 @@ +mtuq.Dataset.sort_by_distance +============================= + +.. currentmodule:: mtuq + +.. automethod:: Dataset.sort_by_distance \ No newline at end of file diff --git a/_sources/library/generated/mtuq.Dataset.sort_by_function.rst.txt b/_sources/library/generated/mtuq.Dataset.sort_by_function.rst.txt new file mode 100644 index 000000000..d6d566fe5 --- /dev/null +++ b/_sources/library/generated/mtuq.Dataset.sort_by_function.rst.txt @@ -0,0 +1,6 @@ +mtuq.Dataset.sort_by_function +============================= + +.. currentmodule:: mtuq + +.. automethod:: Dataset.sort_by_function \ No newline at end of file diff --git a/_sources/library/generated/mtuq.Dataset.tag_add.rst.txt b/_sources/library/generated/mtuq.Dataset.tag_add.rst.txt new file mode 100644 index 000000000..a2d900324 --- /dev/null +++ b/_sources/library/generated/mtuq.Dataset.tag_add.rst.txt @@ -0,0 +1,6 @@ +mtuq.Dataset.tag_add +==================== + +.. currentmodule:: mtuq + +.. automethod:: Dataset.tag_add \ No newline at end of file diff --git a/_sources/library/generated/mtuq.Dataset.tag_remove.rst.txt b/_sources/library/generated/mtuq.Dataset.tag_remove.rst.txt new file mode 100644 index 000000000..96fbe6a74 --- /dev/null +++ b/_sources/library/generated/mtuq.Dataset.tag_remove.rst.txt @@ -0,0 +1,6 @@ +mtuq.Dataset.tag_remove +======================= + +.. currentmodule:: mtuq + +.. automethod:: Dataset.tag_remove \ No newline at end of file diff --git a/_sources/library/generated/mtuq.Dataset.write.rst.txt b/_sources/library/generated/mtuq.Dataset.write.rst.txt new file mode 100644 index 000000000..8b7b762ef --- /dev/null +++ b/_sources/library/generated/mtuq.Dataset.write.rst.txt @@ -0,0 +1,6 @@ +mtuq.Dataset.write +================== + +.. currentmodule:: mtuq + +.. automethod:: Dataset.write \ No newline at end of file diff --git a/_sources/library/generated/mtuq.Force.as_dict.rst.txt b/_sources/library/generated/mtuq.Force.as_dict.rst.txt new file mode 100644 index 000000000..18c7c9889 --- /dev/null +++ b/_sources/library/generated/mtuq.Force.as_dict.rst.txt @@ -0,0 +1,6 @@ +mtuq.Force.as_dict +================== + +.. currentmodule:: mtuq + +.. automethod:: Force.as_dict \ No newline at end of file diff --git a/_sources/library/generated/mtuq.Force.as_vector.rst.txt b/_sources/library/generated/mtuq.Force.as_vector.rst.txt new file mode 100644 index 000000000..8adb1bfe7 --- /dev/null +++ b/_sources/library/generated/mtuq.Force.as_vector.rst.txt @@ -0,0 +1,6 @@ +mtuq.Force.as_vector +==================== + +.. currentmodule:: mtuq + +.. automethod:: Force.as_vector \ No newline at end of file diff --git a/_sources/library/generated/mtuq.Force.cast.rst.txt b/_sources/library/generated/mtuq.Force.cast.rst.txt new file mode 100644 index 000000000..20ede0bc1 --- /dev/null +++ b/_sources/library/generated/mtuq.Force.cast.rst.txt @@ -0,0 +1,6 @@ +mtuq.Force.cast +=============== + +.. currentmodule:: mtuq + +.. automethod:: Force.cast \ No newline at end of file diff --git a/_sources/library/generated/mtuq.Force.rst.txt b/_sources/library/generated/mtuq.Force.rst.txt new file mode 100644 index 000000000..1a9e40480 --- /dev/null +++ b/_sources/library/generated/mtuq.Force.rst.txt @@ -0,0 +1,103 @@ +mtuq.Force +========== + +.. currentmodule:: mtuq +.. autoclass:: Force + :show-inheritance: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .. rubric:: Public Methods + + .. autosummary:: + :toctree: . + :nosignatures: + + ~Force.as_dict + ~Force.as_vector + ~Force.cast + + + + + + \ No newline at end of file diff --git a/_sources/library/generated/mtuq.GreensTensor._allocate_stream.rst.txt b/_sources/library/generated/mtuq.GreensTensor._allocate_stream.rst.txt new file mode 100644 index 000000000..75e817beb --- /dev/null +++ b/_sources/library/generated/mtuq.GreensTensor._allocate_stream.rst.txt @@ -0,0 +1,6 @@ +mtuq.GreensTensor._allocate_stream +================================== + +.. currentmodule:: mtuq + +.. automethod:: GreensTensor._allocate_stream \ No newline at end of file diff --git a/_sources/library/generated/mtuq.GreensTensor._get_shape.rst.txt b/_sources/library/generated/mtuq.GreensTensor._get_shape.rst.txt new file mode 100644 index 000000000..ead1964af --- /dev/null +++ b/_sources/library/generated/mtuq.GreensTensor._get_shape.rst.txt @@ -0,0 +1,6 @@ +mtuq.GreensTensor._get_shape +============================ + +.. currentmodule:: mtuq + +.. automethod:: GreensTensor._get_shape \ No newline at end of file diff --git a/_sources/library/generated/mtuq.GreensTensor._preallocate.rst.txt b/_sources/library/generated/mtuq.GreensTensor._preallocate.rst.txt new file mode 100644 index 000000000..7cee1ec21 --- /dev/null +++ b/_sources/library/generated/mtuq.GreensTensor._preallocate.rst.txt @@ -0,0 +1,6 @@ +mtuq.GreensTensor._preallocate +============================== + +.. currentmodule:: mtuq + +.. automethod:: GreensTensor._preallocate \ No newline at end of file diff --git a/_sources/library/generated/mtuq.GreensTensor._precompute.rst.txt b/_sources/library/generated/mtuq.GreensTensor._precompute.rst.txt new file mode 100644 index 000000000..225536d62 --- /dev/null +++ b/_sources/library/generated/mtuq.GreensTensor._precompute.rst.txt @@ -0,0 +1,6 @@ +mtuq.GreensTensor._precompute +============================= + +.. currentmodule:: mtuq + +.. automethod:: GreensTensor._precompute \ No newline at end of file diff --git a/_sources/library/generated/mtuq.GreensTensor._set_components.rst.txt b/_sources/library/generated/mtuq.GreensTensor._set_components.rst.txt new file mode 100644 index 000000000..8b9ff6ceb --- /dev/null +++ b/_sources/library/generated/mtuq.GreensTensor._set_components.rst.txt @@ -0,0 +1,6 @@ +mtuq.GreensTensor._set_components +================================= + +.. currentmodule:: mtuq + +.. automethod:: GreensTensor._set_components \ No newline at end of file diff --git a/_sources/library/generated/mtuq.GreensTensor.convolve.rst.txt b/_sources/library/generated/mtuq.GreensTensor.convolve.rst.txt new file mode 100644 index 000000000..87399046c --- /dev/null +++ b/_sources/library/generated/mtuq.GreensTensor.convolve.rst.txt @@ -0,0 +1,6 @@ +mtuq.GreensTensor.convolve +========================== + +.. currentmodule:: mtuq + +.. automethod:: GreensTensor.convolve \ No newline at end of file diff --git a/_sources/library/generated/mtuq.GreensTensor.get_synthetics.rst.txt b/_sources/library/generated/mtuq.GreensTensor.get_synthetics.rst.txt new file mode 100644 index 000000000..f3a01279d --- /dev/null +++ b/_sources/library/generated/mtuq.GreensTensor.get_synthetics.rst.txt @@ -0,0 +1,6 @@ +mtuq.GreensTensor.get_synthetics +================================ + +.. currentmodule:: mtuq + +.. automethod:: GreensTensor.get_synthetics \ No newline at end of file diff --git a/_sources/library/generated/mtuq.GreensTensor.rst.txt b/_sources/library/generated/mtuq.GreensTensor.rst.txt new file mode 100644 index 000000000..a30d7e4d3 --- /dev/null +++ b/_sources/library/generated/mtuq.GreensTensor.rst.txt @@ -0,0 +1,314 @@ +mtuq.GreensTensor +================= + +.. currentmodule:: mtuq +.. autoclass:: GreensTensor + :show-inheritance: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .. rubric:: Public Methods + + .. autosummary:: + :toctree: . + :nosignatures: + + ~GreensTensor.convolve + ~GreensTensor.get_synthetics + ~GreensTensor.select + + + + .. rubric:: Private Methods + + .. warning:: + + Private methods are mainly for internal/developer use and their API might change without notice. + + .. autosummary:: + :toctree: . + :nosignatures: + + ~GreensTensor._allocate_stream + ~GreensTensor._get_shape + ~GreensTensor._preallocate + ~GreensTensor._precompute + ~GreensTensor._set_components + + + + \ No newline at end of file diff --git a/_sources/library/generated/mtuq.GreensTensor.select.rst.txt b/_sources/library/generated/mtuq.GreensTensor.select.rst.txt new file mode 100644 index 000000000..1afddb4bb --- /dev/null +++ b/_sources/library/generated/mtuq.GreensTensor.select.rst.txt @@ -0,0 +1,6 @@ +mtuq.GreensTensor.select +======================== + +.. currentmodule:: mtuq + +.. automethod:: GreensTensor.select \ No newline at end of file diff --git a/_sources/library/generated/mtuq.GreensTensorList.append.rst.txt b/_sources/library/generated/mtuq.GreensTensorList.append.rst.txt new file mode 100644 index 000000000..72a669d11 --- /dev/null +++ b/_sources/library/generated/mtuq.GreensTensorList.append.rst.txt @@ -0,0 +1,6 @@ +mtuq.GreensTensorList.append +============================ + +.. currentmodule:: mtuq + +.. automethod:: GreensTensorList.append \ No newline at end of file diff --git a/_sources/library/generated/mtuq.GreensTensorList.apply.rst.txt b/_sources/library/generated/mtuq.GreensTensorList.apply.rst.txt new file mode 100644 index 000000000..8b2d9bf00 --- /dev/null +++ b/_sources/library/generated/mtuq.GreensTensorList.apply.rst.txt @@ -0,0 +1,6 @@ +mtuq.GreensTensorList.apply +=========================== + +.. currentmodule:: mtuq + +.. automethod:: GreensTensorList.apply \ No newline at end of file diff --git a/_sources/library/generated/mtuq.GreensTensorList.convolve.rst.txt b/_sources/library/generated/mtuq.GreensTensorList.convolve.rst.txt new file mode 100644 index 000000000..003d44909 --- /dev/null +++ b/_sources/library/generated/mtuq.GreensTensorList.convolve.rst.txt @@ -0,0 +1,6 @@ +mtuq.GreensTensorList.convolve +============================== + +.. currentmodule:: mtuq + +.. automethod:: GreensTensorList.convolve \ No newline at end of file diff --git a/_sources/library/generated/mtuq.GreensTensorList.copy.rst.txt b/_sources/library/generated/mtuq.GreensTensorList.copy.rst.txt new file mode 100644 index 000000000..0777ab843 --- /dev/null +++ b/_sources/library/generated/mtuq.GreensTensorList.copy.rst.txt @@ -0,0 +1,6 @@ +mtuq.GreensTensorList.copy +========================== + +.. currentmodule:: mtuq + +.. automethod:: GreensTensorList.copy \ No newline at end of file diff --git a/_sources/library/generated/mtuq.GreensTensorList.get_synthetics.rst.txt b/_sources/library/generated/mtuq.GreensTensorList.get_synthetics.rst.txt new file mode 100644 index 000000000..9c28abda3 --- /dev/null +++ b/_sources/library/generated/mtuq.GreensTensorList.get_synthetics.rst.txt @@ -0,0 +1,6 @@ +mtuq.GreensTensorList.get_synthetics +==================================== + +.. currentmodule:: mtuq + +.. automethod:: GreensTensorList.get_synthetics \ No newline at end of file diff --git a/_sources/library/generated/mtuq.GreensTensorList.map.rst.txt b/_sources/library/generated/mtuq.GreensTensorList.map.rst.txt new file mode 100644 index 000000000..69cd6b460 --- /dev/null +++ b/_sources/library/generated/mtuq.GreensTensorList.map.rst.txt @@ -0,0 +1,6 @@ +mtuq.GreensTensorList.map +========================= + +.. currentmodule:: mtuq + +.. automethod:: GreensTensorList.map \ No newline at end of file diff --git a/_sources/library/generated/mtuq.GreensTensorList.parallel_map.rst.txt b/_sources/library/generated/mtuq.GreensTensorList.parallel_map.rst.txt new file mode 100644 index 000000000..d23b002ea --- /dev/null +++ b/_sources/library/generated/mtuq.GreensTensorList.parallel_map.rst.txt @@ -0,0 +1,6 @@ +mtuq.GreensTensorList.parallel_map +================================== + +.. currentmodule:: mtuq + +.. automethod:: GreensTensorList.parallel_map \ No newline at end of file diff --git a/_sources/library/generated/mtuq.GreensTensorList.rst.txt b/_sources/library/generated/mtuq.GreensTensorList.rst.txt new file mode 100644 index 000000000..9ab64c8dc --- /dev/null +++ b/_sources/library/generated/mtuq.GreensTensorList.rst.txt @@ -0,0 +1,213 @@ +mtuq.GreensTensorList +===================== + +.. currentmodule:: mtuq +.. autoclass:: GreensTensorList + :show-inheritance: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .. rubric:: Public Methods + + .. autosummary:: + :toctree: . + :nosignatures: + + ~GreensTensorList.append + ~GreensTensorList.apply + ~GreensTensorList.convolve + ~GreensTensorList.copy + ~GreensTensorList.get_synthetics + ~GreensTensorList.map + ~GreensTensorList.parallel_map + ~GreensTensorList.select + ~GreensTensorList.sort_by_azimuth + ~GreensTensorList.sort_by_distance + ~GreensTensorList.sort_by_function + ~GreensTensorList.tag_add + ~GreensTensorList.tag_remove + ~GreensTensorList.write + + + + + + \ No newline at end of file diff --git a/_sources/library/generated/mtuq.GreensTensorList.select.rst.txt b/_sources/library/generated/mtuq.GreensTensorList.select.rst.txt new file mode 100644 index 000000000..8f9e0196b --- /dev/null +++ b/_sources/library/generated/mtuq.GreensTensorList.select.rst.txt @@ -0,0 +1,6 @@ +mtuq.GreensTensorList.select +============================ + +.. currentmodule:: mtuq + +.. automethod:: GreensTensorList.select \ No newline at end of file diff --git a/_sources/library/generated/mtuq.GreensTensorList.sort_by_azimuth.rst.txt b/_sources/library/generated/mtuq.GreensTensorList.sort_by_azimuth.rst.txt new file mode 100644 index 000000000..1f7feebb8 --- /dev/null +++ b/_sources/library/generated/mtuq.GreensTensorList.sort_by_azimuth.rst.txt @@ -0,0 +1,6 @@ +mtuq.GreensTensorList.sort_by_azimuth +===================================== + +.. currentmodule:: mtuq + +.. automethod:: GreensTensorList.sort_by_azimuth \ No newline at end of file diff --git a/_sources/library/generated/mtuq.GreensTensorList.sort_by_distance.rst.txt b/_sources/library/generated/mtuq.GreensTensorList.sort_by_distance.rst.txt new file mode 100644 index 000000000..d2c76b231 --- /dev/null +++ b/_sources/library/generated/mtuq.GreensTensorList.sort_by_distance.rst.txt @@ -0,0 +1,6 @@ +mtuq.GreensTensorList.sort_by_distance +====================================== + +.. currentmodule:: mtuq + +.. automethod:: GreensTensorList.sort_by_distance \ No newline at end of file diff --git a/_sources/library/generated/mtuq.GreensTensorList.sort_by_function.rst.txt b/_sources/library/generated/mtuq.GreensTensorList.sort_by_function.rst.txt new file mode 100644 index 000000000..802fc66ae --- /dev/null +++ b/_sources/library/generated/mtuq.GreensTensorList.sort_by_function.rst.txt @@ -0,0 +1,6 @@ +mtuq.GreensTensorList.sort_by_function +====================================== + +.. currentmodule:: mtuq + +.. automethod:: GreensTensorList.sort_by_function \ No newline at end of file diff --git a/_sources/library/generated/mtuq.GreensTensorList.tag_add.rst.txt b/_sources/library/generated/mtuq.GreensTensorList.tag_add.rst.txt new file mode 100644 index 000000000..510dcdc1f --- /dev/null +++ b/_sources/library/generated/mtuq.GreensTensorList.tag_add.rst.txt @@ -0,0 +1,6 @@ +mtuq.GreensTensorList.tag_add +============================= + +.. currentmodule:: mtuq + +.. automethod:: GreensTensorList.tag_add \ No newline at end of file diff --git a/_sources/library/generated/mtuq.GreensTensorList.tag_remove.rst.txt b/_sources/library/generated/mtuq.GreensTensorList.tag_remove.rst.txt new file mode 100644 index 000000000..c4bdd3249 --- /dev/null +++ b/_sources/library/generated/mtuq.GreensTensorList.tag_remove.rst.txt @@ -0,0 +1,6 @@ +mtuq.GreensTensorList.tag_remove +================================ + +.. currentmodule:: mtuq + +.. automethod:: GreensTensorList.tag_remove \ No newline at end of file diff --git a/_sources/library/generated/mtuq.GreensTensorList.write.rst.txt b/_sources/library/generated/mtuq.GreensTensorList.write.rst.txt new file mode 100644 index 000000000..8cffd6a62 --- /dev/null +++ b/_sources/library/generated/mtuq.GreensTensorList.write.rst.txt @@ -0,0 +1,6 @@ +mtuq.GreensTensorList.write +=========================== + +.. currentmodule:: mtuq + +.. automethod:: GreensTensorList.write \ No newline at end of file diff --git a/_sources/library/generated/mtuq.MomentTensor.as_dict.rst.txt b/_sources/library/generated/mtuq.MomentTensor.as_dict.rst.txt new file mode 100644 index 000000000..c1f552aa5 --- /dev/null +++ b/_sources/library/generated/mtuq.MomentTensor.as_dict.rst.txt @@ -0,0 +1,6 @@ +mtuq.MomentTensor.as_dict +========================= + +.. currentmodule:: mtuq + +.. automethod:: MomentTensor.as_dict \ No newline at end of file diff --git a/_sources/library/generated/mtuq.MomentTensor.as_matrix.rst.txt b/_sources/library/generated/mtuq.MomentTensor.as_matrix.rst.txt new file mode 100644 index 000000000..a7c7484c2 --- /dev/null +++ b/_sources/library/generated/mtuq.MomentTensor.as_matrix.rst.txt @@ -0,0 +1,6 @@ +mtuq.MomentTensor.as_matrix +=========================== + +.. currentmodule:: mtuq + +.. automethod:: MomentTensor.as_matrix \ No newline at end of file diff --git a/_sources/library/generated/mtuq.MomentTensor.as_vector.rst.txt b/_sources/library/generated/mtuq.MomentTensor.as_vector.rst.txt new file mode 100644 index 000000000..5a5752f61 --- /dev/null +++ b/_sources/library/generated/mtuq.MomentTensor.as_vector.rst.txt @@ -0,0 +1,6 @@ +mtuq.MomentTensor.as_vector +=========================== + +.. currentmodule:: mtuq + +.. automethod:: MomentTensor.as_vector \ No newline at end of file diff --git a/_sources/library/generated/mtuq.MomentTensor.cast.rst.txt b/_sources/library/generated/mtuq.MomentTensor.cast.rst.txt new file mode 100644 index 000000000..6b4db8b3d --- /dev/null +++ b/_sources/library/generated/mtuq.MomentTensor.cast.rst.txt @@ -0,0 +1,6 @@ +mtuq.MomentTensor.cast +====================== + +.. currentmodule:: mtuq + +.. automethod:: MomentTensor.cast \ No newline at end of file diff --git a/_sources/library/generated/mtuq.MomentTensor.magnitude.rst.txt b/_sources/library/generated/mtuq.MomentTensor.magnitude.rst.txt new file mode 100644 index 000000000..077a3949d --- /dev/null +++ b/_sources/library/generated/mtuq.MomentTensor.magnitude.rst.txt @@ -0,0 +1,6 @@ +mtuq.MomentTensor.magnitude +=========================== + +.. currentmodule:: mtuq + +.. automethod:: MomentTensor.magnitude \ No newline at end of file diff --git a/_sources/library/generated/mtuq.MomentTensor.moment.rst.txt b/_sources/library/generated/mtuq.MomentTensor.moment.rst.txt new file mode 100644 index 000000000..b486cdb33 --- /dev/null +++ b/_sources/library/generated/mtuq.MomentTensor.moment.rst.txt @@ -0,0 +1,6 @@ +mtuq.MomentTensor.moment +======================== + +.. currentmodule:: mtuq + +.. automethod:: MomentTensor.moment \ No newline at end of file diff --git a/_sources/library/generated/mtuq.MomentTensor.rst.txt b/_sources/library/generated/mtuq.MomentTensor.rst.txt new file mode 100644 index 000000000..0d4c027d9 --- /dev/null +++ b/_sources/library/generated/mtuq.MomentTensor.rst.txt @@ -0,0 +1,115 @@ +mtuq.MomentTensor +================= + +.. currentmodule:: mtuq +.. autoclass:: MomentTensor + :show-inheritance: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .. rubric:: Public Methods + + .. autosummary:: + :toctree: . + :nosignatures: + + ~MomentTensor.as_dict + ~MomentTensor.as_matrix + ~MomentTensor.as_vector + ~MomentTensor.cast + ~MomentTensor.magnitude + ~MomentTensor.moment + + + + + + \ No newline at end of file diff --git a/_sources/library/generated/mtuq.Origin.as_dict.rst.txt b/_sources/library/generated/mtuq.Origin.as_dict.rst.txt new file mode 100644 index 000000000..daab077d0 --- /dev/null +++ b/_sources/library/generated/mtuq.Origin.as_dict.rst.txt @@ -0,0 +1,6 @@ +mtuq.Origin.as_dict +=================== + +.. currentmodule:: mtuq + +.. automethod:: Origin.as_dict \ No newline at end of file diff --git a/_sources/library/generated/mtuq.Origin.rst.txt b/_sources/library/generated/mtuq.Origin.rst.txt new file mode 100644 index 000000000..7ac96abbf --- /dev/null +++ b/_sources/library/generated/mtuq.Origin.rst.txt @@ -0,0 +1,158 @@ +mtuq.Origin +=========== + +.. currentmodule:: mtuq +.. autoclass:: Origin + :show-inheritance: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .. rubric:: Public Methods + + .. autosummary:: + :toctree: . + :nosignatures: + + ~Origin.as_dict + + + + + + \ No newline at end of file diff --git a/_sources/library/generated/mtuq.PolarityMisfit.collect_attributes.rst.txt b/_sources/library/generated/mtuq.PolarityMisfit.collect_attributes.rst.txt new file mode 100644 index 000000000..488b71e01 --- /dev/null +++ b/_sources/library/generated/mtuq.PolarityMisfit.collect_attributes.rst.txt @@ -0,0 +1,6 @@ +mtuq.PolarityMisfit.collect_attributes +====================================== + +.. currentmodule:: mtuq + +.. automethod:: PolarityMisfit.collect_attributes \ No newline at end of file diff --git a/_sources/library/generated/mtuq.PolarityMisfit.get_observed.rst.txt b/_sources/library/generated/mtuq.PolarityMisfit.get_observed.rst.txt new file mode 100644 index 000000000..a7df47edd --- /dev/null +++ b/_sources/library/generated/mtuq.PolarityMisfit.get_observed.rst.txt @@ -0,0 +1,6 @@ +mtuq.PolarityMisfit.get_observed +================================ + +.. currentmodule:: mtuq + +.. automethod:: PolarityMisfit.get_observed \ No newline at end of file diff --git a/_sources/library/generated/mtuq.PolarityMisfit.get_predicted.rst.txt b/_sources/library/generated/mtuq.PolarityMisfit.get_predicted.rst.txt new file mode 100644 index 000000000..695c93547 --- /dev/null +++ b/_sources/library/generated/mtuq.PolarityMisfit.get_predicted.rst.txt @@ -0,0 +1,6 @@ +mtuq.PolarityMisfit.get_predicted +================================= + +.. currentmodule:: mtuq + +.. automethod:: PolarityMisfit.get_predicted \ No newline at end of file diff --git a/_sources/library/generated/mtuq.PolarityMisfit.rst.txt b/_sources/library/generated/mtuq.PolarityMisfit.rst.txt new file mode 100644 index 000000000..f5e0ef0aa --- /dev/null +++ b/_sources/library/generated/mtuq.PolarityMisfit.rst.txt @@ -0,0 +1,106 @@ +mtuq.PolarityMisfit +=================== + +.. currentmodule:: mtuq +.. autoclass:: PolarityMisfit + :show-inheritance: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .. rubric:: Public Methods + + .. autosummary:: + :toctree: . + :nosignatures: + + ~PolarityMisfit.collect_attributes + ~PolarityMisfit.get_observed + ~PolarityMisfit.get_predicted + + + + + + \ No newline at end of file diff --git a/_sources/library/generated/mtuq.ProcessData.rst.txt b/_sources/library/generated/mtuq.ProcessData.rst.txt new file mode 100644 index 000000000..41ca48ed0 --- /dev/null +++ b/_sources/library/generated/mtuq.ProcessData.rst.txt @@ -0,0 +1,87 @@ +mtuq.ProcessData +================ + +.. currentmodule:: mtuq +.. autoclass:: ProcessData + :show-inheritance: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/_sources/library/generated/mtuq.Station._refresh.rst.txt b/_sources/library/generated/mtuq.Station._refresh.rst.txt new file mode 100644 index 000000000..ebda28441 --- /dev/null +++ b/_sources/library/generated/mtuq.Station._refresh.rst.txt @@ -0,0 +1,6 @@ +mtuq.Station._refresh +===================== + +.. currentmodule:: mtuq + +.. automethod:: Station._refresh \ No newline at end of file diff --git a/_sources/library/generated/mtuq.Station.rst.txt b/_sources/library/generated/mtuq.Station.rst.txt new file mode 100644 index 000000000..2acf05344 --- /dev/null +++ b/_sources/library/generated/mtuq.Station.rst.txt @@ -0,0 +1,162 @@ +mtuq.Station +============ + +.. currentmodule:: mtuq +.. autoclass:: Station + :show-inheritance: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .. rubric:: Private Methods + + .. warning:: + + Private methods are mainly for internal/developer use and their API might change without notice. + + .. autosummary:: + :toctree: . + :nosignatures: + + ~Station._refresh + + + + \ No newline at end of file diff --git a/_sources/library/generated/mtuq.WaveformMisfit.collect_attributes.rst.txt b/_sources/library/generated/mtuq.WaveformMisfit.collect_attributes.rst.txt new file mode 100644 index 000000000..7db0a16a8 --- /dev/null +++ b/_sources/library/generated/mtuq.WaveformMisfit.collect_attributes.rst.txt @@ -0,0 +1,6 @@ +mtuq.WaveformMisfit.collect_attributes +====================================== + +.. currentmodule:: mtuq + +.. automethod:: WaveformMisfit.collect_attributes \ No newline at end of file diff --git a/_sources/library/generated/mtuq.WaveformMisfit.collect_synthetics.rst.txt b/_sources/library/generated/mtuq.WaveformMisfit.collect_synthetics.rst.txt new file mode 100644 index 000000000..1c477ffcc --- /dev/null +++ b/_sources/library/generated/mtuq.WaveformMisfit.collect_synthetics.rst.txt @@ -0,0 +1,6 @@ +mtuq.WaveformMisfit.collect_synthetics +====================================== + +.. currentmodule:: mtuq + +.. automethod:: WaveformMisfit.collect_synthetics \ No newline at end of file diff --git a/_sources/library/generated/mtuq.WaveformMisfit.rst.txt b/_sources/library/generated/mtuq.WaveformMisfit.rst.txt new file mode 100644 index 000000000..dd0ba22ea --- /dev/null +++ b/_sources/library/generated/mtuq.WaveformMisfit.rst.txt @@ -0,0 +1,102 @@ +mtuq.WaveformMisfit +=================== + +.. currentmodule:: mtuq +.. autoclass:: WaveformMisfit + :show-inheritance: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .. rubric:: Public Methods + + .. autosummary:: + :toctree: . + :nosignatures: + + ~WaveformMisfit.collect_attributes + ~WaveformMisfit.collect_synthetics + + + + + + \ No newline at end of file diff --git a/_sources/library/generated/mtuq.Wavelet._convolve_array.rst.txt b/_sources/library/generated/mtuq.Wavelet._convolve_array.rst.txt new file mode 100644 index 000000000..5ed46275e --- /dev/null +++ b/_sources/library/generated/mtuq.Wavelet._convolve_array.rst.txt @@ -0,0 +1,6 @@ +mtuq.Wavelet._convolve_array +============================ + +.. currentmodule:: mtuq + +.. automethod:: Wavelet._convolve_array \ No newline at end of file diff --git a/_sources/library/generated/mtuq.Wavelet._evaluate_on_interval.rst.txt b/_sources/library/generated/mtuq.Wavelet._evaluate_on_interval.rst.txt new file mode 100644 index 000000000..47c09c0b8 --- /dev/null +++ b/_sources/library/generated/mtuq.Wavelet._evaluate_on_interval.rst.txt @@ -0,0 +1,6 @@ +mtuq.Wavelet._evaluate_on_interval +================================== + +.. currentmodule:: mtuq + +.. automethod:: Wavelet._evaluate_on_interval \ No newline at end of file diff --git a/_sources/library/generated/mtuq.Wavelet.convolve.rst.txt b/_sources/library/generated/mtuq.Wavelet.convolve.rst.txt new file mode 100644 index 000000000..ed9e026fa --- /dev/null +++ b/_sources/library/generated/mtuq.Wavelet.convolve.rst.txt @@ -0,0 +1,6 @@ +mtuq.Wavelet.convolve +===================== + +.. currentmodule:: mtuq + +.. automethod:: Wavelet.convolve \ No newline at end of file diff --git a/_sources/library/generated/mtuq.Wavelet.evaluate.rst.txt b/_sources/library/generated/mtuq.Wavelet.evaluate.rst.txt new file mode 100644 index 000000000..b69fe6e74 --- /dev/null +++ b/_sources/library/generated/mtuq.Wavelet.evaluate.rst.txt @@ -0,0 +1,6 @@ +mtuq.Wavelet.evaluate +===================== + +.. currentmodule:: mtuq + +.. automethod:: Wavelet.evaluate \ No newline at end of file diff --git a/_sources/library/generated/mtuq.Wavelet.rst.txt b/_sources/library/generated/mtuq.Wavelet.rst.txt new file mode 100644 index 000000000..f59e6a9f6 --- /dev/null +++ b/_sources/library/generated/mtuq.Wavelet.rst.txt @@ -0,0 +1,118 @@ +mtuq.Wavelet +============ + +.. currentmodule:: mtuq +.. autoclass:: Wavelet + :show-inheritance: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .. rubric:: Public Methods + + .. autosummary:: + :toctree: . + :nosignatures: + + ~Wavelet.convolve + ~Wavelet.evaluate + + + + .. rubric:: Private Methods + + .. warning:: + + Private methods are mainly for internal/developer use and their API might change without notice. + + .. autosummary:: + :toctree: . + :nosignatures: + + ~Wavelet._convolve_array + ~Wavelet._evaluate_on_interval + + + + \ No newline at end of file diff --git a/_sources/library/generated/mtuq.download_greens_tensors.rst.txt b/_sources/library/generated/mtuq.download_greens_tensors.rst.txt new file mode 100644 index 000000000..92c4585ed --- /dev/null +++ b/_sources/library/generated/mtuq.download_greens_tensors.rst.txt @@ -0,0 +1,6 @@ +mtuq.download_greens_tensors +============================ + +.. currentmodule:: mtuq + +.. autofunction:: download_greens_tensors \ No newline at end of file diff --git a/_sources/library/generated/mtuq.graphics._plot_attrs.rst.txt b/_sources/library/generated/mtuq.graphics._plot_attrs.rst.txt new file mode 100644 index 000000000..0d44c2a50 --- /dev/null +++ b/_sources/library/generated/mtuq.graphics._plot_attrs.rst.txt @@ -0,0 +1,6 @@ +mtuq.graphics._plot_attrs +========================= + +.. currentmodule:: mtuq.graphics + +.. autofunction:: _plot_attrs \ No newline at end of file diff --git a/_sources/library/generated/mtuq.graphics._plot_dc.rst.txt b/_sources/library/generated/mtuq.graphics._plot_dc.rst.txt new file mode 100644 index 000000000..bd5a938fe --- /dev/null +++ b/_sources/library/generated/mtuq.graphics._plot_dc.rst.txt @@ -0,0 +1,6 @@ +mtuq.graphics._plot_dc +====================== + +.. currentmodule:: mtuq.graphics + +.. autofunction:: _plot_dc \ No newline at end of file diff --git a/_sources/library/generated/mtuq.graphics._plot_depth.rst.txt b/_sources/library/generated/mtuq.graphics._plot_depth.rst.txt new file mode 100644 index 000000000..d0ad9536f --- /dev/null +++ b/_sources/library/generated/mtuq.graphics._plot_depth.rst.txt @@ -0,0 +1,6 @@ +mtuq.graphics._plot_depth +========================= + +.. currentmodule:: mtuq.graphics + +.. autofunction:: _plot_depth \ No newline at end of file diff --git a/_sources/library/generated/mtuq.graphics._plot_force.rst.txt b/_sources/library/generated/mtuq.graphics._plot_force.rst.txt new file mode 100644 index 000000000..2b759f7c9 --- /dev/null +++ b/_sources/library/generated/mtuq.graphics._plot_force.rst.txt @@ -0,0 +1,6 @@ +mtuq.graphics._plot_force +========================= + +.. currentmodule:: mtuq.graphics + +.. autofunction:: _plot_force \ No newline at end of file diff --git a/_sources/library/generated/mtuq.graphics._plot_latlon.rst.txt b/_sources/library/generated/mtuq.graphics._plot_latlon.rst.txt new file mode 100644 index 000000000..31d5e6d06 --- /dev/null +++ b/_sources/library/generated/mtuq.graphics._plot_latlon.rst.txt @@ -0,0 +1,6 @@ +mtuq.graphics._plot_latlon +========================== + +.. currentmodule:: mtuq.graphics + +.. autofunction:: _plot_latlon \ No newline at end of file diff --git a/_sources/library/generated/mtuq.graphics._plot_lune.rst.txt b/_sources/library/generated/mtuq.graphics._plot_lune.rst.txt new file mode 100644 index 000000000..baa5dfeb9 --- /dev/null +++ b/_sources/library/generated/mtuq.graphics._plot_lune.rst.txt @@ -0,0 +1,6 @@ +mtuq.graphics._plot_lune +======================== + +.. currentmodule:: mtuq.graphics + +.. autofunction:: _plot_lune \ No newline at end of file diff --git a/_sources/library/generated/mtuq.graphics._plot_vw.rst.txt b/_sources/library/generated/mtuq.graphics._plot_vw.rst.txt new file mode 100644 index 000000000..af1e4728e --- /dev/null +++ b/_sources/library/generated/mtuq.graphics._plot_vw.rst.txt @@ -0,0 +1,6 @@ +mtuq.graphics._plot_vw +====================== + +.. currentmodule:: mtuq.graphics + +.. autofunction:: _plot_vw \ No newline at end of file diff --git a/_sources/library/generated/mtuq.graphics.attrs.PyGMTUtilities.calculate_plotting_region.rst.txt b/_sources/library/generated/mtuq.graphics.attrs.PyGMTUtilities.calculate_plotting_region.rst.txt new file mode 100644 index 000000000..6e7e29af9 --- /dev/null +++ b/_sources/library/generated/mtuq.graphics.attrs.PyGMTUtilities.calculate_plotting_region.rst.txt @@ -0,0 +1,6 @@ +mtuq.graphics.attrs.PyGMTUtilities.calculate_plotting_region +============================================================ + +.. currentmodule:: mtuq.graphics.attrs + +.. automethod:: PyGMTUtilities.calculate_plotting_region \ No newline at end of file diff --git a/_sources/library/generated/mtuq.graphics.attrs.PyGMTUtilities.configure_colormap.rst.txt b/_sources/library/generated/mtuq.graphics.attrs.PyGMTUtilities.configure_colormap.rst.txt new file mode 100644 index 000000000..8cc2cbcd7 --- /dev/null +++ b/_sources/library/generated/mtuq.graphics.attrs.PyGMTUtilities.configure_colormap.rst.txt @@ -0,0 +1,6 @@ +mtuq.graphics.attrs.PyGMTUtilities.configure_colormap +===================================================== + +.. currentmodule:: mtuq.graphics.attrs + +.. automethod:: PyGMTUtilities.configure_colormap \ No newline at end of file diff --git a/_sources/library/generated/mtuq.graphics.attrs.PyGMTUtilities.draw_coastlines.rst.txt b/_sources/library/generated/mtuq.graphics.attrs.PyGMTUtilities.draw_coastlines.rst.txt new file mode 100644 index 000000000..776ceb9dd --- /dev/null +++ b/_sources/library/generated/mtuq.graphics.attrs.PyGMTUtilities.draw_coastlines.rst.txt @@ -0,0 +1,6 @@ +mtuq.graphics.attrs.PyGMTUtilities.draw_coastlines +================================================== + +.. currentmodule:: mtuq.graphics.attrs + +.. automethod:: PyGMTUtilities.draw_coastlines \ No newline at end of file diff --git a/_sources/library/generated/mtuq.graphics.attrs.PyGMTUtilities.get_header.rst.txt b/_sources/library/generated/mtuq.graphics.attrs.PyGMTUtilities.get_header.rst.txt new file mode 100644 index 000000000..1dcfb879d --- /dev/null +++ b/_sources/library/generated/mtuq.graphics.attrs.PyGMTUtilities.get_header.rst.txt @@ -0,0 +1,6 @@ +mtuq.graphics.attrs.PyGMTUtilities.get_header +============================================= + +.. currentmodule:: mtuq.graphics.attrs + +.. automethod:: PyGMTUtilities.get_header \ No newline at end of file diff --git a/_sources/library/generated/mtuq.graphics.attrs.PyGMTUtilities.get_resolution.rst.txt b/_sources/library/generated/mtuq.graphics.attrs.PyGMTUtilities.get_resolution.rst.txt new file mode 100644 index 000000000..d477a806b --- /dev/null +++ b/_sources/library/generated/mtuq.graphics.attrs.PyGMTUtilities.get_resolution.rst.txt @@ -0,0 +1,6 @@ +mtuq.graphics.attrs.PyGMTUtilities.get_resolution +================================================= + +.. currentmodule:: mtuq.graphics.attrs + +.. automethod:: PyGMTUtilities.get_resolution \ No newline at end of file diff --git a/_sources/library/generated/mtuq.graphics.attrs.PyGMTUtilities.prepare_latex_annotations.rst.txt b/_sources/library/generated/mtuq.graphics.attrs.PyGMTUtilities.prepare_latex_annotations.rst.txt new file mode 100644 index 000000000..a280762c8 --- /dev/null +++ b/_sources/library/generated/mtuq.graphics.attrs.PyGMTUtilities.prepare_latex_annotations.rst.txt @@ -0,0 +1,6 @@ +mtuq.graphics.attrs.PyGMTUtilities.prepare_latex_annotations +============================================================ + +.. currentmodule:: mtuq.graphics.attrs + +.. automethod:: PyGMTUtilities.prepare_latex_annotations \ No newline at end of file diff --git a/_sources/library/generated/mtuq.graphics.attrs.PyGMTUtilities.rst.txt b/_sources/library/generated/mtuq.graphics.attrs.PyGMTUtilities.rst.txt new file mode 100644 index 000000000..00bae2460 --- /dev/null +++ b/_sources/library/generated/mtuq.graphics.attrs.PyGMTUtilities.rst.txt @@ -0,0 +1,115 @@ +mtuq.graphics.attrs.PyGMTUtilities +================================== + +.. currentmodule:: mtuq.graphics.attrs +.. autoclass:: PyGMTUtilities + :show-inheritance: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .. rubric:: Public Methods + + .. autosummary:: + :toctree: . + :nosignatures: + + ~PyGMTUtilities.calculate_plotting_region + ~PyGMTUtilities.configure_colormap + ~PyGMTUtilities.draw_coastlines + ~PyGMTUtilities.get_header + ~PyGMTUtilities.get_resolution + ~PyGMTUtilities.prepare_latex_annotations + + + + + + \ No newline at end of file diff --git a/_sources/library/generated/mtuq.graphics.attrs._default_backend.rst.txt b/_sources/library/generated/mtuq.graphics.attrs._default_backend.rst.txt new file mode 100644 index 000000000..d1964bb15 --- /dev/null +++ b/_sources/library/generated/mtuq.graphics.attrs._default_backend.rst.txt @@ -0,0 +1,6 @@ +mtuq.graphics.attrs._default_backend +==================================== + +.. currentmodule:: mtuq.graphics.attrs + +.. autofunction:: _default_backend \ No newline at end of file diff --git a/_sources/library/generated/mtuq.graphics.attrs._pygmt_backend.rst.txt b/_sources/library/generated/mtuq.graphics.attrs._pygmt_backend.rst.txt new file mode 100644 index 000000000..c0a2a37fb --- /dev/null +++ b/_sources/library/generated/mtuq.graphics.attrs._pygmt_backend.rst.txt @@ -0,0 +1,6 @@ +mtuq.graphics.attrs._pygmt_backend +================================== + +.. currentmodule:: mtuq.graphics.attrs + +.. autofunction:: _pygmt_backend \ No newline at end of file diff --git a/_sources/library/generated/mtuq.graphics.plot_amplitude_ratios.rst.txt b/_sources/library/generated/mtuq.graphics.plot_amplitude_ratios.rst.txt new file mode 100644 index 000000000..da66ba04c --- /dev/null +++ b/_sources/library/generated/mtuq.graphics.plot_amplitude_ratios.rst.txt @@ -0,0 +1,6 @@ +mtuq.graphics.plot_amplitude_ratios +=================================== + +.. currentmodule:: mtuq.graphics + +.. autofunction:: plot_amplitude_ratios \ No newline at end of file diff --git a/_sources/library/generated/mtuq.graphics.plot_beachball.rst.txt b/_sources/library/generated/mtuq.graphics.plot_beachball.rst.txt new file mode 100644 index 000000000..5ea3612c8 --- /dev/null +++ b/_sources/library/generated/mtuq.graphics.plot_beachball.rst.txt @@ -0,0 +1,6 @@ +mtuq.graphics.plot_beachball +============================ + +.. currentmodule:: mtuq.graphics + +.. autofunction:: plot_beachball \ No newline at end of file diff --git a/_sources/library/generated/mtuq.graphics.plot_cross_corr.rst.txt b/_sources/library/generated/mtuq.graphics.plot_cross_corr.rst.txt new file mode 100644 index 000000000..75232c7f1 --- /dev/null +++ b/_sources/library/generated/mtuq.graphics.plot_cross_corr.rst.txt @@ -0,0 +1,6 @@ +mtuq.graphics.plot_cross_corr +============================= + +.. currentmodule:: mtuq.graphics + +.. autofunction:: plot_cross_corr \ No newline at end of file diff --git a/_sources/library/generated/mtuq.graphics.plot_data_greens1.rst.txt b/_sources/library/generated/mtuq.graphics.plot_data_greens1.rst.txt new file mode 100644 index 000000000..6c994b0b8 --- /dev/null +++ b/_sources/library/generated/mtuq.graphics.plot_data_greens1.rst.txt @@ -0,0 +1,6 @@ +mtuq.graphics.plot_data_greens1 +=============================== + +.. currentmodule:: mtuq.graphics + +.. autofunction:: plot_data_greens1 \ No newline at end of file diff --git a/_sources/library/generated/mtuq.graphics.plot_data_greens2.rst.txt b/_sources/library/generated/mtuq.graphics.plot_data_greens2.rst.txt new file mode 100644 index 000000000..9329c3247 --- /dev/null +++ b/_sources/library/generated/mtuq.graphics.plot_data_greens2.rst.txt @@ -0,0 +1,6 @@ +mtuq.graphics.plot_data_greens2 +=============================== + +.. currentmodule:: mtuq.graphics + +.. autofunction:: plot_data_greens2 \ No newline at end of file diff --git a/_sources/library/generated/mtuq.graphics.plot_likelihood_dc.rst.txt b/_sources/library/generated/mtuq.graphics.plot_likelihood_dc.rst.txt new file mode 100644 index 000000000..3aabed45d --- /dev/null +++ b/_sources/library/generated/mtuq.graphics.plot_likelihood_dc.rst.txt @@ -0,0 +1,6 @@ +mtuq.graphics.plot_likelihood_dc +================================ + +.. currentmodule:: mtuq.graphics + +.. autofunction:: plot_likelihood_dc \ No newline at end of file diff --git a/_sources/library/generated/mtuq.graphics.plot_likelihood_depth.rst.txt b/_sources/library/generated/mtuq.graphics.plot_likelihood_depth.rst.txt new file mode 100644 index 000000000..3c7fdac76 --- /dev/null +++ b/_sources/library/generated/mtuq.graphics.plot_likelihood_depth.rst.txt @@ -0,0 +1,6 @@ +mtuq.graphics.plot_likelihood_depth +=================================== + +.. currentmodule:: mtuq.graphics + +.. autofunction:: plot_likelihood_depth \ No newline at end of file diff --git a/_sources/library/generated/mtuq.graphics.plot_likelihood_force.rst.txt b/_sources/library/generated/mtuq.graphics.plot_likelihood_force.rst.txt new file mode 100644 index 000000000..5c7400ec6 --- /dev/null +++ b/_sources/library/generated/mtuq.graphics.plot_likelihood_force.rst.txt @@ -0,0 +1,6 @@ +mtuq.graphics.plot_likelihood_force +=================================== + +.. currentmodule:: mtuq.graphics + +.. autofunction:: plot_likelihood_force \ No newline at end of file diff --git a/_sources/library/generated/mtuq.graphics.plot_likelihood_latlon.rst.txt b/_sources/library/generated/mtuq.graphics.plot_likelihood_latlon.rst.txt new file mode 100644 index 000000000..1e20e70d1 --- /dev/null +++ b/_sources/library/generated/mtuq.graphics.plot_likelihood_latlon.rst.txt @@ -0,0 +1,6 @@ +mtuq.graphics.plot_likelihood_latlon +==================================== + +.. currentmodule:: mtuq.graphics + +.. autofunction:: plot_likelihood_latlon \ No newline at end of file diff --git a/_sources/library/generated/mtuq.graphics.plot_likelihood_lune.rst.txt b/_sources/library/generated/mtuq.graphics.plot_likelihood_lune.rst.txt new file mode 100644 index 000000000..a68e3d78f --- /dev/null +++ b/_sources/library/generated/mtuq.graphics.plot_likelihood_lune.rst.txt @@ -0,0 +1,6 @@ +mtuq.graphics.plot_likelihood_lune +================================== + +.. currentmodule:: mtuq.graphics + +.. autofunction:: plot_likelihood_lune \ No newline at end of file diff --git a/_sources/library/generated/mtuq.graphics.plot_likelihood_vw.rst.txt b/_sources/library/generated/mtuq.graphics.plot_likelihood_vw.rst.txt new file mode 100644 index 000000000..d00203cdf --- /dev/null +++ b/_sources/library/generated/mtuq.graphics.plot_likelihood_vw.rst.txt @@ -0,0 +1,6 @@ +mtuq.graphics.plot_likelihood_vw +================================ + +.. currentmodule:: mtuq.graphics + +.. autofunction:: plot_likelihood_vw \ No newline at end of file diff --git a/_sources/library/generated/mtuq.graphics.plot_log_amplitude_ratios.rst.txt b/_sources/library/generated/mtuq.graphics.plot_log_amplitude_ratios.rst.txt new file mode 100644 index 000000000..65f945ad1 --- /dev/null +++ b/_sources/library/generated/mtuq.graphics.plot_log_amplitude_ratios.rst.txt @@ -0,0 +1,6 @@ +mtuq.graphics.plot_log_amplitude_ratios +======================================= + +.. currentmodule:: mtuq.graphics + +.. autofunction:: plot_log_amplitude_ratios \ No newline at end of file diff --git a/_sources/library/generated/mtuq.graphics.plot_marginal_dc.rst.txt b/_sources/library/generated/mtuq.graphics.plot_marginal_dc.rst.txt new file mode 100644 index 000000000..a3ebd5da2 --- /dev/null +++ b/_sources/library/generated/mtuq.graphics.plot_marginal_dc.rst.txt @@ -0,0 +1,6 @@ +mtuq.graphics.plot_marginal_dc +============================== + +.. currentmodule:: mtuq.graphics + +.. autofunction:: plot_marginal_dc \ No newline at end of file diff --git a/_sources/library/generated/mtuq.graphics.plot_marginal_depth.rst.txt b/_sources/library/generated/mtuq.graphics.plot_marginal_depth.rst.txt new file mode 100644 index 000000000..25d127b17 --- /dev/null +++ b/_sources/library/generated/mtuq.graphics.plot_marginal_depth.rst.txt @@ -0,0 +1,6 @@ +mtuq.graphics.plot_marginal_depth +================================= + +.. currentmodule:: mtuq.graphics + +.. autofunction:: plot_marginal_depth \ No newline at end of file diff --git a/_sources/library/generated/mtuq.graphics.plot_marginal_force.rst.txt b/_sources/library/generated/mtuq.graphics.plot_marginal_force.rst.txt new file mode 100644 index 000000000..7ebf7eb0e --- /dev/null +++ b/_sources/library/generated/mtuq.graphics.plot_marginal_force.rst.txt @@ -0,0 +1,6 @@ +mtuq.graphics.plot_marginal_force +================================= + +.. currentmodule:: mtuq.graphics + +.. autofunction:: plot_marginal_force \ No newline at end of file diff --git a/_sources/library/generated/mtuq.graphics.plot_marginal_latlon.rst.txt b/_sources/library/generated/mtuq.graphics.plot_marginal_latlon.rst.txt new file mode 100644 index 000000000..a7b0a8e61 --- /dev/null +++ b/_sources/library/generated/mtuq.graphics.plot_marginal_latlon.rst.txt @@ -0,0 +1,6 @@ +mtuq.graphics.plot_marginal_latlon +================================== + +.. currentmodule:: mtuq.graphics + +.. autofunction:: plot_marginal_latlon \ No newline at end of file diff --git a/_sources/library/generated/mtuq.graphics.plot_marginal_lune.rst.txt b/_sources/library/generated/mtuq.graphics.plot_marginal_lune.rst.txt new file mode 100644 index 000000000..89c5de882 --- /dev/null +++ b/_sources/library/generated/mtuq.graphics.plot_marginal_lune.rst.txt @@ -0,0 +1,6 @@ +mtuq.graphics.plot_marginal_lune +================================ + +.. currentmodule:: mtuq.graphics + +.. autofunction:: plot_marginal_lune \ No newline at end of file diff --git a/_sources/library/generated/mtuq.graphics.plot_marginal_vw.rst.txt b/_sources/library/generated/mtuq.graphics.plot_marginal_vw.rst.txt new file mode 100644 index 000000000..0a54281b1 --- /dev/null +++ b/_sources/library/generated/mtuq.graphics.plot_marginal_vw.rst.txt @@ -0,0 +1,6 @@ +mtuq.graphics.plot_marginal_vw +============================== + +.. currentmodule:: mtuq.graphics + +.. autofunction:: plot_marginal_vw \ No newline at end of file diff --git a/_sources/library/generated/mtuq.graphics.plot_misfit_dc.rst.txt b/_sources/library/generated/mtuq.graphics.plot_misfit_dc.rst.txt new file mode 100644 index 000000000..4799fdac9 --- /dev/null +++ b/_sources/library/generated/mtuq.graphics.plot_misfit_dc.rst.txt @@ -0,0 +1,6 @@ +mtuq.graphics.plot_misfit_dc +============================ + +.. currentmodule:: mtuq.graphics + +.. autofunction:: plot_misfit_dc \ No newline at end of file diff --git a/_sources/library/generated/mtuq.graphics.plot_misfit_depth.rst.txt b/_sources/library/generated/mtuq.graphics.plot_misfit_depth.rst.txt new file mode 100644 index 000000000..4fc61e1d5 --- /dev/null +++ b/_sources/library/generated/mtuq.graphics.plot_misfit_depth.rst.txt @@ -0,0 +1,6 @@ +mtuq.graphics.plot_misfit_depth +=============================== + +.. currentmodule:: mtuq.graphics + +.. autofunction:: plot_misfit_depth \ No newline at end of file diff --git a/_sources/library/generated/mtuq.graphics.plot_misfit_force.rst.txt b/_sources/library/generated/mtuq.graphics.plot_misfit_force.rst.txt new file mode 100644 index 000000000..1482a28e6 --- /dev/null +++ b/_sources/library/generated/mtuq.graphics.plot_misfit_force.rst.txt @@ -0,0 +1,6 @@ +mtuq.graphics.plot_misfit_force +=============================== + +.. currentmodule:: mtuq.graphics + +.. autofunction:: plot_misfit_force \ No newline at end of file diff --git a/_sources/library/generated/mtuq.graphics.plot_misfit_latlon.rst.txt b/_sources/library/generated/mtuq.graphics.plot_misfit_latlon.rst.txt new file mode 100644 index 000000000..fa8da9e2e --- /dev/null +++ b/_sources/library/generated/mtuq.graphics.plot_misfit_latlon.rst.txt @@ -0,0 +1,6 @@ +mtuq.graphics.plot_misfit_latlon +================================ + +.. currentmodule:: mtuq.graphics + +.. autofunction:: plot_misfit_latlon \ No newline at end of file diff --git a/_sources/library/generated/mtuq.graphics.plot_misfit_lune.rst.txt b/_sources/library/generated/mtuq.graphics.plot_misfit_lune.rst.txt new file mode 100644 index 000000000..e217f97dc --- /dev/null +++ b/_sources/library/generated/mtuq.graphics.plot_misfit_lune.rst.txt @@ -0,0 +1,6 @@ +mtuq.graphics.plot_misfit_lune +============================== + +.. currentmodule:: mtuq.graphics + +.. autofunction:: plot_misfit_lune \ No newline at end of file diff --git a/_sources/library/generated/mtuq.graphics.plot_misfit_vw.rst.txt b/_sources/library/generated/mtuq.graphics.plot_misfit_vw.rst.txt new file mode 100644 index 000000000..e6c1da819 --- /dev/null +++ b/_sources/library/generated/mtuq.graphics.plot_misfit_vw.rst.txt @@ -0,0 +1,6 @@ +mtuq.graphics.plot_misfit_vw +============================ + +.. currentmodule:: mtuq.graphics + +.. autofunction:: plot_misfit_vw \ No newline at end of file diff --git a/_sources/library/generated/mtuq.graphics.plot_polarities.rst.txt b/_sources/library/generated/mtuq.graphics.plot_polarities.rst.txt new file mode 100644 index 000000000..a7076c1c4 --- /dev/null +++ b/_sources/library/generated/mtuq.graphics.plot_polarities.rst.txt @@ -0,0 +1,6 @@ +mtuq.graphics.plot_polarities +============================= + +.. currentmodule:: mtuq.graphics + +.. autofunction:: plot_polarities \ No newline at end of file diff --git a/_sources/library/generated/mtuq.graphics.plot_time_shifts.rst.txt b/_sources/library/generated/mtuq.graphics.plot_time_shifts.rst.txt new file mode 100644 index 000000000..77c0dcdc4 --- /dev/null +++ b/_sources/library/generated/mtuq.graphics.plot_time_shifts.rst.txt @@ -0,0 +1,6 @@ +mtuq.graphics.plot_time_shifts +============================== + +.. currentmodule:: mtuq.graphics + +.. autofunction:: plot_time_shifts \ No newline at end of file diff --git a/_sources/library/generated/mtuq.graphics.plot_waveforms1.rst.txt b/_sources/library/generated/mtuq.graphics.plot_waveforms1.rst.txt new file mode 100644 index 000000000..cc726060e --- /dev/null +++ b/_sources/library/generated/mtuq.graphics.plot_waveforms1.rst.txt @@ -0,0 +1,6 @@ +mtuq.graphics.plot_waveforms1 +============================= + +.. currentmodule:: mtuq.graphics + +.. autofunction:: plot_waveforms1 \ No newline at end of file diff --git a/_sources/library/generated/mtuq.graphics.plot_waveforms2.rst.txt b/_sources/library/generated/mtuq.graphics.plot_waveforms2.rst.txt new file mode 100644 index 000000000..ad38f8057 --- /dev/null +++ b/_sources/library/generated/mtuq.graphics.plot_waveforms2.rst.txt @@ -0,0 +1,6 @@ +mtuq.graphics.plot_waveforms2 +============================= + +.. currentmodule:: mtuq.graphics + +.. autofunction:: plot_waveforms2 \ No newline at end of file diff --git a/_sources/library/generated/mtuq.grid.DeviatoricGridRandom.rst.txt b/_sources/library/generated/mtuq.grid.DeviatoricGridRandom.rst.txt new file mode 100644 index 000000000..bf321cd8a --- /dev/null +++ b/_sources/library/generated/mtuq.grid.DeviatoricGridRandom.rst.txt @@ -0,0 +1,6 @@ +mtuq.grid.DeviatoricGridRandom +============================== + +.. currentmodule:: mtuq.grid + +.. autofunction:: DeviatoricGridRandom \ No newline at end of file diff --git a/_sources/library/generated/mtuq.grid.DeviatoricGridSemiregular.rst.txt b/_sources/library/generated/mtuq.grid.DeviatoricGridSemiregular.rst.txt new file mode 100644 index 000000000..a1aaadad3 --- /dev/null +++ b/_sources/library/generated/mtuq.grid.DeviatoricGridSemiregular.rst.txt @@ -0,0 +1,6 @@ +mtuq.grid.DeviatoricGridSemiregular +=================================== + +.. currentmodule:: mtuq.grid + +.. autofunction:: DeviatoricGridSemiregular \ No newline at end of file diff --git a/_sources/library/generated/mtuq.grid.DoubleCoupleGridRandom.rst.txt b/_sources/library/generated/mtuq.grid.DoubleCoupleGridRandom.rst.txt new file mode 100644 index 000000000..be3624aed --- /dev/null +++ b/_sources/library/generated/mtuq.grid.DoubleCoupleGridRandom.rst.txt @@ -0,0 +1,6 @@ +mtuq.grid.DoubleCoupleGridRandom +================================ + +.. currentmodule:: mtuq.grid + +.. autofunction:: DoubleCoupleGridRandom \ No newline at end of file diff --git a/_sources/library/generated/mtuq.grid.DoubleCoupleGridRegular.rst.txt b/_sources/library/generated/mtuq.grid.DoubleCoupleGridRegular.rst.txt new file mode 100644 index 000000000..7c0200c41 --- /dev/null +++ b/_sources/library/generated/mtuq.grid.DoubleCoupleGridRegular.rst.txt @@ -0,0 +1,6 @@ +mtuq.grid.DoubleCoupleGridRegular +================================= + +.. currentmodule:: mtuq.grid + +.. autofunction:: DoubleCoupleGridRegular \ No newline at end of file diff --git a/_sources/library/generated/mtuq.grid.ForceGridRandom.rst.txt b/_sources/library/generated/mtuq.grid.ForceGridRandom.rst.txt new file mode 100644 index 000000000..6e55dd04c --- /dev/null +++ b/_sources/library/generated/mtuq.grid.ForceGridRandom.rst.txt @@ -0,0 +1,6 @@ +mtuq.grid.ForceGridRandom +========================= + +.. currentmodule:: mtuq.grid + +.. autofunction:: ForceGridRandom \ No newline at end of file diff --git a/_sources/library/generated/mtuq.grid.ForceGridRegular.rst.txt b/_sources/library/generated/mtuq.grid.ForceGridRegular.rst.txt new file mode 100644 index 000000000..6a24e07f9 --- /dev/null +++ b/_sources/library/generated/mtuq.grid.ForceGridRegular.rst.txt @@ -0,0 +1,6 @@ +mtuq.grid.ForceGridRegular +========================== + +.. currentmodule:: mtuq.grid + +.. autofunction:: ForceGridRegular \ No newline at end of file diff --git a/_sources/library/generated/mtuq.grid.FullMomentTensorGridRandom.rst.txt b/_sources/library/generated/mtuq.grid.FullMomentTensorGridRandom.rst.txt new file mode 100644 index 000000000..0458aba6e --- /dev/null +++ b/_sources/library/generated/mtuq.grid.FullMomentTensorGridRandom.rst.txt @@ -0,0 +1,6 @@ +mtuq.grid.FullMomentTensorGridRandom +==================================== + +.. currentmodule:: mtuq.grid + +.. autofunction:: FullMomentTensorGridRandom \ No newline at end of file diff --git a/_sources/library/generated/mtuq.grid.FullMomentTensorGridSemiregular.rst.txt b/_sources/library/generated/mtuq.grid.FullMomentTensorGridSemiregular.rst.txt new file mode 100644 index 000000000..9fd087614 --- /dev/null +++ b/_sources/library/generated/mtuq.grid.FullMomentTensorGridSemiregular.rst.txt @@ -0,0 +1,6 @@ +mtuq.grid.FullMomentTensorGridSemiregular +========================================= + +.. currentmodule:: mtuq.grid + +.. autofunction:: FullMomentTensorGridSemiregular \ No newline at end of file diff --git a/_sources/library/generated/mtuq.grid.Grid.get.rst.txt b/_sources/library/generated/mtuq.grid.Grid.get.rst.txt new file mode 100644 index 000000000..d7bc8e08c --- /dev/null +++ b/_sources/library/generated/mtuq.grid.Grid.get.rst.txt @@ -0,0 +1,6 @@ +mtuq.grid.Grid.get +================== + +.. currentmodule:: mtuq.grid + +.. automethod:: Grid.get \ No newline at end of file diff --git a/_sources/library/generated/mtuq.grid.Grid.get_dict.rst.txt b/_sources/library/generated/mtuq.grid.Grid.get_dict.rst.txt new file mode 100644 index 000000000..9cb727248 --- /dev/null +++ b/_sources/library/generated/mtuq.grid.Grid.get_dict.rst.txt @@ -0,0 +1,6 @@ +mtuq.grid.Grid.get_dict +======================= + +.. currentmodule:: mtuq.grid + +.. automethod:: Grid.get_dict \ No newline at end of file diff --git a/_sources/library/generated/mtuq.grid.Grid.partition.rst.txt b/_sources/library/generated/mtuq.grid.Grid.partition.rst.txt new file mode 100644 index 000000000..e71aea079 --- /dev/null +++ b/_sources/library/generated/mtuq.grid.Grid.partition.rst.txt @@ -0,0 +1,6 @@ +mtuq.grid.Grid.partition +======================== + +.. currentmodule:: mtuq.grid + +.. automethod:: Grid.partition \ No newline at end of file diff --git a/_sources/library/generated/mtuq.grid.Grid.rst.txt b/_sources/library/generated/mtuq.grid.Grid.rst.txt new file mode 100644 index 000000000..d3b8fcb3b --- /dev/null +++ b/_sources/library/generated/mtuq.grid.Grid.rst.txt @@ -0,0 +1,124 @@ +mtuq.grid.Grid +============== + +.. currentmodule:: mtuq.grid +.. autoclass:: Grid + :show-inheritance: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .. rubric:: Public Methods + + .. autosummary:: + :toctree: . + :nosignatures: + + ~Grid.get + ~Grid.get_dict + ~Grid.partition + ~Grid.to_array + ~Grid.to_dataarray + ~Grid.to_dataframe + + + + + + \ No newline at end of file diff --git a/_sources/library/generated/mtuq.grid.Grid.to_array.rst.txt b/_sources/library/generated/mtuq.grid.Grid.to_array.rst.txt new file mode 100644 index 000000000..7327d3e00 --- /dev/null +++ b/_sources/library/generated/mtuq.grid.Grid.to_array.rst.txt @@ -0,0 +1,6 @@ +mtuq.grid.Grid.to_array +======================= + +.. currentmodule:: mtuq.grid + +.. automethod:: Grid.to_array \ No newline at end of file diff --git a/_sources/library/generated/mtuq.grid.Grid.to_dataarray.rst.txt b/_sources/library/generated/mtuq.grid.Grid.to_dataarray.rst.txt new file mode 100644 index 000000000..35b19ecac --- /dev/null +++ b/_sources/library/generated/mtuq.grid.Grid.to_dataarray.rst.txt @@ -0,0 +1,6 @@ +mtuq.grid.Grid.to_dataarray +=========================== + +.. currentmodule:: mtuq.grid + +.. automethod:: Grid.to_dataarray \ No newline at end of file diff --git a/_sources/library/generated/mtuq.grid.Grid.to_dataframe.rst.txt b/_sources/library/generated/mtuq.grid.Grid.to_dataframe.rst.txt new file mode 100644 index 000000000..b7dce3533 --- /dev/null +++ b/_sources/library/generated/mtuq.grid.Grid.to_dataframe.rst.txt @@ -0,0 +1,6 @@ +mtuq.grid.Grid.to_dataframe +=========================== + +.. currentmodule:: mtuq.grid + +.. automethod:: Grid.to_dataframe \ No newline at end of file diff --git a/_sources/library/generated/mtuq.grid.UnstructuredGrid.get.rst.txt b/_sources/library/generated/mtuq.grid.UnstructuredGrid.get.rst.txt new file mode 100644 index 000000000..79eab5e2f --- /dev/null +++ b/_sources/library/generated/mtuq.grid.UnstructuredGrid.get.rst.txt @@ -0,0 +1,6 @@ +mtuq.grid.UnstructuredGrid.get +============================== + +.. currentmodule:: mtuq.grid + +.. automethod:: UnstructuredGrid.get \ No newline at end of file diff --git a/_sources/library/generated/mtuq.grid.UnstructuredGrid.get_dict.rst.txt b/_sources/library/generated/mtuq.grid.UnstructuredGrid.get_dict.rst.txt new file mode 100644 index 000000000..822ecad61 --- /dev/null +++ b/_sources/library/generated/mtuq.grid.UnstructuredGrid.get_dict.rst.txt @@ -0,0 +1,6 @@ +mtuq.grid.UnstructuredGrid.get_dict +=================================== + +.. currentmodule:: mtuq.grid + +.. automethod:: UnstructuredGrid.get_dict \ No newline at end of file diff --git a/_sources/library/generated/mtuq.grid.UnstructuredGrid.partition.rst.txt b/_sources/library/generated/mtuq.grid.UnstructuredGrid.partition.rst.txt new file mode 100644 index 000000000..a8ba67f89 --- /dev/null +++ b/_sources/library/generated/mtuq.grid.UnstructuredGrid.partition.rst.txt @@ -0,0 +1,6 @@ +mtuq.grid.UnstructuredGrid.partition +==================================== + +.. currentmodule:: mtuq.grid + +.. automethod:: UnstructuredGrid.partition \ No newline at end of file diff --git a/_sources/library/generated/mtuq.grid.UnstructuredGrid.rst.txt b/_sources/library/generated/mtuq.grid.UnstructuredGrid.rst.txt new file mode 100644 index 000000000..9387fd0d1 --- /dev/null +++ b/_sources/library/generated/mtuq.grid.UnstructuredGrid.rst.txt @@ -0,0 +1,120 @@ +mtuq.grid.UnstructuredGrid +========================== + +.. currentmodule:: mtuq.grid +.. autoclass:: UnstructuredGrid + :show-inheritance: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .. rubric:: Public Methods + + .. autosummary:: + :toctree: . + :nosignatures: + + ~UnstructuredGrid.get + ~UnstructuredGrid.get_dict + ~UnstructuredGrid.partition + ~UnstructuredGrid.to_array + ~UnstructuredGrid.to_dataframe + + + + + + \ No newline at end of file diff --git a/_sources/library/generated/mtuq.grid.UnstructuredGrid.to_array.rst.txt b/_sources/library/generated/mtuq.grid.UnstructuredGrid.to_array.rst.txt new file mode 100644 index 000000000..8fe7dd736 --- /dev/null +++ b/_sources/library/generated/mtuq.grid.UnstructuredGrid.to_array.rst.txt @@ -0,0 +1,6 @@ +mtuq.grid.UnstructuredGrid.to_array +=================================== + +.. currentmodule:: mtuq.grid + +.. automethod:: UnstructuredGrid.to_array \ No newline at end of file diff --git a/_sources/library/generated/mtuq.grid.UnstructuredGrid.to_dataframe.rst.txt b/_sources/library/generated/mtuq.grid.UnstructuredGrid.to_dataframe.rst.txt new file mode 100644 index 000000000..f75bb7883 --- /dev/null +++ b/_sources/library/generated/mtuq.grid.UnstructuredGrid.to_dataframe.rst.txt @@ -0,0 +1,6 @@ +mtuq.grid.UnstructuredGrid.to_dataframe +======================================= + +.. currentmodule:: mtuq.grid + +.. automethod:: UnstructuredGrid.to_dataframe \ No newline at end of file diff --git a/_sources/library/generated/mtuq.grid.moment_tensor._semiregular.rst.txt b/_sources/library/generated/mtuq.grid.moment_tensor._semiregular.rst.txt new file mode 100644 index 000000000..e89f65da8 --- /dev/null +++ b/_sources/library/generated/mtuq.grid.moment_tensor._semiregular.rst.txt @@ -0,0 +1,6 @@ +mtuq.grid.moment_tensor._semiregular +==================================== + +.. currentmodule:: mtuq.grid.moment_tensor + +.. autofunction:: _semiregular \ No newline at end of file diff --git a/_sources/library/generated/mtuq.grid_search.MTUQDataArray._get_shape.rst.txt b/_sources/library/generated/mtuq.grid_search.MTUQDataArray._get_shape.rst.txt new file mode 100644 index 000000000..f3b04b9df --- /dev/null +++ b/_sources/library/generated/mtuq.grid_search.MTUQDataArray._get_shape.rst.txt @@ -0,0 +1,6 @@ +mtuq.grid_search.MTUQDataArray._get_shape +========================================= + +.. currentmodule:: mtuq.grid_search + +.. automethod:: MTUQDataArray._get_shape \ No newline at end of file diff --git a/_sources/library/generated/mtuq.grid_search.MTUQDataArray.item.rst.txt b/_sources/library/generated/mtuq.grid_search.MTUQDataArray.item.rst.txt new file mode 100644 index 000000000..ea32ba738 --- /dev/null +++ b/_sources/library/generated/mtuq.grid_search.MTUQDataArray.item.rst.txt @@ -0,0 +1,6 @@ +mtuq.grid_search.MTUQDataArray.item +=================================== + +.. currentmodule:: mtuq.grid_search + +.. automethod:: MTUQDataArray.item \ No newline at end of file diff --git a/_sources/library/generated/mtuq.grid_search.MTUQDataArray.origin_idxmin.rst.txt b/_sources/library/generated/mtuq.grid_search.MTUQDataArray.origin_idxmin.rst.txt new file mode 100644 index 000000000..35a84db8d --- /dev/null +++ b/_sources/library/generated/mtuq.grid_search.MTUQDataArray.origin_idxmin.rst.txt @@ -0,0 +1,6 @@ +mtuq.grid_search.MTUQDataArray.origin_idxmin +============================================ + +.. currentmodule:: mtuq.grid_search + +.. automethod:: MTUQDataArray.origin_idxmin \ No newline at end of file diff --git a/_sources/library/generated/mtuq.grid_search.MTUQDataArray.rst.txt b/_sources/library/generated/mtuq.grid_search.MTUQDataArray.rst.txt new file mode 100644 index 000000000..39a3a2ac0 --- /dev/null +++ b/_sources/library/generated/mtuq.grid_search.MTUQDataArray.rst.txt @@ -0,0 +1,768 @@ +mtuq.grid_search.MTUQDataArray +============================== + +.. currentmodule:: mtuq.grid_search +.. autoclass:: MTUQDataArray + :show-inheritance: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .. rubric:: Public Methods + + .. autosummary:: + :toctree: . + :nosignatures: + + ~MTUQDataArray.item + ~MTUQDataArray.origin_idxmin + ~MTUQDataArray.save + ~MTUQDataArray.searchsorted + ~MTUQDataArray.source_idxmin + + + + .. rubric:: Private Methods + + .. warning:: + + Private methods are mainly for internal/developer use and their API might change without notice. + + .. autosummary:: + :toctree: . + :nosignatures: + + ~MTUQDataArray._get_shape + + + + \ No newline at end of file diff --git a/_sources/library/generated/mtuq.grid_search.MTUQDataArray.save.rst.txt b/_sources/library/generated/mtuq.grid_search.MTUQDataArray.save.rst.txt new file mode 100644 index 000000000..9b9b744e1 --- /dev/null +++ b/_sources/library/generated/mtuq.grid_search.MTUQDataArray.save.rst.txt @@ -0,0 +1,6 @@ +mtuq.grid_search.MTUQDataArray.save +=================================== + +.. currentmodule:: mtuq.grid_search + +.. automethod:: MTUQDataArray.save \ No newline at end of file diff --git a/_sources/library/generated/mtuq.grid_search.MTUQDataArray.searchsorted.rst.txt b/_sources/library/generated/mtuq.grid_search.MTUQDataArray.searchsorted.rst.txt new file mode 100644 index 000000000..b1321517f --- /dev/null +++ b/_sources/library/generated/mtuq.grid_search.MTUQDataArray.searchsorted.rst.txt @@ -0,0 +1,6 @@ +mtuq.grid_search.MTUQDataArray.searchsorted +=========================================== + +.. currentmodule:: mtuq.grid_search + +.. automethod:: MTUQDataArray.searchsorted \ No newline at end of file diff --git a/_sources/library/generated/mtuq.grid_search.MTUQDataArray.source_idxmin.rst.txt b/_sources/library/generated/mtuq.grid_search.MTUQDataArray.source_idxmin.rst.txt new file mode 100644 index 000000000..13d16e826 --- /dev/null +++ b/_sources/library/generated/mtuq.grid_search.MTUQDataArray.source_idxmin.rst.txt @@ -0,0 +1,6 @@ +mtuq.grid_search.MTUQDataArray.source_idxmin +============================================ + +.. currentmodule:: mtuq.grid_search + +.. automethod:: MTUQDataArray.source_idxmin \ No newline at end of file diff --git a/_sources/library/generated/mtuq.grid_search.MTUQDataFrame.origin_idxmin.rst.txt b/_sources/library/generated/mtuq.grid_search.MTUQDataFrame.origin_idxmin.rst.txt new file mode 100644 index 000000000..8f8741d57 --- /dev/null +++ b/_sources/library/generated/mtuq.grid_search.MTUQDataFrame.origin_idxmin.rst.txt @@ -0,0 +1,6 @@ +mtuq.grid_search.MTUQDataFrame.origin_idxmin +============================================ + +.. currentmodule:: mtuq.grid_search + +.. automethod:: MTUQDataFrame.origin_idxmin \ No newline at end of file diff --git a/_sources/library/generated/mtuq.grid_search.MTUQDataFrame.rst.txt b/_sources/library/generated/mtuq.grid_search.MTUQDataFrame.rst.txt new file mode 100644 index 000000000..5029ae3eb --- /dev/null +++ b/_sources/library/generated/mtuq.grid_search.MTUQDataFrame.rst.txt @@ -0,0 +1,1186 @@ +mtuq.grid_search.MTUQDataFrame +============================== + +.. currentmodule:: mtuq.grid_search +.. autoclass:: MTUQDataFrame + :show-inheritance: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .. rubric:: Public Methods + + .. autosummary:: + :toctree: . + :nosignatures: + + ~MTUQDataFrame.origin_idxmin + ~MTUQDataFrame.save + ~MTUQDataFrame.source_idxmin + + + + + + \ No newline at end of file diff --git a/_sources/library/generated/mtuq.grid_search.MTUQDataFrame.save.rst.txt b/_sources/library/generated/mtuq.grid_search.MTUQDataFrame.save.rst.txt new file mode 100644 index 000000000..2887a3b89 --- /dev/null +++ b/_sources/library/generated/mtuq.grid_search.MTUQDataFrame.save.rst.txt @@ -0,0 +1,6 @@ +mtuq.grid_search.MTUQDataFrame.save +=================================== + +.. currentmodule:: mtuq.grid_search + +.. automethod:: MTUQDataFrame.save \ No newline at end of file diff --git a/_sources/library/generated/mtuq.grid_search.MTUQDataFrame.source_idxmin.rst.txt b/_sources/library/generated/mtuq.grid_search.MTUQDataFrame.source_idxmin.rst.txt new file mode 100644 index 000000000..36b7fef5d --- /dev/null +++ b/_sources/library/generated/mtuq.grid_search.MTUQDataFrame.source_idxmin.rst.txt @@ -0,0 +1,6 @@ +mtuq.grid_search.MTUQDataFrame.source_idxmin +============================================ + +.. currentmodule:: mtuq.grid_search + +.. automethod:: MTUQDataFrame.source_idxmin \ No newline at end of file diff --git a/_sources/library/generated/mtuq.grid_search.grid_search.rst.txt b/_sources/library/generated/mtuq.grid_search.grid_search.rst.txt new file mode 100644 index 000000000..1da79254b --- /dev/null +++ b/_sources/library/generated/mtuq.grid_search.grid_search.rst.txt @@ -0,0 +1,6 @@ +mtuq.grid_search.grid_search +============================ + +.. currentmodule:: mtuq.grid_search + +.. autofunction:: grid_search \ No newline at end of file diff --git a/_sources/library/generated/mtuq.grid_search.open_ds.rst.txt b/_sources/library/generated/mtuq.grid_search.open_ds.rst.txt new file mode 100644 index 000000000..38fa3f0d3 --- /dev/null +++ b/_sources/library/generated/mtuq.grid_search.open_ds.rst.txt @@ -0,0 +1,6 @@ +mtuq.grid_search.open_ds +======================== + +.. currentmodule:: mtuq.grid_search + +.. autofunction:: open_ds \ No newline at end of file diff --git a/_sources/library/generated/mtuq.io.clients.AxiSEM_NetCDF.Client._get_greens_tensor.rst.txt b/_sources/library/generated/mtuq.io.clients.AxiSEM_NetCDF.Client._get_greens_tensor.rst.txt new file mode 100644 index 000000000..cefaba4b3 --- /dev/null +++ b/_sources/library/generated/mtuq.io.clients.AxiSEM_NetCDF.Client._get_greens_tensor.rst.txt @@ -0,0 +1,6 @@ +mtuq.io.clients.AxiSEM_NetCDF.Client._get_greens_tensor +======================================================= + +.. currentmodule:: mtuq.io.clients.AxiSEM_NetCDF + +.. automethod:: Client._get_greens_tensor \ No newline at end of file diff --git a/_sources/library/generated/mtuq.io.clients.AxiSEM_NetCDF.Client.get_greens_tensors.rst.txt b/_sources/library/generated/mtuq.io.clients.AxiSEM_NetCDF.Client.get_greens_tensors.rst.txt new file mode 100644 index 000000000..7d8514181 --- /dev/null +++ b/_sources/library/generated/mtuq.io.clients.AxiSEM_NetCDF.Client.get_greens_tensors.rst.txt @@ -0,0 +1,6 @@ +mtuq.io.clients.AxiSEM_NetCDF.Client.get_greens_tensors +======================================================= + +.. currentmodule:: mtuq.io.clients.AxiSEM_NetCDF + +.. automethod:: Client.get_greens_tensors \ No newline at end of file diff --git a/_sources/library/generated/mtuq.io.clients.AxiSEM_NetCDF.Client.rst.txt b/_sources/library/generated/mtuq.io.clients.AxiSEM_NetCDF.Client.rst.txt new file mode 100644 index 000000000..19fc023d3 --- /dev/null +++ b/_sources/library/generated/mtuq.io.clients.AxiSEM_NetCDF.Client.rst.txt @@ -0,0 +1,110 @@ +mtuq.io.clients.AxiSEM_NetCDF.Client +==================================== + +.. currentmodule:: mtuq.io.clients.AxiSEM_NetCDF +.. autoclass:: Client + :show-inheritance: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .. rubric:: Public Methods + + .. autosummary:: + :toctree: . + :nosignatures: + + ~Client.get_greens_tensors + + + + .. rubric:: Private Methods + + .. warning:: + + Private methods are mainly for internal/developer use and their API might change without notice. + + .. autosummary:: + :toctree: . + :nosignatures: + + ~Client._get_greens_tensor + + + + \ No newline at end of file diff --git a/_sources/library/generated/mtuq.io.clients.FK_SAC.Client._get_greens_tensor.rst.txt b/_sources/library/generated/mtuq.io.clients.FK_SAC.Client._get_greens_tensor.rst.txt new file mode 100644 index 000000000..fb6b50526 --- /dev/null +++ b/_sources/library/generated/mtuq.io.clients.FK_SAC.Client._get_greens_tensor.rst.txt @@ -0,0 +1,6 @@ +mtuq.io.clients.FK_SAC.Client._get_greens_tensor +================================================ + +.. currentmodule:: mtuq.io.clients.FK_SAC + +.. automethod:: Client._get_greens_tensor \ No newline at end of file diff --git a/_sources/library/generated/mtuq.io.clients.FK_SAC.Client.get_greens_tensors.rst.txt b/_sources/library/generated/mtuq.io.clients.FK_SAC.Client.get_greens_tensors.rst.txt new file mode 100644 index 000000000..4abb4290e --- /dev/null +++ b/_sources/library/generated/mtuq.io.clients.FK_SAC.Client.get_greens_tensors.rst.txt @@ -0,0 +1,6 @@ +mtuq.io.clients.FK_SAC.Client.get_greens_tensors +================================================ + +.. currentmodule:: mtuq.io.clients.FK_SAC + +.. automethod:: Client.get_greens_tensors \ No newline at end of file diff --git a/_sources/library/generated/mtuq.io.clients.FK_SAC.Client.rst.txt b/_sources/library/generated/mtuq.io.clients.FK_SAC.Client.rst.txt new file mode 100644 index 000000000..3cd0cfb0d --- /dev/null +++ b/_sources/library/generated/mtuq.io.clients.FK_SAC.Client.rst.txt @@ -0,0 +1,110 @@ +mtuq.io.clients.FK_SAC.Client +============================= + +.. currentmodule:: mtuq.io.clients.FK_SAC +.. autoclass:: Client + :show-inheritance: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .. rubric:: Public Methods + + .. autosummary:: + :toctree: . + :nosignatures: + + ~Client.get_greens_tensors + + + + .. rubric:: Private Methods + + .. warning:: + + Private methods are mainly for internal/developer use and their API might change without notice. + + .. autosummary:: + :toctree: . + :nosignatures: + + ~Client._get_greens_tensor + + + + \ No newline at end of file diff --git a/_sources/library/generated/mtuq.io.clients.SPECFEM3D_SGT.Client._get_greens_tensor.rst.txt b/_sources/library/generated/mtuq.io.clients.SPECFEM3D_SGT.Client._get_greens_tensor.rst.txt new file mode 100644 index 000000000..c9321a40e --- /dev/null +++ b/_sources/library/generated/mtuq.io.clients.SPECFEM3D_SGT.Client._get_greens_tensor.rst.txt @@ -0,0 +1,6 @@ +mtuq.io.clients.SPECFEM3D_SGT.Client._get_greens_tensor +======================================================= + +.. currentmodule:: mtuq.io.clients.SPECFEM3D_SGT + +.. automethod:: Client._get_greens_tensor \ No newline at end of file diff --git a/_sources/library/generated/mtuq.io.clients.SPECFEM3D_SGT.Client.get_greens_tensors.rst.txt b/_sources/library/generated/mtuq.io.clients.SPECFEM3D_SGT.Client.get_greens_tensors.rst.txt new file mode 100644 index 000000000..f5c8e75c3 --- /dev/null +++ b/_sources/library/generated/mtuq.io.clients.SPECFEM3D_SGT.Client.get_greens_tensors.rst.txt @@ -0,0 +1,6 @@ +mtuq.io.clients.SPECFEM3D_SGT.Client.get_greens_tensors +======================================================= + +.. currentmodule:: mtuq.io.clients.SPECFEM3D_SGT + +.. automethod:: Client.get_greens_tensors \ No newline at end of file diff --git a/_sources/library/generated/mtuq.io.clients.SPECFEM3D_SGT.Client.rst.txt b/_sources/library/generated/mtuq.io.clients.SPECFEM3D_SGT.Client.rst.txt new file mode 100644 index 000000000..9b685b496 --- /dev/null +++ b/_sources/library/generated/mtuq.io.clients.SPECFEM3D_SGT.Client.rst.txt @@ -0,0 +1,118 @@ +mtuq.io.clients.SPECFEM3D_SGT.Client +==================================== + +.. currentmodule:: mtuq.io.clients.SPECFEM3D_SGT +.. autoclass:: Client + :show-inheritance: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .. rubric:: Public Methods + + .. autosummary:: + :toctree: . + :nosignatures: + + ~Client.get_greens_tensors + ~Client.set_local_db + ~Client.set_remote_db + + + + .. rubric:: Private Methods + + .. warning:: + + Private methods are mainly for internal/developer use and their API might change without notice. + + .. autosummary:: + :toctree: . + :nosignatures: + + ~Client._get_greens_tensor + + + + \ No newline at end of file diff --git a/_sources/library/generated/mtuq.io.clients.SPECFEM3D_SGT.Client.set_local_db.rst.txt b/_sources/library/generated/mtuq.io.clients.SPECFEM3D_SGT.Client.set_local_db.rst.txt new file mode 100644 index 000000000..c6f9be970 --- /dev/null +++ b/_sources/library/generated/mtuq.io.clients.SPECFEM3D_SGT.Client.set_local_db.rst.txt @@ -0,0 +1,6 @@ +mtuq.io.clients.SPECFEM3D_SGT.Client.set_local_db +================================================= + +.. currentmodule:: mtuq.io.clients.SPECFEM3D_SGT + +.. automethod:: Client.set_local_db \ No newline at end of file diff --git a/_sources/library/generated/mtuq.io.clients.SPECFEM3D_SGT.Client.set_remote_db.rst.txt b/_sources/library/generated/mtuq.io.clients.SPECFEM3D_SGT.Client.set_remote_db.rst.txt new file mode 100644 index 000000000..e629e575b --- /dev/null +++ b/_sources/library/generated/mtuq.io.clients.SPECFEM3D_SGT.Client.set_remote_db.rst.txt @@ -0,0 +1,6 @@ +mtuq.io.clients.SPECFEM3D_SGT.Client.set_remote_db +================================================== + +.. currentmodule:: mtuq.io.clients.SPECFEM3D_SGT + +.. automethod:: Client.set_remote_db \ No newline at end of file diff --git a/_sources/library/generated/mtuq.io.clients.syngine.Client._get_greens_tensor.rst.txt b/_sources/library/generated/mtuq.io.clients.syngine.Client._get_greens_tensor.rst.txt new file mode 100644 index 000000000..a55ac4918 --- /dev/null +++ b/_sources/library/generated/mtuq.io.clients.syngine.Client._get_greens_tensor.rst.txt @@ -0,0 +1,6 @@ +mtuq.io.clients.syngine.Client._get_greens_tensor +================================================= + +.. currentmodule:: mtuq.io.clients.syngine + +.. automethod:: Client._get_greens_tensor \ No newline at end of file diff --git a/_sources/library/generated/mtuq.io.clients.syngine.Client.get_greens_tensors.rst.txt b/_sources/library/generated/mtuq.io.clients.syngine.Client.get_greens_tensors.rst.txt new file mode 100644 index 000000000..2a411a140 --- /dev/null +++ b/_sources/library/generated/mtuq.io.clients.syngine.Client.get_greens_tensors.rst.txt @@ -0,0 +1,6 @@ +mtuq.io.clients.syngine.Client.get_greens_tensors +================================================= + +.. currentmodule:: mtuq.io.clients.syngine + +.. automethod:: Client.get_greens_tensors \ No newline at end of file diff --git a/_sources/library/generated/mtuq.io.clients.syngine.Client.rst.txt b/_sources/library/generated/mtuq.io.clients.syngine.Client.rst.txt new file mode 100644 index 000000000..2d7a61793 --- /dev/null +++ b/_sources/library/generated/mtuq.io.clients.syngine.Client.rst.txt @@ -0,0 +1,110 @@ +mtuq.io.clients.syngine.Client +============================== + +.. currentmodule:: mtuq.io.clients.syngine +.. autoclass:: Client + :show-inheritance: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .. rubric:: Public Methods + + .. autosummary:: + :toctree: . + :nosignatures: + + ~Client.get_greens_tensors + + + + .. rubric:: Private Methods + + .. warning:: + + Private methods are mainly for internal/developer use and their API might change without notice. + + .. autosummary:: + :toctree: . + :nosignatures: + + ~Client._get_greens_tensor + + + + \ No newline at end of file diff --git a/_sources/library/generated/mtuq.io.readers.SAC.read.rst.txt b/_sources/library/generated/mtuq.io.readers.SAC.read.rst.txt new file mode 100644 index 000000000..bbd8ab813 --- /dev/null +++ b/_sources/library/generated/mtuq.io.readers.SAC.read.rst.txt @@ -0,0 +1,6 @@ +mtuq.io.readers.SAC.read +======================== + +.. currentmodule:: mtuq.io.readers.SAC + +.. autofunction:: read \ No newline at end of file diff --git a/_sources/library/generated/mtuq.misfit.waveform.level0.misfit.rst.txt b/_sources/library/generated/mtuq.misfit.waveform.level0.misfit.rst.txt new file mode 100644 index 000000000..5eadf37bc --- /dev/null +++ b/_sources/library/generated/mtuq.misfit.waveform.level0.misfit.rst.txt @@ -0,0 +1,6 @@ +mtuq.misfit.waveform.level0.misfit +================================== + +.. currentmodule:: mtuq.misfit.waveform.level0 + +.. autofunction:: misfit \ No newline at end of file diff --git a/_sources/library/generated/mtuq.misfit.waveform.level0.rst.txt b/_sources/library/generated/mtuq.misfit.waveform.level0.rst.txt new file mode 100644 index 000000000..17edd41c8 --- /dev/null +++ b/_sources/library/generated/mtuq.misfit.waveform.level0.rst.txt @@ -0,0 +1,39 @@ +mtuq.misfit.waveform.level0 +=========================== + +.. currentmodule:: mtuq.misfit.waveform.level0 +.. automodule:: mtuq.misfit.waveform.level0 + + .. comment to end block + + + + + + + + + + + + .. rubric:: Public Functions + + .. autosummary:: + :toctree: . + :nosignatures: + + + misfit + + + + + + + + + + + + + \ No newline at end of file diff --git a/_sources/library/generated/mtuq.misfit.waveform.level1.Helper.get_L1_norm.rst.txt b/_sources/library/generated/mtuq.misfit.waveform.level1.Helper.get_L1_norm.rst.txt new file mode 100644 index 000000000..615c11af2 --- /dev/null +++ b/_sources/library/generated/mtuq.misfit.waveform.level1.Helper.get_L1_norm.rst.txt @@ -0,0 +1,6 @@ +mtuq.misfit.waveform.level1.Helper.get_L1_norm +============================================== + +.. currentmodule:: mtuq.misfit.waveform.level1 + +.. automethod:: Helper.get_L1_norm \ No newline at end of file diff --git a/_sources/library/generated/mtuq.misfit.waveform.level1.Helper.get_L2_norm.rst.txt b/_sources/library/generated/mtuq.misfit.waveform.level1.Helper.get_L2_norm.rst.txt new file mode 100644 index 000000000..e958bf922 --- /dev/null +++ b/_sources/library/generated/mtuq.misfit.waveform.level1.Helper.get_L2_norm.rst.txt @@ -0,0 +1,6 @@ +mtuq.misfit.waveform.level1.Helper.get_L2_norm +============================================== + +.. currentmodule:: mtuq.misfit.waveform.level1 + +.. automethod:: Helper.get_L2_norm \ No newline at end of file diff --git a/_sources/library/generated/mtuq.misfit.waveform.level1.Helper.get_synthetics.rst.txt b/_sources/library/generated/mtuq.misfit.waveform.level1.Helper.get_synthetics.rst.txt new file mode 100644 index 000000000..2e2f771a3 --- /dev/null +++ b/_sources/library/generated/mtuq.misfit.waveform.level1.Helper.get_synthetics.rst.txt @@ -0,0 +1,6 @@ +mtuq.misfit.waveform.level1.Helper.get_synthetics +================================================= + +.. currentmodule:: mtuq.misfit.waveform.level1 + +.. automethod:: Helper.get_synthetics \ No newline at end of file diff --git a/_sources/library/generated/mtuq.misfit.waveform.level1.Helper.get_time_shift.rst.txt b/_sources/library/generated/mtuq.misfit.waveform.level1.Helper.get_time_shift.rst.txt new file mode 100644 index 000000000..8a18b4c7e --- /dev/null +++ b/_sources/library/generated/mtuq.misfit.waveform.level1.Helper.get_time_shift.rst.txt @@ -0,0 +1,6 @@ +mtuq.misfit.waveform.level1.Helper.get_time_shift +================================================= + +.. currentmodule:: mtuq.misfit.waveform.level1 + +.. automethod:: Helper.get_time_shift \ No newline at end of file diff --git a/_sources/library/generated/mtuq.misfit.waveform.level1.Helper.rst.txt b/_sources/library/generated/mtuq.misfit.waveform.level1.Helper.rst.txt new file mode 100644 index 000000000..481f51f70 --- /dev/null +++ b/_sources/library/generated/mtuq.misfit.waveform.level1.Helper.rst.txt @@ -0,0 +1,107 @@ +mtuq.misfit.waveform.level1.Helper +================================== + +.. currentmodule:: mtuq.misfit.waveform.level1 +.. autoclass:: Helper + :show-inheritance: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .. rubric:: Public Methods + + .. autosummary:: + :toctree: . + :nosignatures: + + ~Helper.get_L1_norm + ~Helper.get_L2_norm + ~Helper.get_synthetics + ~Helper.get_time_shift + + + + + + \ No newline at end of file diff --git a/_sources/library/generated/mtuq.misfit.waveform.level1.misfit.rst.txt b/_sources/library/generated/mtuq.misfit.waveform.level1.misfit.rst.txt new file mode 100644 index 000000000..4a50bb6b7 --- /dev/null +++ b/_sources/library/generated/mtuq.misfit.waveform.level1.misfit.rst.txt @@ -0,0 +1,6 @@ +mtuq.misfit.waveform.level1.misfit +================================== + +.. currentmodule:: mtuq.misfit.waveform.level1 + +.. autofunction:: misfit \ No newline at end of file diff --git a/_sources/library/generated/mtuq.misfit.waveform.level1.rst.txt b/_sources/library/generated/mtuq.misfit.waveform.level1.rst.txt new file mode 100644 index 000000000..df9bc155f --- /dev/null +++ b/_sources/library/generated/mtuq.misfit.waveform.level1.rst.txt @@ -0,0 +1,48 @@ +mtuq.misfit.waveform.level1 +=========================== + +.. currentmodule:: mtuq.misfit.waveform.level1 +.. automodule:: mtuq.misfit.waveform.level1 + + .. comment to end block + + + + + + + + + + + + .. rubric:: Public Functions + + .. autosummary:: + :toctree: . + :nosignatures: + + + misfit + + + + + + + + + .. rubric:: Classes + + .. autosummary:: + :toctree: . + :nosignatures: + + + Helper + + + + + + \ No newline at end of file diff --git a/_sources/library/generated/mtuq.misfit.waveform.level2._autocorr_1.rst.txt b/_sources/library/generated/mtuq.misfit.waveform.level2._autocorr_1.rst.txt new file mode 100644 index 000000000..77b84ebcd --- /dev/null +++ b/_sources/library/generated/mtuq.misfit.waveform.level2._autocorr_1.rst.txt @@ -0,0 +1,6 @@ +mtuq.misfit.waveform.level2._autocorr_1 +======================================= + +.. currentmodule:: mtuq.misfit.waveform.level2 + +.. autofunction:: _autocorr_1 \ No newline at end of file diff --git a/_sources/library/generated/mtuq.misfit.waveform.level2._autocorr_2.rst.txt b/_sources/library/generated/mtuq.misfit.waveform.level2._autocorr_2.rst.txt new file mode 100644 index 000000000..e68890009 --- /dev/null +++ b/_sources/library/generated/mtuq.misfit.waveform.level2._autocorr_2.rst.txt @@ -0,0 +1,6 @@ +mtuq.misfit.waveform.level2._autocorr_2 +======================================= + +.. currentmodule:: mtuq.misfit.waveform.level2 + +.. autofunction:: _autocorr_2 \ No newline at end of file diff --git a/_sources/library/generated/mtuq.misfit.waveform.level2._check.rst.txt b/_sources/library/generated/mtuq.misfit.waveform.level2._check.rst.txt new file mode 100644 index 000000000..325f3e08d --- /dev/null +++ b/_sources/library/generated/mtuq.misfit.waveform.level2._check.rst.txt @@ -0,0 +1,6 @@ +mtuq.misfit.waveform.level2._check +================================== + +.. currentmodule:: mtuq.misfit.waveform.level2 + +.. autofunction:: _check \ No newline at end of file diff --git a/_sources/library/generated/mtuq.misfit.waveform.level2._corr_1_2.rst.txt b/_sources/library/generated/mtuq.misfit.waveform.level2._corr_1_2.rst.txt new file mode 100644 index 000000000..e71b3dfb4 --- /dev/null +++ b/_sources/library/generated/mtuq.misfit.waveform.level2._corr_1_2.rst.txt @@ -0,0 +1,6 @@ +mtuq.misfit.waveform.level2._corr_1_2 +===================================== + +.. currentmodule:: mtuq.misfit.waveform.level2 + +.. autofunction:: _corr_1_2 \ No newline at end of file diff --git a/_sources/library/generated/mtuq.misfit.waveform.level2._get_components.rst.txt b/_sources/library/generated/mtuq.misfit.waveform.level2._get_components.rst.txt new file mode 100644 index 000000000..fa8bf172f --- /dev/null +++ b/_sources/library/generated/mtuq.misfit.waveform.level2._get_components.rst.txt @@ -0,0 +1,6 @@ +mtuq.misfit.waveform.level2._get_components +=========================================== + +.. currentmodule:: mtuq.misfit.waveform.level2 + +.. autofunction:: _get_components \ No newline at end of file diff --git a/_sources/library/generated/mtuq.misfit.waveform.level2._get_data.rst.txt b/_sources/library/generated/mtuq.misfit.waveform.level2._get_data.rst.txt new file mode 100644 index 000000000..bf5e57436 --- /dev/null +++ b/_sources/library/generated/mtuq.misfit.waveform.level2._get_data.rst.txt @@ -0,0 +1,6 @@ +mtuq.misfit.waveform.level2._get_data +===================================== + +.. currentmodule:: mtuq.misfit.waveform.level2 + +.. autofunction:: _get_data \ No newline at end of file diff --git a/_sources/library/generated/mtuq.misfit.waveform.level2._get_greens.rst.txt b/_sources/library/generated/mtuq.misfit.waveform.level2._get_greens.rst.txt new file mode 100644 index 000000000..3de492337 --- /dev/null +++ b/_sources/library/generated/mtuq.misfit.waveform.level2._get_greens.rst.txt @@ -0,0 +1,6 @@ +mtuq.misfit.waveform.level2._get_greens +======================================= + +.. currentmodule:: mtuq.misfit.waveform.level2 + +.. autofunction:: _get_greens \ No newline at end of file diff --git a/_sources/library/generated/mtuq.misfit.waveform.level2._get_groups.rst.txt b/_sources/library/generated/mtuq.misfit.waveform.level2._get_groups.rst.txt new file mode 100644 index 000000000..333238dbd --- /dev/null +++ b/_sources/library/generated/mtuq.misfit.waveform.level2._get_groups.rst.txt @@ -0,0 +1,6 @@ +mtuq.misfit.waveform.level2._get_groups +======================================= + +.. currentmodule:: mtuq.misfit.waveform.level2 + +.. autofunction:: _get_groups \ No newline at end of file diff --git a/_sources/library/generated/mtuq.misfit.waveform.level2._get_mask.rst.txt b/_sources/library/generated/mtuq.misfit.waveform.level2._get_mask.rst.txt new file mode 100644 index 000000000..b087ac66c --- /dev/null +++ b/_sources/library/generated/mtuq.misfit.waveform.level2._get_mask.rst.txt @@ -0,0 +1,6 @@ +mtuq.misfit.waveform.level2._get_mask +===================================== + +.. currentmodule:: mtuq.misfit.waveform.level2 + +.. autofunction:: _get_mask \ No newline at end of file diff --git a/_sources/library/generated/mtuq.misfit.waveform.level2._get_padding.rst.txt b/_sources/library/generated/mtuq.misfit.waveform.level2._get_padding.rst.txt new file mode 100644 index 000000000..f255ea7c6 --- /dev/null +++ b/_sources/library/generated/mtuq.misfit.waveform.level2._get_padding.rst.txt @@ -0,0 +1,6 @@ +mtuq.misfit.waveform.level2._get_padding +======================================== + +.. currentmodule:: mtuq.misfit.waveform.level2 + +.. autofunction:: _get_padding \ No newline at end of file diff --git a/_sources/library/generated/mtuq.misfit.waveform.level2._get_stations.rst.txt b/_sources/library/generated/mtuq.misfit.waveform.level2._get_stations.rst.txt new file mode 100644 index 000000000..39ffdc296 --- /dev/null +++ b/_sources/library/generated/mtuq.misfit.waveform.level2._get_stations.rst.txt @@ -0,0 +1,6 @@ +mtuq.misfit.waveform.level2._get_stations +========================================= + +.. currentmodule:: mtuq.misfit.waveform.level2 + +.. autofunction:: _get_stations \ No newline at end of file diff --git a/_sources/library/generated/mtuq.misfit.waveform.level2._get_time_sampling.rst.txt b/_sources/library/generated/mtuq.misfit.waveform.level2._get_time_sampling.rst.txt new file mode 100644 index 000000000..81cb87190 --- /dev/null +++ b/_sources/library/generated/mtuq.misfit.waveform.level2._get_time_sampling.rst.txt @@ -0,0 +1,6 @@ +mtuq.misfit.waveform.level2._get_time_sampling +============================================== + +.. currentmodule:: mtuq.misfit.waveform.level2 + +.. autofunction:: _get_time_sampling \ No newline at end of file diff --git a/_sources/library/generated/mtuq.misfit.waveform.level2._get_weights.rst.txt b/_sources/library/generated/mtuq.misfit.waveform.level2._get_weights.rst.txt new file mode 100644 index 000000000..f58dc9316 --- /dev/null +++ b/_sources/library/generated/mtuq.misfit.waveform.level2._get_weights.rst.txt @@ -0,0 +1,6 @@ +mtuq.misfit.waveform.level2._get_weights +======================================== + +.. currentmodule:: mtuq.misfit.waveform.level2 + +.. autofunction:: _get_weights \ No newline at end of file diff --git a/_sources/library/generated/mtuq.misfit.waveform.level2._to_array.rst.txt b/_sources/library/generated/mtuq.misfit.waveform.level2._to_array.rst.txt new file mode 100644 index 000000000..b8a97c468 --- /dev/null +++ b/_sources/library/generated/mtuq.misfit.waveform.level2._to_array.rst.txt @@ -0,0 +1,6 @@ +mtuq.misfit.waveform.level2._to_array +===================================== + +.. currentmodule:: mtuq.misfit.waveform.level2 + +.. autofunction:: _to_array \ No newline at end of file diff --git a/_sources/library/generated/mtuq.misfit.waveform.level2._type.rst.txt b/_sources/library/generated/mtuq.misfit.waveform.level2._type.rst.txt new file mode 100644 index 000000000..1e41ebdb7 --- /dev/null +++ b/_sources/library/generated/mtuq.misfit.waveform.level2._type.rst.txt @@ -0,0 +1,6 @@ +mtuq.misfit.waveform.level2._type +================================= + +.. currentmodule:: mtuq.misfit.waveform.level2 + +.. autofunction:: _type \ No newline at end of file diff --git a/_sources/library/generated/mtuq.misfit.waveform.level2.misfit.rst.txt b/_sources/library/generated/mtuq.misfit.waveform.level2.misfit.rst.txt new file mode 100644 index 000000000..f4b447c35 --- /dev/null +++ b/_sources/library/generated/mtuq.misfit.waveform.level2.misfit.rst.txt @@ -0,0 +1,6 @@ +mtuq.misfit.waveform.level2.misfit +================================== + +.. currentmodule:: mtuq.misfit.waveform.level2 + +.. autofunction:: misfit \ No newline at end of file diff --git a/_sources/library/generated/mtuq.misfit.waveform.level2.rst.txt b/_sources/library/generated/mtuq.misfit.waveform.level2.rst.txt new file mode 100644 index 000000000..85490e35e --- /dev/null +++ b/_sources/library/generated/mtuq.misfit.waveform.level2.rst.txt @@ -0,0 +1,110 @@ +mtuq.misfit.waveform.level2 +=========================== + +.. currentmodule:: mtuq.misfit.waveform.level2 +.. automodule:: mtuq.misfit.waveform.level2 + + .. comment to end block + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .. rubric:: Public Functions + + .. autosummary:: + :toctree: . + :nosignatures: + + + misfit + + + + .. rubric:: Private Functions + + .. warning:: + + Private functions are mainly for internal/developer use and their API might change without notice. + + .. autosummary:: + :toctree: . + :nosignatures: + + _autocorr_1 + _autocorr_2 + _check + _corr_1_2 + _get_components + _get_data + _get_greens + _get_groups + _get_mask + _get_padding + _get_stations + _get_time_sampling + _get_weights + _to_array + _type + + + + + + + + + + + \ No newline at end of file diff --git a/_sources/library/generated/mtuq.open_db.rst.txt b/_sources/library/generated/mtuq.open_db.rst.txt new file mode 100644 index 000000000..a8bd18d3d --- /dev/null +++ b/_sources/library/generated/mtuq.open_db.rst.txt @@ -0,0 +1,6 @@ +mtuq.open_db +============ + +.. currentmodule:: mtuq + +.. autofunction:: open_db \ No newline at end of file diff --git a/_sources/library/generated/mtuq.read.rst.txt b/_sources/library/generated/mtuq.read.rst.txt new file mode 100644 index 000000000..c1fc8b9b2 --- /dev/null +++ b/_sources/library/generated/mtuq.read.rst.txt @@ -0,0 +1,6 @@ +mtuq.read +========= + +.. currentmodule:: mtuq + +.. autofunction:: read \ No newline at end of file diff --git a/_sources/library/generated/mtuq.util.math.to_rtp.rst.txt b/_sources/library/generated/mtuq.util.math.to_rtp.rst.txt new file mode 100644 index 000000000..3abe4ce3d --- /dev/null +++ b/_sources/library/generated/mtuq.util.math.to_rtp.rst.txt @@ -0,0 +1,6 @@ +mtuq.util.math.to_rtp +===================== + +.. currentmodule:: mtuq.util.math + +.. autofunction:: to_rtp \ No newline at end of file diff --git a/_sources/library/index.rst.txt b/_sources/library/index.rst.txt new file mode 100644 index 000000000..a796d05a2 --- /dev/null +++ b/_sources/library/index.rst.txt @@ -0,0 +1,159 @@ +Library reference +================= + +.. warning:: + + MTUQ is still in under development. Some documentation may be incomplete or describe planned rather than current functionality. + + +Seismic data structures +----------------------- + +============================================================================================================ ============================================================================================================ +`mtuq.Dataset `_ Container for observed or synthetic seismic data +`mtuq.GreenTensor `_ Green's tensor object +`mtuq.GreenTensorList `_ Container for Green's tensor objects +============================================================================================================ ============================================================================================================ + + +Data I/O +-------- + +============================================================================================================ ============================================================================================================ +`mtuq.download_greens_tensors `_ Downloads Green's tensors from syngine +`mtuq.open_db `_ Opens Green's tensor database from disk +`mtuq.open_ds `_ Opens grid search results from disk +`mtuq.read `_ Reads seismic data from disk +============================================================================================================ ============================================================================================================ + + + +Data processing and inversion +----------------------------- + +============================================================================================================ ============================================================================================================ +`mtuq.ProcessData `_ Data processing function constructor +`mtuq.PolarityMisfit `_ Polarity misfit function constructor +`mtuq.WaveformMisfit `_ Waveform misfit function constructor +`mtuq.grid_search `_ Evaluates misfit over grids +`mtuq.MTUQDataArray `_ Data structure for storing misfit on regularly-spaced grids +`mtuq.MTUQDataFrame `_ Data structure for storing misfit on irregularly-spaced grids +============================================================================================================ ============================================================================================================ + + +Station and event structures +---------------------------- + +============================================================================================================ ============================================================================================================ +`mtuq.Station `_ Station metdata object +`mtuq.Origin `_ Origin metdata object +`mtuq.Wavelet `_ Source wavelet or source-time function object +`mtuq.Force `_ Force source +`mtuq.MomentTensor `_ Moment tensor source +============================================================================================================ ============================================================================================================ + + +Data visualization +------------------ + +============================================================================================================ ============================================================================================================ +`mtuq.graphics.plot_waveforms1 `_ Plots surface waves only +`mtuq.graphics.plot_waveforms2 `_ Plots body and surface waves +`mtuq.graphics.plot_data_greens1 `_ Variation on `plot_waveforms1` +`mtuq.graphics.plot_data_greens2 `_ Variation on `plot_waveforms2` +`mtuq.graphics.plot_beachball `_ Plots first-motion beachball +`mtuq.graphics.plot_polarities `_ Plots first-motion data fit +============================================================================================================ ============================================================================================================ + + +Moment tensor and force visualization +------------------------------------- + +============================================================================================================ ============================================================================================================ +`mtuq.graphics.plot_likelihood_lune `_ Plots maximum likelihoods on lune +`mtuq.graphics.plot_marginal_lune `_ Plots marginal likelihoods on lune +`mtuq.graphics.plot_misfit_lune `_ Plots misfit on lune +`mtuq.graphics.plot_likelihood_vw `_ Plots maximum likelihoods on `v,w` rectangle +`mtuq.graphics.plot_marginal_vw `_ Plots marginal likelihoods on `v,w` rectangle +`mtuq.graphics.plot_misfit_vw `_ Plots misfit on `v,w` rectangle +`mtuq.graphics.plot_likelihood_force `_ Plots maximum likelihoods w.r.t force orientation +`mtuq.graphics.plot_marginal_force `_ Plots marginal likelihoods w.r.t. force orientation +`mtuq.graphics.plot_misfit_force `_ Plots misfit w.r.t force orientation +============================================================================================================ ============================================================================================================ + + +Depth and hypocenter visualization +---------------------------------- + +============================================================================================================ ============================================================================================================ +`mtuq.graphics.plot_likelihood_depth `_ Plots maximum likelihoods versus depth +`mtuq.graphics.plot_misfit_depth `_ Plots misfit versus depth +`mtuq.graphics.plot_likelihood_latlon `_ Plots maximum likelihoods versus hypocenter +`mtuq.graphics.plot_misfit_laton `_ Plots misfit versus hypocenter +============================================================================================================ ============================================================================================================ + + +Station attributes visualization +-------------------------------------------- + +============================================================================================================ ============================================================================================================ +`mtuq.graphics.plot_time_shifts `_ Plots time shifts by location and component +`mtuq.graphics.plot_amplitude_ratios `_ Plots amplitude ratios by location and component +`mtuq.graphics.plot_cross_corr `_ Plots normalized cross-correlation by location and component +============================================================================================================ ============================================================================================================ + + +Moment tensor and force grids +----------------------------- + +============================================================================================================ ============================================================================================================ +`mtuq.grid.FullMomentTensorGridRandom `_ Grid with randomly-drawn full moment tensors +`mtuq.grid.FullMomentTensorGridSemiregular `_ Grid with semiregularly-spaced full moment tensors +`mtuq.grid.DoubleCoupleGridRandom `_ Grid with randomly-drawn double couples +`mtuq.grid.DoubleCoupleGridRegular `_ Grid with regularly-spaced double couples +`mtuq.grid.DeviatoricGridRandom `_ Grid with randomly-drawn deviatoric moment tensors +`mtuq.grid.DeviatoricGridSemiregular `_ Grid with semiregularly-spaced deviatoric moment tensors +`mtuq.grid.ForceGridRandom `_ Grid with randomly-drawn forces +`mtuq.grid.ForceGridRegular `_ Grid with regularly-spaced forces +============================================================================================================ ============================================================================================================ + + +Grid base classes +----------------- +.. note:: + These base classes can be used for specialized uses cases not covered by the above grids + +============================================================================================================ ============================================================================================================ +`mtuq.grid.Grid `_ Grid defined by values on axes +`mtuq.grid.UnstructuredGrid `_ Grid defined by lists of coordinates points +============================================================================================================ ============================================================================================================ + + + +Database and web service clients +-------------------------------- + +.. note:: + These classes provide low-level database and web service access. Normally it is easier to use high-level functions ``mtuq.download_greens_tensors`` or ``mtuq.open_db`` instead. + +============================================================================================================ ============================================================================================================ +`mtuq.io.clients.AxiSEM_NetCDF.Client `_ AxiSEM NetCDF database client based on instaseis +`mtuq.io.clients.FK_SAC.Client `_ FK database client +`mtuq.io.clients.SPECFEM3D_SGT.Client `_ SPECFEM3D/3D_GLOBE database client based on seisgen +`mtuq.io.clients.syngine.Client `_ Syngine web service client +============================================================================================================ ============================================================================================================ + + + +Low-level misfit modules +------------------------ + +.. note:: + Waveform misfit evaluation is the most computationally intensive task performed by this package. These classes provide low-level access to non-optimized and optimized versions of the misfit function (the former exists to check correctness of the latter). Normally users can avoid this complexity by simply calling ``mtuq.misfit.WaveformMisfit``. + +============================================================================================================ ============================================================================================================ +`mtuq.misfit.waveform.level0.misfit `_ Easy-to-read pure Python implementation +`mtuq.misfit.waveform.level1.misfit `_ Fast pure Python implementation +`mtuq.misfit.waveform.level2.misfit `_ Fastest Python/C implementation +============================================================================================================ ============================================================================================================ + diff --git a/_sources/quick_start.rst.txt b/_sources/quick_start.rst.txt new file mode 100644 index 000000000..093a0b070 --- /dev/null +++ b/_sources/quick_start.rst.txt @@ -0,0 +1,49 @@ +Quick start +=========== + +An easy way to get started is to try out these `examples `_, which estimate source parameters for an event from `Silwal2016`. + +Before running any of the scripts, users must first `install MTUQ `_. After installation finishes, examples can be invoked within the `examples/` directory as follows: + +.. code:: + + python ./ + + +.. note:: + + The first time an example runs, Green's functions will be downloaded, which can take several minutes. Any subsequent runs will be much faster. + + +Serial example +-------------- + +The simplest example is `SerialGridSearch.DoubleCouple.py `_. After running the script, users can check their output against this `expected result `_. + +A typical runtime is about 60 seconds. For faster results, `GridSearch.DoubleCouple.py `_ runs the same inversion in parallel. + + +Parallel examples +----------------- + +All the other examples include MPI parallelization for faster evaluation on parallel systems. + +To see if MPI executables and libraries are present, start by checking if `mpirun` is on the system path. If necessary, ask a system administrator for assistance installing or configuring MPI. + +If MPI is present, run the parallel examples as follows: + +.. code:: + + mpirun -n python ./ + + +Note that the examples will still work if invoked without `mpirun`, but running times will be longer. + + +References +---------- + +[`Silwal2016`] Vipul Silwal and Carl Tape (2016), Seismic moment tensors and +estimated uncertainties in southern Alaska, JGR, https://doi.org/10.1002/2015JB012588 + + diff --git a/_sources/references.rst.txt b/_sources/references.rst.txt new file mode 100644 index 000000000..c27b96c89 --- /dev/null +++ b/_sources/references.rst.txt @@ -0,0 +1,17 @@ +References +---------- + +[`Alvizuri2018`] C. Alvizuri and C. Tape (2018), Full Moment Tensor Analysis of Nuclear Explosions in North Korea, SRL, https://doi.org/10.1785/0220180158 + +[`Minson2008`]] S.E. Minson and D.S. Dreger (2008), Stable inversions for complete moment tensors, GJI, 174: 585-592. https://doi.org/10.1111/j.1365-246X.2008.03797.xo + +[`Silwal2016`] V. Silwal and C. Tape (2016), Seismic moment tensors and estimated uncertainties in southern Alaska, JGR, https://doi.org/10.1002/2015JB012588 + +[`Tape2012`] W. Tape and C. Tape (2012), A geometric setting for moment tensors, GJI, https://doi.org/10.1111/j.1365-246X.2012.05491.x + +[`Tape2015`] W. Tape and C. Tape (2015), A uniform parameterization of moment tensors, GJI, https://doi.org/10.1093/gji/ggv262 + +[`Zhao1994`] L.-S. Zhao and D. Helmberger (1994), Source estimation from broadband regional seismograms. Bulletin of the Seismological Society of America 1994, 84 (1): 91-104 + +[`Zhu1996`] L. Zhu and D. Helmberger (1996), Advancement in source estimation techniques using broadband regional seismograms. Bulletin of the Seismological Society of America, 86 (5): 1634-1641 + diff --git a/_sources/user_guide/01.rst.txt b/_sources/user_guide/01.rst.txt new file mode 100644 index 000000000..1c9f48e46 --- /dev/null +++ b/_sources/user_guide/01.rst.txt @@ -0,0 +1,7 @@ +Learning Python and ObsPy +========================= + +To avoid reinventing the wheel, MTUQ makes extensive use of `ObsPy `_, a Python package for seismology. An excellent place to start, to become familiar with Python and ObsPy, is the `ObsPy tutorial `_. + + + diff --git a/_sources/user_guide/02.rst.txt b/_sources/user_guide/02.rst.txt new file mode 100644 index 000000000..aff65ff08 --- /dev/null +++ b/_sources/user_guide/02.rst.txt @@ -0,0 +1,38 @@ + +Acquiring seismic data +====================== + +Acquiring and quality control checking seismic data can be one of the most challenging steps in an inversion. This page describes our preferred data client and MTUQ's data and metadata format requirements. + + + +Data acquisition clients +------------------------ + +`ObsPy FDSN clients `_ provide a way of programmatically downloading waveforms from `IRIS `_. `PySEP `_ is a wrapper around an ObsPy FDSN client and our preferred data acquisition tool. + +Besides downloading waveforms through ObsPy calls, PySEP performs data processing and quality control, ensuring that the data processing and time discretization requirements below are satisfied. + +Additionally, PySEP generates "weight files" that can optionally be used by `mtuq.process_data` to control the relative contribution of different stations to the data misfit function. + + + +File format, metadata, and data processing requirements +------------------------------------------------------- + +SAC is currently the only file format supported by `mtuq.read`. + +The following information must be present in the SAC metadata headers: `station latitude`, `station longitude`, `network code`, `station code`, `location code` + +It is expected that the following data processing steps have been carried out prior to reading user-supplied waveforms by `mtuq.read`: + +- instrument response has already been removed +- traces have already by rotated into vertical (Z), radial (R) and transverse (T) components +- all traces have the same sampling rate + + +Other file formats +------------------ + +Besides SAC, many other file formats could be supported in principle. To make adding such support easier, `mtuq.read` closely follows `obspy.read`, with each supported file format having its own keyword argument and an identically named module in `mtuq.io.readers`. + diff --git a/_sources/user_guide/03.rst.txt b/_sources/user_guide/03.rst.txt new file mode 100644 index 000000000..0a73c94bd --- /dev/null +++ b/_sources/user_guide/03.rst.txt @@ -0,0 +1,138 @@ + +Acquiring Green's functions +=========================== + +The response of a medium to an impulsive source is called a Green's function. This page describes the role of Green's functions in source inversions, the types of Green's functions supported by MTUQ, and how these different types can each be obtained. + + +Role of Green's functions +------------------------- + +By combining Green's functions, it is possible to obtain synthetics from any moment tensor or force source. Generating synthetics in this way is useful because it provides cost savings compared with on-the-fly wavefield simulations. Synthetics can then be compared with data to determine a best-fitting source. + +`GreensTensor` objects +---------------------- + +`GreensTensor `_ objects provide access to a set of Green's functions describing the medium response between a given hypocenter and station. + +Methods built into the `GreensTensor` class allow data processing and synthetics generation. In particular, the `get_synthetics `_ method accepts a `MomentTensor` or `Force` and returns corresponding synthetics. + + + +Green's function conventions +---------------------------- + +A major goal of MTUQ is to avoid exposing users to unnecessary complexity. For Green's functions, MTUQ tries to accomplish this by understanding external conventions and converting to a common internal format. Specifically, MTUQ uses an `up-south-east` `convention `_ for internally storing impulse responses corresponding to individual force couples. (Moment tensors and forces are internally represented using the same `up-south-east` basis.) + +Under the hood, MTUQ deals with a variety of external conventions related to (1) the symmetry of the medium (for example, 1D media require fewer independent Green's functions than 3D media); (2) the choice of local Cartesian basis convention (for example, some authors employ `up-south-east`, others `north-east-down`). A sense of what's involved can be obtained by browsing the `source code `_ and references therein. + + + +Downloading precomputed Green's functions +----------------------------------------- + +An easy way to acquire Green's functions is to download them from `syngine `_, a web service that hosts Green's functions from the following 1D Earth models: `PREM`, `AK135`, and `iasp91`. + +To download AK135 Green's functions and generate MTUQ `GreensTensor` objects: + +.. code :: + + from mtuq import download_greens_functions + greens_tensors = download_greens_functions(stations, origins, model="ak135f_2s") + +A limitation of syngine is that Green's functions can be downloaded only on a station-by-station basis, not over an entire area or volume. An alternative that avoids this limitation is to compute your own Green's functions. + + + + +Computing Green's functions from 1D Earth models +------------------------------------------------ + +MTUQ supports the following 1D Green's functions formats: AxiSEM (preferred) and FK. + +`AxiSEM `_ performs spectral element wave simulations in radially-symmetric Earth models. AxiSEM NetCDF files can be used to retrieve vertical, radial, and transverse displacement in units of m*(N-m)^-1. + +To generate AxiSEM synthetics in a format MTUQ supports, follow the instructions in the `AxiSEM user manual `_ under "Output wavefields in NetCDF format needed by instaseis." + +To open an AxiSEM database client in MTUQ: + +.. code :: + + from mtuq import open_db + db = open_db(path_to_NetCDF_file, format="AxiSEM") + + +`FK `_ simulates wave propagation in horizontally-layered elastic media using a frequency-wavenumber integration method. FK simulations create SAC files in a directory tree organized by model, event depth, and event distance. Each SAC file represents a vertical, radial, or transverse velocity time series in units of 10^-20*cm*(dyne-cm)^-1 s^-1. + + +To open an FK database client in MTUQ: + +.. code :: + + from mtuq import open_db + db = open_db(path_to_FK_directory_tree, format="FK") + + + +Once opened, an AxiSEM or FK database client can be used to generate `GreensTensor `_ objects as follows: + +.. code:: + + greens_tensors = db.get_greens_tensors(stations, origin) + + + + + +Computing Green's functions from 3D Earth models +------------------------------------------------ + +MTUQ currently supports 3D Green's functions from SPECFEM3D/3D_GLOBE. + +To generate a full set of Green's functions for a given hypocenter and depth, six SPECFEM3D/3D_GLOBE wavefield simulations are required. Output must be saved as/converted to SAC files at individual stations using the following filename convention, which comes from `GRD_CMT3D `_. Place all SAC files corresponding to a single hypocenter and depth in the same directory as follows: + +.. code :: + + {event_id}/ + {depth_in_km}/ + {net}.{sta}.{loc}.Z.Mrr.sac + {net}.{sta}.{loc}.Z.Mtt.sac + {net}.{sta}.{loc}.Z.Mpp.sac + {net}.{sta}.{loc}.Z.Mrt.sac + {net}.{sta}.{loc}.Z.Mrp.sac + {net}.{sta}.{loc}.Z.Mtp.sac + {net}.{sta}.{loc}.R.Mrr.sac + {net}.{sta}.{loc}.R.Mtt.sac + {net}.{sta}.{loc}.R.Mpp.sac + {net}.{sta}.{loc}.R.Mrt.sac + {net}.{sta}.{loc}.R.Mrp.sac + {net}.{sta}.{loc}.R.Mtp.sac + {net}.{sta}.{loc}.T.Mrr.sac + {net}.{sta}.{loc}.T.Mtt.sac + {net}.{sta}.{loc}.T.Mpp.sac + {net}.{sta}.{loc}.T.Mrt.sac + {net}.{sta}.{loc}.T.Mrp.sac + {net}.{sta}.{loc}.T.Mtp.sac + + +To open a SPECFEM3D/3D_GLOBE database client: + +.. code:: + + from mtuq import open_db + db = open_db(path_SPECFEM3D_output_directory, format="SPECFEM3D") + + +Once opened, the database client can be used to generate `GreensTensor `_ objects as follows: + +.. code:: + + greens_tensors = db.get_greens_tensors(stations, origin) + + +For more information, see also: + +`Source-side Green's function details (under construction) `_ + +`Receiver-side Green's function details (under construction) `_ + diff --git a/_sources/user_guide/03/receiver_side.rst.txt b/_sources/user_guide/03/receiver_side.rst.txt new file mode 100644 index 000000000..c13fdc2c6 --- /dev/null +++ b/_sources/user_guide/03/receiver_side.rst.txt @@ -0,0 +1,14 @@ + +.. warning:: + + This page is still under construction. To help improve the + documentation, feel free to submit a pull request. + + +Receiver-side 3D Green's functions +================================== + +A working of example using receiver-side 3D Green's functions from SPECFEM3D in a moment tensor inversion: + +`test_greens_SPECFEM3D_SGT.py `_ + diff --git a/_sources/user_guide/03/source_side.rst.txt b/_sources/user_guide/03/source_side.rst.txt new file mode 100644 index 000000000..78e26aa96 --- /dev/null +++ b/_sources/user_guide/03/source_side.rst.txt @@ -0,0 +1,197 @@ + +.. warning:: + + This page is still under construction. To help improve the + documentation, feel free to submit a pull request. + + +Source-side 3D Green's functions +================================ + +Generating source-side 3D Green's functions using SPECFEM3D/3D_GLOBE +-------------------------------------------------------------------- + +In principle, any 3D solver can be used to generate source-side Green's functions, as long as the `requirements `_ below are satisfied. + +So far, however, the machinery has only been tested using SPECFEM3D/3D_GLOBE. To convert SPECFEM3D/3D_GLOBE output to MTUQ-compliant Green's functions, the following steps are necessary. + + +**Generate SAC binary files** + +SAC binary output format is natively supported by SPECFEM3D_GLOBE (in the parameter file, set `OUTPUT_SEISMOS_SAC_BINARY = .true.`). + +Unfortunately, SAC binary output format is not natively supported by SPECFEM3D, so it is necessary to manually convert SPECFEM3D output. + + +**Convert to SI units** + +SPECFEM3D/3D_GLOBE use a mixed SI and CGS convention, in which moment tensor elements are input in terms of dynes and centimeters, and seismograms are output in meters. + +In contrast, MTUQ uses a fully SI convention (see "Requirements for MTUQ source-side 3D Green's functions +- Units convention"). + +As a result, it is necessary to scale SPECFEM3D/3D_GLOBE seismograms by 10^7 prior to using them as MTUQ Green's functions. + + +**Additional amplitude scaling** + +In addition to converting to SI units, it is also necessary to account for any scaling factors in the SPECFEM3D/3D_GLOBE input files. Such scaling factors can enter, for example, through the `M_rr,M_tt,M_pp,M_rt,M_rp,M_tp` values in the moment tensor input file or through the `scaling factor `_ in the force input file. + + +**Rotate to vertical, radial, transverse components** + +Conveniently, SPECFEM3D_GLOBE can be made to automatically rotate output seismograms into vertical, radial and transverse components (set `ROTATE_SEISMOGRAMS_RT = .true.` in the parameter file). + +No modifications are necessary on account of moment tensor basis convention, since MTUQ's `up-south-east` convention matches SPECFEM3D/3D_GLOBE's. + + + + +Requirements for MTUQ source-side 3D Green's functions +------------------------------------------------------ + +**File format** + +Individual Green's functions must be written to SAC binary files. + +A total of 18 SAC binary files are required to represent the response between a given hypocenter and station (corresponding to 6 moment tensor elements times 3 directions of motion). + + +Units Convention +................ + +For a moment tensor inversion, each SAC binary file must give the response in meters to a 1 Newton-meter force couple. + +For a force inversion, each SAC binary file must give the response in meters to a 1 Newton force. + +In both cases, MTUQ uses a fully SI units convention (compare with SPECFEM3D/3D_GLOBE notes, above). + + + +**Basis convention** + +MTUQ uses an `up-south-east` basis convention in which `r` denotes vertically upward, `t` denotes south, and `p` denotes east. + +Green's functions must be rotated into into vertical `Z`, radial `R` and transverse `T` components relative to the source-receiver backazimuth. + +Place all seismograms for the same hypocenter in a single directory as follows: + +.. code :: + + {event_id}/ + {depth_in_km}/ + {net}.{sta}.{loc}.Z.Mrr.sac + {net}.{sta}.{loc}.Z.Mtt.sac + {net}.{sta}.{loc}.Z.Mpp.sac + {net}.{sta}.{loc}.Z.Mrt.sac + {net}.{sta}.{loc}.Z.Mrp.sac + {net}.{sta}.{loc}.Z.Mtp.sac + {net}.{sta}.{loc}.R.Mrr.sac + {net}.{sta}.{loc}.R.Mtt.sac + {net}.{sta}.{loc}.R.Mpp.sac + {net}.{sta}.{loc}.R.Mrt.sac + {net}.{sta}.{loc}.R.Mrp.sac + {net}.{sta}.{loc}.R.Mtp.sac + {net}.{sta}.{loc}.T.Mrr.sac + {net}.{sta}.{loc}.T.Mtt.sac + {net}.{sta}.{loc}.T.Mpp.sac + {net}.{sta}.{loc}.T.Mrt.sac + {net}.{sta}.{loc}.T.Mrp.sac + {net}.{sta}.{loc}.T.Mtp.sac + ... + +The corresponding convention for force responses is: + +.. warning:: + + Not yet tested; subject to change without notice. + + +.. code :: + + {event_id}/ + {depth_in_km}/ + {net}.{sta}.{loc}.Z.Fz.sac + {net}.{sta}.{loc}.Z.Fs.sac + {net}.{sta}.{loc}.Z.Fe.sac + {net}.{sta}.{loc}.R.Fz.sac + {net}.{sta}.{loc}.R.Fs.sac + {net}.{sta}.{loc}.R.Fe.sac + {net}.{sta}.{loc}.T.Fz.sac + {net}.{sta}.{loc}.T.Fs.sac + {net}.{sta}.{loc}.T.Fe.sac + ... + + +**Origin time convention** + +For origin time, MTUQ uses a centroid convention (`more details `_), so that `t=0` in the `GreensTensor` time discretization corresponds to mean source excitation time. + +MTUQ uses the begin time (`B`) and end time (`E`) headers from the SAC binary files to align the Green's functions relative to centroid origin time. + +Currently, these are the only SAC headers used in reading Green's functions. + +(Note that different `SAC headers `_ are required in reading `observed data `_.) + + + +Hypocenter searches (experimental) +---------------------------------- + +Currently, only searches over source depth are possible with source-side 3D Green's functions (no other hypocenter parameters). + +The current `depth search `_ implementation is especially crude and experimental (consider local modifications to suit your needs). + +To allow depth searches, create subdirectories for each centroid depth as follows: + +.. code :: + + {event_id}/ + {depth_in_km}/ + {net}.{sta}.{loc}.Z.Mrr.sac + {net}.{sta}.{loc}.Z.Mtt.sac + {net}.{sta}.{loc}.Z.Mpp.sac + {net}.{sta}.{loc}.Z.Mrt.sac + {net}.{sta}.{loc}.Z.Mrp.sac + {net}.{sta}.{loc}.Z.Mtp.sac + {net}.{sta}.{loc}.R.Mrr.sac + {net}.{sta}.{loc}.R.Mtt.sac + {net}.{sta}.{loc}.R.Mpp.sac + {net}.{sta}.{loc}.R.Mrt.sac + {net}.{sta}.{loc}.R.Mrp.sac + {net}.{sta}.{loc}.R.Mtp.sac + {net}.{sta}.{loc}.T.Mrr.sac + {net}.{sta}.{loc}.T.Mtt.sac + {net}.{sta}.{loc}.T.Mpp.sac + {net}.{sta}.{loc}.T.Mrt.sac + {net}.{sta}.{loc}.T.Mrp.sac + {net}.{sta}.{loc}.T.Mtp.sac + {depth_in_km}/ + {net}.{sta}.{loc}.Z.Mrr.sac + {net}.{sta}.{loc}.Z.Mtt.sac + {net}.{sta}.{loc}.Z.Mpp.sac + {net}.{sta}.{loc}.Z.Mrt.sac + {net}.{sta}.{loc}.Z.Mrp.sac + {net}.{sta}.{loc}.Z.Mtp.sac + {net}.{sta}.{loc}.R.Mrr.sac + {net}.{sta}.{loc}.R.Mtt.sac + {net}.{sta}.{loc}.R.Mpp.sac + {net}.{sta}.{loc}.R.Mrt.sac + {net}.{sta}.{loc}.R.Mrp.sac + {net}.{sta}.{loc}.R.Mtp.sac + {net}.{sta}.{loc}.T.Mrr.sac + {net}.{sta}.{loc}.T.Mtt.sac + {net}.{sta}.{loc}.T.Mpp.sac + {net}.{sta}.{loc}.T.Mrt.sac + {net}.{sta}.{loc}.T.Mrp.sac + {net}.{sta}.{loc}.T.Mtp.sac + ... + + +Working example +--------------- + +A working of example using source-side 3D Green's functions from SPECFEM3D_GLOBE in a moment tensor inversion: + +`test_greens_SPECFEM3D_SAC.py `_ + diff --git a/_sources/user_guide/04.rst.txt b/_sources/user_guide/04.rst.txt new file mode 100644 index 000000000..ef63ceb49 --- /dev/null +++ b/_sources/user_guide/04.rst.txt @@ -0,0 +1,66 @@ + + +Data processing +=============== + +Filtering, windowing and other signal processing operations are essential for meaningful comparisons between data synthetics. + +To make data processing easier, `mtuq.ProcessData` is an attempt at a one-size-fits-all data processing class. While the approach below based on `mtuq.ProcessData` is very general, users are nevertheless free to apply their own custom data processing functions instead, with the only condition being that the `requirements `_ below end up being satisfied. + + + +An approach based on `mtuq.ProcessData` +--------------------------------------- + +Data processing choices include filter type, window length, and many others. For detailed descriptions of all available parameters, see the `library reference `_. + + + +With `mtuq.ProcessData`, the choice of data processing parameters is clearly separated from the application of the data processing function to seismic data, resulting in a two-step procedure. + +In the first step, the user supplies parameters to create a data processing function: + +.. code:: + + process_data = ProcessData(**parameters) + +In the second step, an ObsPy stream is given as input and a processed stream returned as output: + +.. code:: + + processed_stream = process_data(stream) + + +Data processing can also be applied to an entire `Dataset` at once: + +.. code:: + + processed_data = mtuq.Dataset() + for stream in raw_data: + processed_data += process_data(stream) + + +Or, more succinctly: + +.. code:: + + processed_data = raw_data.map(process_data) + + + +Requirements for processed data +------------------------------- + +Processed traces must satisfy: + +1. all traces must have the same sampling rate and number of samples +2. all traces common to the same station must have the same startime and endtime + +These conditions help MTUQ achieve faster memory access patterns, more efficient misfit evaluation, and more easily maintainable code. An easy way to ensure that they are satisfied is to simply use `mtuq.ProcessData` for data processing. + + +Plotting waveforms +------------------ + +Of course, to make meaningful comparisons between data and synthetics, processed data must pass basic quality control checks. For example, windowed data must contain actual body wave or surface arrivals from the given event. MTUQ's `waveform plotting `_ functions can sometimes be helpful for these types of checks. + diff --git a/_sources/user_guide/05.rst.txt b/_sources/user_guide/05.rst.txt new file mode 100644 index 000000000..b97ffa983 --- /dev/null +++ b/_sources/user_guide/05.rst.txt @@ -0,0 +1,18 @@ + + +Visualization galleries +======================= + +As illustrated in the `examples `_, MTUQ can be used to carry out grid searches over moment tensors, double couples, and forces. + +The output of `mtuq.grid_search` in each of these cases is a data structure that can be passed directly to visualization functions. Examples are given below. + + +.. toctree:: + :maxdepth: 1 + + 05/gallery_mt + 05/gallery_force + 05/gallery_origin + + diff --git a/_sources/user_guide/05/gallery_force.rst.txt b/_sources/user_guide/05/gallery_force.rst.txt new file mode 100644 index 000000000..1383e0757 --- /dev/null +++ b/_sources/user_guide/05/gallery_force.rst.txt @@ -0,0 +1,94 @@ + + +Plotting force results +---------------------- + +Suppose we are running a force grid search: + +.. code:: + + ds = grid_search(data, greens, misfit, origins, sources) + + +After the above command finishes, the data structure `ds` will contain all the forces and corresponding misfit values. + +For a grid of regulary-spaced forces, `ds` may look something like: + +.. code:: + + >>> print(ds) + + Summary: + grid shape: (200, 25, 25, 1) + grid size: 125000 + mean: 2.984e-09 + std: 1.428e-10 + min: 2.605e-09 + max: 3.339e-09 + + Coordinates: + * F0 (F0) float64 1e+11 1.012e+11 1.023e+11 ... 9.772e+11 9.886e+11 + * phi (phi) float64 7.2 21.6 36.0 50.4 ... 309.6 324.0 338.4 352.8 + * h (h) float64 -0.96 -0.88 -0.8 -0.72 -0.64 ... 0.72 0.8 0.88 0.96 + * origin_idx (origin_idx) int64 0 + + +.. note:: + + Force grids are implemented using parameters `F0, phi, h`, which are related to `r, phi, theta` spherical coordinates (`physics convention `_) by `F0 = r`, `phi = phi`, `h = cos(theta)`. In addition, `F0, phi, h` are related to geographic directions by these `formulas `_. + + +Misfit values +""""""""""""" + +To plot the misfit values returned by the grid search, we can pass `ds` to a plotting utility as follows: + +.. code:: + + from mtuq.graphics import plot_misfit_force + plot_misfit_force(filename, ds) + +.. image:: images/20090407201255351_misfit_force.png + :width: 200 + + +Maximum likelihoods +""""""""""""""""""" + +If a data variance estimate `var` is available, then misfit values can be converted to likelihood values. +In the following approach, a two-dimensional likelihood surface is obtained by maximimizing over magnitude: + +.. code:: + + from mtuq.graphics import plot_likelihood_force + plot_likelihood_force(filename, ds, var) + + +.. image:: images/20090407201255351_likelihood_force.png + :width: 200 + + +Tradeoffs between force orientation and magnitude +""""""""""""""""""""""""""""""""""""""""""""""""" + +To see how the magnitude of the best-fitting force varies with respect to orientation, we can use the following: + +.. code:: + + from mtuq.graphics import plot_magnitude_tradeoffs_force + plot_magnitude_tradeoffs_force(filename, ds) + +.. image:: images/20090407201255351_force_tradeoffs.png + :width: 200 + + + + +Source code +""""""""""" + +[`script to reproduce above figures `_] + +Users can run the script immediately after `installing MTUQ `_, without any additional setup. + + diff --git a/_sources/user_guide/05/gallery_mt.rst.txt b/_sources/user_guide/05/gallery_mt.rst.txt new file mode 100644 index 000000000..ff9880e58 --- /dev/null +++ b/_sources/user_guide/05/gallery_mt.rst.txt @@ -0,0 +1,129 @@ + + +Plotting moment tensor results +------------------------------ + +Suppose we are running a moment tensor grid search: + +.. code:: + + ds = grid_search(data, greens, misfit, origins, sources) + + +After the above command finishes, the data structure `ds` will hold all the moment tensors and corresponding misfit values. + +For a grid of regulary-spaced moment tensors, `ds` may look something like: + +.. code:: + + >>> print(ds) + + Summary: + grid shape: (10, 10, 20, 10, 10, 10, 1) + grid size: 2000000 + mean: 2.548e-09 + std: 2.851e-10 + min: 1.328e-09 + max: 3.640e-09 + + Coordinates: + * rho (rho) float64 5.018e+15 5.418e+15 ... 9.272e+15 1.001e+16 + * v (v) float64 -0.3313 -0.2995 -0.2371 ... 0.2371 0.2995 0.3313 + * w (w) float64 -1.178 -1.176 -1.167 -1.141 ... 1.167 1.176 1.178 + * kappa (kappa) float64 18.0 54.0 90.0 126.0 ... 234.0 270.0 306.0 342.0 + * sigma (sigma) float64 -81.0 -63.0 -45.0 -27.0 ... 27.0 45.0 63.0 81.0 + * h (h) float64 0.05 0.15 0.25 0.35 0.45 0.55 0.65 0.75 0.85 0.95 + * origin_idx (origin_idx) int64 0 + + + +.. note:: + + Moment tensor grids are implemented using the `rho, v, w, kappa, sigma, h` parameterization of `Tape2012 `_ and `Tape2015 `_, from which `formulas `_ converting to parameterizations can be derived. + + + +Misfit values +""""""""""""" + +To plot the misfit values returned by the grid search, we can pass `ds` to a plotting utility as follows: + +.. code:: + + from mtuq.graphics import plot_misfit_lune + plot_misfit_lune(filename, ds) + +.. image:: images/20090407201255351_misfit_lune.png + :width: 100 + + + +Maximum likelihoods +""""""""""""""""""" + +If a data variance estimate `var` is available, then misfit values can be converted to likelihood values. +In the following approach, a two-dimensional maximum likelihood surface is obtained by maximimizing over orientiation and magnitude parameters: + +.. code:: + + from mtuq.graphics import plot_likelihood_lune + plot_likelihood_lune(filename, ds, var) + +.. image:: images/20090407201255351_likelihood_lune.png + :width: 100 + + +Marginal likelihoods +"""""""""""""""""""" + +An alternative for visualizing likelihood is integrate over orientiation and magnitude parameters, giving a two-dimensional marginal distribution. In this case, it is natural to use the so-called v,w parameterization, as follows: + +.. code:: + + from mtuq.graphics import plot_marginal_vw + plot_marginal_vw(filename, ds, var) + +.. image:: images/20090407201255351_marginal_vw.png + :width: 100 + + + +Tradeoffs between source type and orientation +""""""""""""""""""""""""""""""""""""""""""""" + +To see how the orientation of the best-fitting moment tensor varies with respect to source type, we can add the `show_tradeoffs=True` option to any of the plotting utilities as follows: + +.. code:: + + from mtuq.graphics import plot_misfit_lune + plot_misfit_lune(filename, ds, show_tradeoffs=True) + + +.. image:: images/20090407201255351_mt_tradeoffs.png + :width: 100 + + + +Tradeoffs between source type and magnitude +""""""""""""""""""""""""""""""""""""""""""" + +To see how the magnitude of the best-fitting moment tensor varies with respect to source type, we can use the following: + +.. code:: + + from mtuq.graphics import plot_magnitude_tradeoffs_lune + plot_magnitude_tradeoffs_lune(filename, ds) + +.. image:: images/20090407201255351_Mw_tradeoffs.png + :width: 100 + + + + +Source code +""""""""""" + +[`script to reproduce above figures `_] + +Users can run the script immediately after `installing MTUQ `_, without any additional setup. + diff --git a/_sources/user_guide/05/gallery_origin.rst.txt b/_sources/user_guide/05/gallery_origin.rst.txt new file mode 100644 index 000000000..5fc5d76f2 --- /dev/null +++ b/_sources/user_guide/05/gallery_origin.rst.txt @@ -0,0 +1,99 @@ + + +Plotting depth and hypocenter results +------------------------------------- + +Suppose we are running a grid search over both `origins` and moment tensor `sources`: + +.. code:: + + ds = grid_search(data, greens, misfit, origins, sources) + + +After the above command finishes, the data structure `ds` will contain all the moment tensors and corresponding misfit values. + + +Plotting misfit versus depth +"""""""""""""""""""""""""""" + +If `origins` represents different depths, we can plot the results as follows: + + +.. code:: + + from mtuq.graphics import plot_misfit_depth + plot_misfit_depth(filename, ds, origins) + + +.. image:: images/20090407201255351_misfit_depth.png + :width: 200 + + + +Tradeoffs with depth +"""""""""""""""""""" + +To display tradeoffs with depth, we can add the following keyword arguments: + +.. code:: + + plot_misfit_depth(filename, ds, origins, show_tradeoffs=True, show_magnitudes=True) + + +.. image:: images/20090407201255351_misfit_depth_tradeoffs.png + :width: 200 + + + +Plotting misfit versus hypocenter +""""""""""""""""""""""""""""""""" + +.. warning:: + + 1D Green's functions are used for the hypocenter grid search example. + + (3D Green's functions would provide more meaningful results, but are too large for remote hosting.) + + + +If `origins` represents different hypocenters, we can plot the results as follows: + +.. code:: + + from mtuq.graphics import plot_misfit_latlon + plot_misfit_latlon(filename, ds, origins) + + +.. image:: images/20090407201255351_misfit_latlon.png + :width: 200 + + + +Tradeoffs with hypocenter +""""""""""""""""""""""""" + +.. warning:: + + 1D Green's functions are used for the hypocenter grid search example. + + (3D Green's functions would provide more meaningful results, but are too large for remote hosting.) + + + +To see how orientation trade offs with hypocenter, we can add the following keyword argument: + +.. code:: + + plot_misfit_latlon(filename, ds, origins, show_tradeoffs=True) + + +.. image:: images/20090407201255351_misfit_latlon_tradeoffs.png + :width: 200 + + + +Source code +""""""""""" + +The above figures can be reproduced by running `GridSearch.DoubleCouple+Magnitude+Depth.py `_ and `GridSearch.DoubleCouple+Magnitude+Hypocenter.py `_. + diff --git a/_sources/user_guide/06.rst.txt b/_sources/user_guide/06.rst.txt new file mode 100644 index 000000000..82b22a517 --- /dev/null +++ b/_sources/user_guide/06.rst.txt @@ -0,0 +1,24 @@ + + +Additional topics +================= + +Data structures + +.. toctree:: + :maxdepth: 1 + + 06/grid_structures + 06/moment_tensor_and_force_grids + 06/reading_writing_results + 06/trace_attributes + + +Visualization + +.. toctree:: + :maxdepth: 1 + + 06/plotting_trace_attributes + 06/customizing_figures + diff --git a/_sources/user_guide/06/custom_backends.rst.txt b/_sources/user_guide/06/custom_backends.rst.txt new file mode 100644 index 000000000..a9738cf70 --- /dev/null +++ b/_sources/user_guide/06/custom_backends.rst.txt @@ -0,0 +1,83 @@ + +Custom backends +=============== + +Custom backends can be used to modify the appearance of many MTUQ plotting functions. + +If a plotting function has a `backend` keyword argument, then feel free to pass it a custom backend function. + + +Example +------- + +The backend function below can be passed to `plot_time_shifts `_, `plot_amplitude_ratios `_, `plot_log_amplitude_ratios `_, and `_plot_attrs `_. + +Note that the backend function contains hardcoded settings that improve the appearance `Silwal2016 `_ figures, but lack generality for default MTUQ plotting. + + +.. code:: + + def custom_backend(filename, values, stations, origin, + zero_centered=True, label='Time shift (s)'): + + import pygmt + + fig = pygmt.Figure() + + gmt_region = "g-155/-145/59/64" + gmt_projection = "D-150/61.5/60/63/9c" + gmt_frame = ["xa5", "ya2"] + + fig.basemap( + region=gmt_region, + projection=gmt_projection, + frame=gmt_frame, + ) + + fig.coast( + land="grey80", + shorelines=True, + area_thresh=100, + ) + + # construct color palette + cmap = "polar" + + if zero_centered: + limits = (-np.max(np.abs(values)), +np.max(np.abs(values))) + else: + limits = (np.min(values), np.max(values)) + + pygmt.makecpt( + cmap=cmap, + series=limits, + ) + + # plot stations + for _i, station in enumerate(stations): + fig.plot( + x=station.longitude, y=station.latitude, + cmap=True, color="+z", zvalue=values[_i], + style="t.5c", pen="1p", + ) + + # plot line segments + for _i, station in enumerate(stations): + fig.plot( + x=(origin.longitude, station.longitude), + y=(origin.latitude, station.latitude), + cmap=True, zvalue=values[_i], + pen="thick,+z,-" + ) + + # plot origin + fig.plot( + x=origin.longitude, y=origin.latitude, + style="a.5c", color="black", pen="1p" + ) + + # add colorbar + fig.colorbar(frame=["x+l%s" % label]) + + fig.savefig(filename) + diff --git a/_sources/user_guide/06/customizing_figures.rst.txt b/_sources/user_guide/06/customizing_figures.rst.txt new file mode 100644 index 000000000..f6b7b7f54 --- /dev/null +++ b/_sources/user_guide/06/customizing_figures.rst.txt @@ -0,0 +1,50 @@ + +Customizing figures +=================== + +MTUQ plotting functions aim for generality and ease of use. Sometimes, this results in a default figure that is a bit generic. + +Fortunately, figure appearance is highly customizable, as illustrated below. + + +Time shift and amplitude ratio figures +--------------------------------------- + +To plot how time shifts, amplitude ratios, or other `trace attributes `_ vary geographically, we can pass the output of the misfit function's `collect_attributes `_ method to a plotting function as follows: + +.. code:: + + plot_time_shifts(dirname, attrs, stations, origin) + + +Because we haven't specified a map projection or other details, it's no surprise that the resulting figure is quite generic: + +.. image:: images/20090407201255351_attrs_time_shifts_bw_Z.png + :width: 400 + + +To some extent, the above figure can be customized through optional input arguments to the default backend function. For argument descriptions, follow the links in the `plot_time_shifts `_ documentation, or see the `default backend `_ page directly. + +In comparison, a more powerful approach is to overload the backend function completely: + +.. code:: + + plot_time_shifts(dirname, attrs, stations, origin, backend=custom_backend) + +To illustrate, we have implemented a `custom backend `_ relevant to `Silwal2016 `_. The result of calling `plot_time_shifts` with this new backend is: + + +.. image:: images/20090407201255351_attrs_time_shifts_bw_Z_pygmt.png + :width: 400 + + +.. note:: + + Frontend functions perform only data manipulation. All calls to graphics libraries (matplotlib, GMT, PyGMT and so on) occur in the backends, making even the choice of graphics library customizable. + + +Misfit and likelihood figures +----------------------------- + +`Misfit and likelihood figures `_ for force, moment tensor, depth and hypocenter can also be customized by user-supplied backends. + diff --git a/_sources/user_guide/06/grid_structures.rst.txt b/_sources/user_guide/06/grid_structures.rst.txt new file mode 100644 index 000000000..e7454a5e9 --- /dev/null +++ b/_sources/user_guide/06/grid_structures.rst.txt @@ -0,0 +1,40 @@ + +Grid search data structures +=========================== + +During a grid search + +.. code:: + + ds = grid_search(data, greens, misfit, origins, sources) + + +the misfit function is evaluated over all `origins` and `sources`. + +The result is a data strucutre `ds` containing both misfit values and grid points. + + +Input data structures +--------------------- + +The `origins` data structure + +- Is simply a list of `Origin` objects +- Allows for searching over depth, latitude, longitude and/or origin time, as specified by the attributes of the `Origin` objects in the list + +The `sources` data structure + +- Can be either a regularly-spaced `Grid` or an irregularly-spaced `UnstructuredGrid` +- Allows for searching over any subset of moment tensor space or force space, including these currently-implemented `moment tensor grids `_ and `force grids `_ + + +Output data structures +---------------------- + +If `sources` is regularly spaced, the output `ds` will be a subclass of `xarray DataArray `_. + +If `sources` is irregularly spaced, the output `ds` will be a subclass of `pandas DataFrame `_. + +See also `reading and writing grid search results `_. + + diff --git a/_sources/user_guide/06/moment_tensor_and_force_grids.rst.txt b/_sources/user_guide/06/moment_tensor_and_force_grids.rst.txt new file mode 100644 index 000000000..6a28dd967 --- /dev/null +++ b/_sources/user_guide/06/moment_tensor_and_force_grids.rst.txt @@ -0,0 +1,56 @@ + +Moment tensor and force grids +============================= + + +Currently implemented moment tensor grids +----------------------------------------- + +- `Randomly-drawn full moment tensors `_ +- `Regularly-spaced full moment tensors `_ +- `Randomly-drawn double couples `_ +- `Regularly-spaced double couples `_ +- `Randomly-drawn deviatoric moment tensors `_ +- `Regularly-spaced deviatoric moment tensors `_ + + +Currently implemented force grids +--------------------------------- + +- `Randomly-drawn forces `_ +- `Regularly-spaced forces `_ + + + +Using moment tensor grids +------------------------- + +Moment tensor grids created in the above manner can be iterated over like a NumPy array or list, or individual grid points can be accessed by the following methods: + +- Use ``get(i)`` to return the `i`-th moment tensor as a `MomentTensor` object +- Use ``get(i).as_vector()`` to return the `i`-th moment tensor as a NumPy array `(Mrr, Mtt, Mpp, Mrp, Mrt, Mtp)` +- Use ``get_dict(i)`` to return the `i`-th moment tensor as dictionary of Tape2015 parameters `rho, v, w, kappa, sigma, h` + + +Using force grids +----------------- + +Force grids created in the above manner can be iterated over like a NumPy array or list, or individual grid points can be accessed by the following methods: + +- Use ``get(i)`` to return the `i`-th force as a `Force` object +- Use ``get(i).as_vector()`` to return the `i`-th force as a NumPy array `(Fr, Ft, Fp)` +- Use ``get_dict(i)`` to return the `i`-th force as dictionary of parameters `F0, phi, h` + + +More details +------------ + +For additional usage information, see `Grid `_ for regularly-spaced grids or `UnstructuredGrid `_ for randomly-drawn grids. + +Moment tensor grids are implemented using the `rho, v, w, kappa, sigma, h` parameterization from `Tape2015 `_. + +Force grids are implemented using parameters `F0, phi, h`, which are related to `r, phi, theta` spherical coordinates (physics convention) by `F0 = r`, `phi = phi`, `h = cos(theta)`. In addition, `F0, phi, h` are related to geographic directions by these `formulas `_. + +Random moment tensors are drawn from the uniform distributions described by `Tape2015 `_. + + diff --git a/_sources/user_guide/06/plotting_trace_attributes.rst.txt b/_sources/user_guide/06/plotting_trace_attributes.rst.txt new file mode 100644 index 000000000..ccd214ace --- /dev/null +++ b/_sources/user_guide/06/plotting_trace_attributes.rst.txt @@ -0,0 +1,68 @@ + +Plotting trace attributes +========================= + + +To calculate time shifts, amplitude ratios and other `trace attributes `_, the misfit functions's `collect_attributes` method can be invoked using the same arguments as an ordinary misfit function evaluation: + +.. code:: + + attrs = misfit.collect_attributes(data, greens, source) + + +Plotting time shifts +-------------------- + +Following `Zhao1994 `_, moment tensor inversions commonly use time shifts to mitigate velocity model inaccuracy. To understand such effects, it can be helpful to plot how time shifts vary geographically and by component. + + +To plot time shifts, the `attrs` data structure above can be passed directly to a plotting function: + +.. code:: + + from mtuq.graphics import plot_time_shifts + plot_time_shifts(dirname, attrs, stations, origin, components=['Z','R','T']) + +As a result, an image like the following will be created for each component: + +.. image:: images/20090407201255351_attrs_time_shifts_bw_Z.png + :width: 400 + + +Plotting amplitude ratios +------------------------- + +Similarly, the `attrs` data structure can be used to plot amplitude ratios: + +.. code:: + + from mtuq.graphics import plot_amplitude_ratios + plot_amplitude_ratios(dirname, attrs, stations, origin, components=['Z','R','T']) + +As a result, an image like the following will be created for each component: + +.. image:: images/20090407201255351_attrs_amplitude_ratios_bw_Z.png + :width: 400 + + +Plotting custom attributes +-------------------------- + +It is possible to add `custom attributes `_ to the data structure returned by `collect_attributes`. + +To plot how a custom attribute varies, we can use the private function `_plot_attrs`: + +.. code:: + + from mtuq.graphics import _plot_attrs + _plot_attrs(dirname, stations, origin, attrs, 'custom_attr', components=['Z','R','T']) + + +(In fact, `_plot_attr` is used under the hood by `plot_time_shifts`, `plot_amplitude_ratios`, and `plot_log_amplitude_ratios`.) + + +Source code +----------- + +The above figures can be reproduced by running `DetailedAnalysis.py `_. + diff --git a/_sources/user_guide/06/reading_writing_results.rst.txt b/_sources/user_guide/06/reading_writing_results.rst.txt new file mode 100644 index 000000000..6c635cab7 --- /dev/null +++ b/_sources/user_guide/06/reading_writing_results.rst.txt @@ -0,0 +1,88 @@ + +Reading and writing grid search results +======================================= + +A grid search + +.. code:: + + ds = grid_search(data, greens, misfit, origins, sources) + +returns a data structure `ds` that contains both misfit values and grid points. + +To write this data structure to disk: + +.. code:: + + ds.save(filename) + +Depending on whether the grid points are regularly- or irregularly-spaced, a NetCDF or HDF5 file will be written. Subsequently, this file can be read back in using `open_ds`, which tries to automatically determine file format: + +.. code:: + + from mtuq import open_ds + ds = open_ds(filename) + +Alternatively, users can specify file type through the `format` keyword argument, as in the examples below. + + + +Details on regularly-spaced grids +--------------------------------- + +A search over reguarly-spaced `sources` + +.. code:: + + da = grid_search(data, greens, misfit, origins, sources) + +returns an xarray DataArray `da`. + +To write the grid search output `da` to disk as a NetCDF file: + +.. code:: + + da.save('output.nc') + + +To read the NetCDF file back from disk: + +.. code:: + + from mtuq import open_ds + da = open_ds('output.nc', format='NetCDF') + + +Before or after writing to disk, `da` can be passed to visualization utilities or manipulated using `xarray methods `_. + + + +Details on irregularly-spaced grids +----------------------------------- + +A search over irregularly-spaced `sources` + +.. code:: + + df = grid_search(data, greens, misfit, origins, sources) + +returns a pandas DataFrame `df`. + +To write the grid search output `df` to disk as an HDF5 file: + +.. code:: + + df.save('output.hf5') + + +To read the HDF5 file back from disk: + +.. code:: + + from mtuq import open_ds + df = open_ds('output.hf5', format='HDF5') + + +Before or after writing to disk, `df` can be passed to visualization utilities or manipulated using `pandas methods `_. + + diff --git a/_sources/user_guide/06/trace_attributes.rst.txt b/_sources/user_guide/06/trace_attributes.rst.txt new file mode 100644 index 000000000..5e267d2f9 --- /dev/null +++ b/_sources/user_guide/06/trace_attributes.rst.txt @@ -0,0 +1,50 @@ + +Trace attributes +================ + +Waveform differences, time-shift corrections, and other values are calculated during an inversion on a trace-by-trace basis. Such `trace attributes` provide important information about how data misfit varies by geographic location and seismic component. + + +Collecting trace attributes +--------------------------- + +Suppose we have the following misfit function: + +.. code:: + + misfit = Misfit(norm='L2', time_shift_min=-10.,time_shift_max=+10.) + + +To get a data structure containing trace attributes, we can invoke the misfit function's `collect_attributes` method using the same input arguments as we would for an ordinary misfit function evaluation: + +.. code:: + + attrs = misfit.collect_attributes(data, greens, source) + + +The `attrs` data structure above consists of a list of `AttribDict `_ objects organized by station and component. + + +Attaching trace attributes to `Datasets` +---------------------------------------- + +We can also attach trace attributes to the observed data directly by invoking the misfit function as follows: + +.. code:: + + misfit(data, greens, source, set_attributes=True) + + +During misfit evaluation, an `AttribDict` will be attached to each trace in `data`. + +.. note:: + + With `set_attribtues=True`, it only makes sense to pass a single `source` to the misfit function (because if multiple sources are passed, attributes from all but the last source end up getting overwritten). + + +Custom trace attributes +----------------------- + +Users can add additional trace attributes by modifying `mtuq/misfit/waveform/level0.py `_. Any changes made here carry over to both the `collect_attributes` and `set_attributes` methods above. + + diff --git a/_static/basic.css b/_static/basic.css new file mode 100644 index 000000000..bf18350b6 --- /dev/null +++ b/_static/basic.css @@ -0,0 +1,906 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 450px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a.brackets:before, +span.brackets > a:before{ + content: "["; +} + +a.brackets:after, +span.brackets > a:after { + content: "]"; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +table.footnote td, table.footnote th { + border: 0 !important; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +dl.footnote > dt, +dl.citation > dt { + float: left; + margin-right: 0.5em; +} + +dl.footnote > dd, +dl.citation > dd { + margin-bottom: 0em; +} + +dl.footnote > dd:after, +dl.citation > dd:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dt:after { + content: ":"; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/_static/bootstrap-2.3.2/css/bootstrap-responsive.css b/_static/bootstrap-2.3.2/css/bootstrap-responsive.css new file mode 100644 index 000000000..09e88ce3f --- /dev/null +++ b/_static/bootstrap-2.3.2/css/bootstrap-responsive.css @@ -0,0 +1,1109 @@ +/*! + * Bootstrap Responsive v2.3.2 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ + +.clearfix { + *zoom: 1; +} + +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +.clearfix:after { + clear: both; +} + +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} + +.hidden { + display: none; + visibility: hidden; +} + +.visible-phone { + display: none !important; +} + +.visible-tablet { + display: none !important; +} + +.hidden-desktop { + display: none !important; +} + +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + .hidden-desktop { + display: inherit !important; + } + .visible-desktop { + display: none !important ; + } + .visible-tablet { + display: inherit !important; + } + .hidden-tablet { + display: none !important; + } +} + +@media (max-width: 767px) { + .hidden-desktop { + display: inherit !important; + } + .visible-desktop { + display: none !important; + } + .visible-phone { + display: inherit !important; + } + .hidden-phone { + display: none !important; + } +} + +.visible-print { + display: none !important; +} + +@media print { + .visible-print { + display: inherit !important; + } + .hidden-print { + display: none !important; + } +} + +@media (min-width: 1200px) { + .row { + margin-left: -30px; + *zoom: 1; + } + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + .row:after { + clear: both; + } + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 30px; + } + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 1170px; + } + .span12 { + width: 1170px; + } + .span11 { + width: 1070px; + } + .span10 { + width: 970px; + } + .span9 { + width: 870px; + } + .span8 { + width: 770px; + } + .span7 { + width: 670px; + } + .span6 { + width: 570px; + } + .span5 { + width: 470px; + } + .span4 { + width: 370px; + } + .span3 { + width: 270px; + } + .span2 { + width: 170px; + } + .span1 { + width: 70px; + } + .offset12 { + margin-left: 1230px; + } + .offset11 { + margin-left: 1130px; + } + .offset10 { + margin-left: 1030px; + } + .offset9 { + margin-left: 930px; + } + .offset8 { + margin-left: 830px; + } + .offset7 { + margin-left: 730px; + } + .offset6 { + margin-left: 630px; + } + .offset5 { + margin-left: 530px; + } + .offset4 { + margin-left: 430px; + } + .offset3 { + margin-left: 330px; + } + .offset2 { + margin-left: 230px; + } + .offset1 { + margin-left: 130px; + } + .row-fluid { + width: 100%; + *zoom: 1; + } + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + .row-fluid:after { + clear: both; + } + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.564102564102564%; + *margin-left: 2.5109110747408616%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.564102564102564%; + } + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + .row-fluid .span11 { + width: 91.45299145299145%; + *width: 91.39979996362975%; + } + .row-fluid .span10 { + width: 82.90598290598291%; + *width: 82.8527914166212%; + } + .row-fluid .span9 { + width: 74.35897435897436%; + *width: 74.30578286961266%; + } + .row-fluid .span8 { + width: 65.81196581196582%; + *width: 65.75877432260411%; + } + .row-fluid .span7 { + width: 57.26495726495726%; + *width: 57.21176577559556%; + } + .row-fluid .span6 { + width: 48.717948717948715%; + *width: 48.664757228587014%; + } + .row-fluid .span5 { + width: 40.17094017094017%; + *width: 40.11774868157847%; + } + .row-fluid .span4 { + width: 31.623931623931625%; + *width: 31.570740134569924%; + } + .row-fluid .span3 { + width: 23.076923076923077%; + *width: 23.023731587561375%; + } + .row-fluid .span2 { + width: 14.52991452991453%; + *width: 14.476723040552828%; + } + .row-fluid .span1 { + width: 5.982905982905983%; + *width: 5.929714493544281%; + } + .row-fluid .offset12 { + margin-left: 105.12820512820512%; + *margin-left: 105.02182214948171%; + } + .row-fluid .offset12:first-child { + margin-left: 102.56410256410257%; + *margin-left: 102.45771958537915%; + } + .row-fluid .offset11 { + margin-left: 96.58119658119658%; + *margin-left: 96.47481360247316%; + } + .row-fluid .offset11:first-child { + margin-left: 94.01709401709402%; + *margin-left: 93.91071103837061%; + } + .row-fluid .offset10 { + margin-left: 88.03418803418803%; + *margin-left: 87.92780505546462%; + } + .row-fluid .offset10:first-child { + margin-left: 85.47008547008548%; + *margin-left: 85.36370249136206%; + } + .row-fluid .offset9 { + margin-left: 79.48717948717949%; + *margin-left: 79.38079650845607%; + } + .row-fluid .offset9:first-child { + margin-left: 76.92307692307693%; + *margin-left: 76.81669394435352%; + } + .row-fluid .offset8 { + margin-left: 70.94017094017094%; + *margin-left: 70.83378796144753%; + } + .row-fluid .offset8:first-child { + margin-left: 68.37606837606839%; + *margin-left: 68.26968539734497%; + } + .row-fluid .offset7 { + margin-left: 62.393162393162385%; + *margin-left: 62.28677941443899%; + } + .row-fluid .offset7:first-child { + margin-left: 59.82905982905982%; + *margin-left: 59.72267685033642%; + } + .row-fluid .offset6 { + margin-left: 53.84615384615384%; + *margin-left: 53.739770867430444%; + } + .row-fluid .offset6:first-child { + margin-left: 51.28205128205128%; + *margin-left: 51.175668303327875%; + } + .row-fluid .offset5 { + margin-left: 45.299145299145295%; + *margin-left: 45.1927623204219%; + } + .row-fluid .offset5:first-child { + margin-left: 42.73504273504273%; + *margin-left: 42.62865975631933%; + } + .row-fluid .offset4 { + margin-left: 36.75213675213675%; + *margin-left: 36.645753773413354%; + } + .row-fluid .offset4:first-child { + margin-left: 34.18803418803419%; + *margin-left: 34.081651209310785%; + } + .row-fluid .offset3 { + margin-left: 28.205128205128204%; + *margin-left: 28.0987452264048%; + } + .row-fluid .offset3:first-child { + margin-left: 25.641025641025642%; + *margin-left: 25.53464266230224%; + } + .row-fluid .offset2 { + margin-left: 19.65811965811966%; + *margin-left: 19.551736679396257%; + } + .row-fluid .offset2:first-child { + margin-left: 17.094017094017094%; + *margin-left: 16.98763411529369%; + } + .row-fluid .offset1 { + margin-left: 11.11111111111111%; + *margin-left: 11.004728132387708%; + } + .row-fluid .offset1:first-child { + margin-left: 8.547008547008547%; + *margin-left: 8.440625568285142%; + } + input, + textarea, + .uneditable-input { + margin-left: 0; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 30px; + } + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 1156px; + } + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 1056px; + } + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 956px; + } + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 856px; + } + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 756px; + } + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 656px; + } + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 556px; + } + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 456px; + } + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 356px; + } + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 256px; + } + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 156px; + } + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 56px; + } + .thumbnails { + margin-left: -30px; + } + .thumbnails > li { + margin-left: 30px; + } + .row-fluid .thumbnails { + margin-left: 0; + } +} + +@media (min-width: 768px) and (max-width: 979px) { + .row { + margin-left: -20px; + *zoom: 1; + } + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + .row:after { + clear: both; + } + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + .span12 { + width: 724px; + } + .span11 { + width: 662px; + } + .span10 { + width: 600px; + } + .span9 { + width: 538px; + } + .span8 { + width: 476px; + } + .span7 { + width: 414px; + } + .span6 { + width: 352px; + } + .span5 { + width: 290px; + } + .span4 { + width: 228px; + } + .span3 { + width: 166px; + } + .span2 { + width: 104px; + } + .span1 { + width: 42px; + } + .offset12 { + margin-left: 764px; + } + .offset11 { + margin-left: 702px; + } + .offset10 { + margin-left: 640px; + } + .offset9 { + margin-left: 578px; + } + .offset8 { + margin-left: 516px; + } + .offset7 { + margin-left: 454px; + } + .offset6 { + margin-left: 392px; + } + .offset5 { + margin-left: 330px; + } + .offset4 { + margin-left: 268px; + } + .offset3 { + margin-left: 206px; + } + .offset2 { + margin-left: 144px; + } + .offset1 { + margin-left: 82px; + } + .row-fluid { + width: 100%; + *zoom: 1; + } + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + .row-fluid:after { + clear: both; + } + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + input, + textarea, + .uneditable-input { + margin-left: 0; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} + +@media (max-width: 767px) { + body { + padding-right: 20px; + padding-left: 20px; + } + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + .container-fluid { + padding: 0; + } + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + .dl-horizontal dd { + margin-left: 0; + } + .container { + width: auto; + } + .row-fluid { + width: 100%; + } + .row, + .thumbnails { + margin-left: 0; + } + .thumbnails > li { + float: none; + margin-left: 0; + } + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + .modal.fade { + top: -100px; + } + .modal.fade.in { + top: 20px; + } +} + +@media (max-width: 480px) { + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + .page-header h1 small { + display: block; + line-height: 20px; + } + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + .form-horizontal .controls { + margin-left: 0; + } + .form-horizontal .control-list { + padding-top: 0; + } + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + .media-object { + margin-right: 0; + margin-left: 0; + } + .modal { + top: 10px; + right: 10px; + left: 10px; + } + .modal-header .close { + padding: 10px; + margin: -10px; + } + .carousel-caption { + position: static; + } +} + +@media (max-width: 979px) { + body { + padding-top: 0; + } + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + .navbar-fixed-top { + margin-bottom: 20px; + } + .navbar-fixed-bottom { + margin-top: 20px; + } + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + .navbar .container { + width: auto; + padding: 0; + } + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + .nav-collapse { + clear: both; + } + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + .nav-collapse .nav > li { + float: none; + } + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + .nav-collapse .nav > .divider-vertical { + display: none; + } + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + .nav-collapse .open > .dropdown-menu { + display: block; + } + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + .nav-collapse .dropdown-menu .divider { + display: none; + } + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + .navbar .btn-navbar { + display: block; + } + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} + +@media (min-width: 980px) { + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} diff --git a/_static/bootstrap-2.3.2/css/bootstrap-responsive.min.css b/_static/bootstrap-2.3.2/css/bootstrap-responsive.min.css new file mode 100644 index 000000000..f4ede63f3 --- /dev/null +++ b/_static/bootstrap-2.3.2/css/bootstrap-responsive.min.css @@ -0,0 +1,9 @@ +/*! + * Bootstrap Responsive v2.3.2 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}@-ms-viewport{width:device-width}.hidden{display:none;visibility:hidden}.visible-phone{display:none!important}.visible-tablet{display:none!important}.hidden-desktop{display:none!important}.visible-desktop{display:inherit!important}@media(min-width:768px) and (max-width:979px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-tablet{display:inherit!important}.hidden-tablet{display:none!important}}@media(max-width:767px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-phone{display:inherit!important}.hidden-phone{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:inherit!important}.hidden-print{display:none!important}}@media(min-width:1200px){.row{margin-left:-30px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:30px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px}.span12{width:1170px}.span11{width:1070px}.span10{width:970px}.span9{width:870px}.span8{width:770px}.span7{width:670px}.span6{width:570px}.span5{width:470px}.span4{width:370px}.span3{width:270px}.span2{width:170px}.span1{width:70px}.offset12{margin-left:1230px}.offset11{margin-left:1130px}.offset10{margin-left:1030px}.offset9{margin-left:930px}.offset8{margin-left:830px}.offset7{margin-left:730px}.offset6{margin-left:630px}.offset5{margin-left:530px}.offset4{margin-left:430px}.offset3{margin-left:330px}.offset2{margin-left:230px}.offset1{margin-left:130px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.564102564102564%;*margin-left:2.5109110747408616%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.564102564102564%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.45299145299145%;*width:91.39979996362975%}.row-fluid .span10{width:82.90598290598291%;*width:82.8527914166212%}.row-fluid .span9{width:74.35897435897436%;*width:74.30578286961266%}.row-fluid .span8{width:65.81196581196582%;*width:65.75877432260411%}.row-fluid .span7{width:57.26495726495726%;*width:57.21176577559556%}.row-fluid .span6{width:48.717948717948715%;*width:48.664757228587014%}.row-fluid .span5{width:40.17094017094017%;*width:40.11774868157847%}.row-fluid .span4{width:31.623931623931625%;*width:31.570740134569924%}.row-fluid .span3{width:23.076923076923077%;*width:23.023731587561375%}.row-fluid .span2{width:14.52991452991453%;*width:14.476723040552828%}.row-fluid .span1{width:5.982905982905983%;*width:5.929714493544281%}.row-fluid .offset12{margin-left:105.12820512820512%;*margin-left:105.02182214948171%}.row-fluid .offset12:first-child{margin-left:102.56410256410257%;*margin-left:102.45771958537915%}.row-fluid .offset11{margin-left:96.58119658119658%;*margin-left:96.47481360247316%}.row-fluid .offset11:first-child{margin-left:94.01709401709402%;*margin-left:93.91071103837061%}.row-fluid .offset10{margin-left:88.03418803418803%;*margin-left:87.92780505546462%}.row-fluid .offset10:first-child{margin-left:85.47008547008548%;*margin-left:85.36370249136206%}.row-fluid .offset9{margin-left:79.48717948717949%;*margin-left:79.38079650845607%}.row-fluid .offset9:first-child{margin-left:76.92307692307693%;*margin-left:76.81669394435352%}.row-fluid .offset8{margin-left:70.94017094017094%;*margin-left:70.83378796144753%}.row-fluid .offset8:first-child{margin-left:68.37606837606839%;*margin-left:68.26968539734497%}.row-fluid .offset7{margin-left:62.393162393162385%;*margin-left:62.28677941443899%}.row-fluid .offset7:first-child{margin-left:59.82905982905982%;*margin-left:59.72267685033642%}.row-fluid .offset6{margin-left:53.84615384615384%;*margin-left:53.739770867430444%}.row-fluid .offset6:first-child{margin-left:51.28205128205128%;*margin-left:51.175668303327875%}.row-fluid .offset5{margin-left:45.299145299145295%;*margin-left:45.1927623204219%}.row-fluid .offset5:first-child{margin-left:42.73504273504273%;*margin-left:42.62865975631933%}.row-fluid .offset4{margin-left:36.75213675213675%;*margin-left:36.645753773413354%}.row-fluid .offset4:first-child{margin-left:34.18803418803419%;*margin-left:34.081651209310785%}.row-fluid .offset3{margin-left:28.205128205128204%;*margin-left:28.0987452264048%}.row-fluid .offset3:first-child{margin-left:25.641025641025642%;*margin-left:25.53464266230224%}.row-fluid .offset2{margin-left:19.65811965811966%;*margin-left:19.551736679396257%}.row-fluid .offset2:first-child{margin-left:17.094017094017094%;*margin-left:16.98763411529369%}.row-fluid .offset1{margin-left:11.11111111111111%;*margin-left:11.004728132387708%}.row-fluid .offset1:first-child{margin-left:8.547008547008547%;*margin-left:8.440625568285142%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:30px}input.span12,textarea.span12,.uneditable-input.span12{width:1156px}input.span11,textarea.span11,.uneditable-input.span11{width:1056px}input.span10,textarea.span10,.uneditable-input.span10{width:956px}input.span9,textarea.span9,.uneditable-input.span9{width:856px}input.span8,textarea.span8,.uneditable-input.span8{width:756px}input.span7,textarea.span7,.uneditable-input.span7{width:656px}input.span6,textarea.span6,.uneditable-input.span6{width:556px}input.span5,textarea.span5,.uneditable-input.span5{width:456px}input.span4,textarea.span4,.uneditable-input.span4{width:356px}input.span3,textarea.span3,.uneditable-input.span3{width:256px}input.span2,textarea.span2,.uneditable-input.span2{width:156px}input.span1,textarea.span1,.uneditable-input.span1{width:56px}.thumbnails{margin-left:-30px}.thumbnails>li{margin-left:30px}.row-fluid .thumbnails{margin-left:0}}@media(min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px}.span12{width:724px}.span11{width:662px}.span10{width:600px}.span9{width:538px}.span8{width:476px}.span7{width:414px}.span6{width:352px}.span5{width:290px}.span4{width:228px}.span3{width:166px}.span2{width:104px}.span1{width:42px}.offset12{margin-left:764px}.offset11{margin-left:702px}.offset10{margin-left:640px}.offset9{margin-left:578px}.offset8{margin-left:516px}.offset7{margin-left:454px}.offset6{margin-left:392px}.offset5{margin-left:330px}.offset4{margin-left:268px}.offset3{margin-left:206px}.offset2{margin-left:144px}.offset1{margin-left:82px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.7624309392265194%;*margin-left:2.709239449864817%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.7624309392265194%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.43646408839778%;*width:91.38327259903608%}.row-fluid .span10{width:82.87292817679558%;*width:82.81973668743387%}.row-fluid .span9{width:74.30939226519337%;*width:74.25620077583166%}.row-fluid .span8{width:65.74585635359117%;*width:65.69266486422946%}.row-fluid .span7{width:57.18232044198895%;*width:57.12912895262725%}.row-fluid .span6{width:48.61878453038674%;*width:48.56559304102504%}.row-fluid .span5{width:40.05524861878453%;*width:40.00205712942283%}.row-fluid .span4{width:31.491712707182323%;*width:31.43852121782062%}.row-fluid .span3{width:22.92817679558011%;*width:22.87498530621841%}.row-fluid .span2{width:14.3646408839779%;*width:14.311449394616199%}.row-fluid .span1{width:5.801104972375691%;*width:5.747913483013988%}.row-fluid .offset12{margin-left:105.52486187845304%;*margin-left:105.41847889972962%}.row-fluid .offset12:first-child{margin-left:102.76243093922652%;*margin-left:102.6560479605031%}.row-fluid .offset11{margin-left:96.96132596685082%;*margin-left:96.8549429881274%}.row-fluid .offset11:first-child{margin-left:94.1988950276243%;*margin-left:94.09251204890089%}.row-fluid .offset10{margin-left:88.39779005524862%;*margin-left:88.2914070765252%}.row-fluid .offset10:first-child{margin-left:85.6353591160221%;*margin-left:85.52897613729868%}.row-fluid .offset9{margin-left:79.8342541436464%;*margin-left:79.72787116492299%}.row-fluid .offset9:first-child{margin-left:77.07182320441989%;*margin-left:76.96544022569647%}.row-fluid .offset8{margin-left:71.2707182320442%;*margin-left:71.16433525332079%}.row-fluid .offset8:first-child{margin-left:68.50828729281768%;*margin-left:68.40190431409427%}.row-fluid .offset7{margin-left:62.70718232044199%;*margin-left:62.600799341718584%}.row-fluid .offset7:first-child{margin-left:59.94475138121547%;*margin-left:59.838368402492065%}.row-fluid .offset6{margin-left:54.14364640883978%;*margin-left:54.037263430116376%}.row-fluid .offset6:first-child{margin-left:51.38121546961326%;*margin-left:51.27483249088986%}.row-fluid .offset5{margin-left:45.58011049723757%;*margin-left:45.47372751851417%}.row-fluid .offset5:first-child{margin-left:42.81767955801105%;*margin-left:42.71129657928765%}.row-fluid .offset4{margin-left:37.01657458563536%;*margin-left:36.91019160691196%}.row-fluid .offset4:first-child{margin-left:34.25414364640884%;*margin-left:34.14776066768544%}.row-fluid .offset3{margin-left:28.45303867403315%;*margin-left:28.346655695309746%}.row-fluid .offset3:first-child{margin-left:25.69060773480663%;*margin-left:25.584224756083227%}.row-fluid .offset2{margin-left:19.88950276243094%;*margin-left:19.783119783707537%}.row-fluid .offset2:first-child{margin-left:17.12707182320442%;*margin-left:17.02068884448102%}.row-fluid .offset1{margin-left:11.32596685082873%;*margin-left:11.219583872105325%}.row-fluid .offset1:first-child{margin-left:8.56353591160221%;*margin-left:8.457152932878806%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:710px}input.span11,textarea.span11,.uneditable-input.span11{width:648px}input.span10,textarea.span10,.uneditable-input.span10{width:586px}input.span9,textarea.span9,.uneditable-input.span9{width:524px}input.span8,textarea.span8,.uneditable-input.span8{width:462px}input.span7,textarea.span7,.uneditable-input.span7{width:400px}input.span6,textarea.span6,.uneditable-input.span6{width:338px}input.span5,textarea.span5,.uneditable-input.span5{width:276px}input.span4,textarea.span4,.uneditable-input.span4{width:214px}input.span3,textarea.span3,.uneditable-input.span3{width:152px}input.span2,textarea.span2,.uneditable-input.span2{width:90px}input.span1,textarea.span1,.uneditable-input.span1{width:28px}}@media(max-width:767px){body{padding-right:20px;padding-left:20px}.navbar-fixed-top,.navbar-fixed-bottom,.navbar-static-top{margin-right:-20px;margin-left:-20px}.container-fluid{padding:0}.dl-horizontal dt{float:none;width:auto;clear:none;text-align:left}.dl-horizontal dd{margin-left:0}.container{width:auto}.row-fluid{width:100%}.row,.thumbnails{margin-left:0}.thumbnails>li{float:none;margin-left:0}[class*="span"],.uneditable-input[class*="span"],.row-fluid [class*="span"]{display:block;float:none;width:100%;margin-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.span12,.row-fluid .span12{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="offset"]:first-child{margin-left:0}.input-large,.input-xlarge,.input-xxlarge,input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.input-prepend input,.input-append input,.input-prepend input[class*="span"],.input-append input[class*="span"]{display:inline-block;width:auto}.controls-row [class*="span"]+[class*="span"]{margin-left:0}.modal{position:fixed;top:20px;right:20px;left:20px;width:auto;margin:0}.modal.fade{top:-100px}.modal.fade.in{top:20px}}@media(max-width:480px){.nav-collapse{-webkit-transform:translate3d(0,0,0)}.page-header h1 small{display:block;line-height:20px}input[type="checkbox"],input[type="radio"]{border:1px solid #ccc}.form-horizontal .control-label{float:none;width:auto;padding-top:0;text-align:left}.form-horizontal .controls{margin-left:0}.form-horizontal .control-list{padding-top:0}.form-horizontal .form-actions{padding-right:10px;padding-left:10px}.media .pull-left,.media .pull-right{display:block;float:none;margin-bottom:10px}.media-object{margin-right:0;margin-left:0}.modal{top:10px;right:10px;left:10px}.modal-header .close{padding:10px;margin:-10px}.carousel-caption{position:static}}@media(max-width:979px){body{padding-top:0}.navbar-fixed-top,.navbar-fixed-bottom{position:static}.navbar-fixed-top{margin-bottom:20px}.navbar-fixed-bottom{margin-top:20px}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding:5px}.navbar .container{width:auto;padding:0}.navbar .brand{padding-right:10px;padding-left:10px;margin:0 0 0 -5px}.nav-collapse{clear:both}.nav-collapse .nav{float:none;margin:0 0 10px}.nav-collapse .nav>li{float:none}.nav-collapse .nav>li>a{margin-bottom:2px}.nav-collapse .nav>.divider-vertical{display:none}.nav-collapse .nav .nav-header{color:#777;text-shadow:none}.nav-collapse .nav>li>a,.nav-collapse .dropdown-menu a{padding:9px 15px;font-weight:bold;color:#777;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.nav-collapse .btn{padding:4px 10px 4px;font-weight:normal;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.nav-collapse .dropdown-menu li+li a{margin-bottom:2px}.nav-collapse .nav>li>a:hover,.nav-collapse .nav>li>a:focus,.nav-collapse .dropdown-menu a:hover,.nav-collapse .dropdown-menu a:focus{background-color:#f2f2f2}.navbar-inverse .nav-collapse .nav>li>a,.navbar-inverse .nav-collapse .dropdown-menu a{color:#999}.navbar-inverse .nav-collapse .nav>li>a:hover,.navbar-inverse .nav-collapse .nav>li>a:focus,.navbar-inverse .nav-collapse .dropdown-menu a:hover,.navbar-inverse .nav-collapse .dropdown-menu a:focus{background-color:#111}.nav-collapse.in .btn-group{padding:0;margin-top:5px}.nav-collapse .dropdown-menu{position:static;top:auto;left:auto;display:none;float:none;max-width:none;padding:0;margin:0 15px;background-color:transparent;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.nav-collapse .open>.dropdown-menu{display:block}.nav-collapse .dropdown-menu:before,.nav-collapse .dropdown-menu:after{display:none}.nav-collapse .dropdown-menu .divider{display:none}.nav-collapse .nav>li>.dropdown-menu:before,.nav-collapse .nav>li>.dropdown-menu:after{display:none}.nav-collapse .navbar-form,.nav-collapse .navbar-search{float:none;padding:10px 15px;margin:10px 0;border-top:1px solid #f2f2f2;border-bottom:1px solid #f2f2f2;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}.navbar-inverse .nav-collapse .navbar-form,.navbar-inverse .nav-collapse .navbar-search{border-top-color:#111;border-bottom-color:#111}.navbar .nav-collapse .nav.pull-right{float:none;margin-left:0}.nav-collapse,.nav-collapse.collapse{height:0;overflow:hidden}.navbar .btn-navbar{display:block}.navbar-static .navbar-inner{padding-right:10px;padding-left:10px}}@media(min-width:980px){.nav-collapse.collapse{height:auto!important;overflow:visible!important}} diff --git a/_static/bootstrap-2.3.2/css/bootstrap.css b/_static/bootstrap-2.3.2/css/bootstrap.css new file mode 100644 index 000000000..b725064aa --- /dev/null +++ b/_static/bootstrap-2.3.2/css/bootstrap.css @@ -0,0 +1,6167 @@ +/*! + * Bootstrap v2.3.2 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ + +.clearfix { + *zoom: 1; +} + +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +.clearfix:after { + clear: both; +} + +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +nav, +section { + display: block; +} + +audio, +canvas, +video { + display: inline-block; + *display: inline; + *zoom: 1; +} + +audio:not([controls]) { + display: none; +} + +html { + font-size: 100%; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} + +a:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +a:hover, +a:active { + outline: 0; +} + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +img { + width: auto\9; + height: auto; + max-width: 100%; + vertical-align: middle; + border: 0; + -ms-interpolation-mode: bicubic; +} + +#map_canvas img, +.google-maps img { + max-width: none; +} + +button, +input, +select, +textarea { + margin: 0; + font-size: 100%; + vertical-align: middle; +} + +button, +input { + *overflow: visible; + line-height: normal; +} + +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} + +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + cursor: pointer; + -webkit-appearance: button; +} + +label, +select, +button, +input[type="button"], +input[type="reset"], +input[type="submit"], +input[type="radio"], +input[type="checkbox"] { + cursor: pointer; +} + +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} + +input[type="search"]::-webkit-search-decoration, +input[type="search"]::-webkit-search-cancel-button { + -webkit-appearance: none; +} + +textarea { + overflow: auto; + vertical-align: top; +} + +@media print { + * { + color: #000 !important; + text-shadow: none !important; + background: transparent !important; + box-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + .ir a:after, + a[href^="javascript:"]:after, + a[href^="#"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + @page { + margin: 0.5cm; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } +} + +body { + margin: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 20px; + color: #333333; + background-color: #ffffff; +} + +a { + color: #0088cc; + text-decoration: none; +} + +a:hover, +a:focus { + color: #005580; + text-decoration: underline; +} + +.img-rounded { + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.img-polaroid { + padding: 4px; + background-color: #fff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +.img-circle { + -webkit-border-radius: 500px; + -moz-border-radius: 500px; + border-radius: 500px; +} + +.row { + margin-left: -20px; + *zoom: 1; +} + +.row:before, +.row:after { + display: table; + line-height: 0; + content: ""; +} + +.row:after { + clear: both; +} + +[class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; +} + +.container, +.navbar-static-top .container, +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} + +.span12 { + width: 940px; +} + +.span11 { + width: 860px; +} + +.span10 { + width: 780px; +} + +.span9 { + width: 700px; +} + +.span8 { + width: 620px; +} + +.span7 { + width: 540px; +} + +.span6 { + width: 460px; +} + +.span5 { + width: 380px; +} + +.span4 { + width: 300px; +} + +.span3 { + width: 220px; +} + +.span2 { + width: 140px; +} + +.span1 { + width: 60px; +} + +.offset12 { + margin-left: 980px; +} + +.offset11 { + margin-left: 900px; +} + +.offset10 { + margin-left: 820px; +} + +.offset9 { + margin-left: 740px; +} + +.offset8 { + margin-left: 660px; +} + +.offset7 { + margin-left: 580px; +} + +.offset6 { + margin-left: 500px; +} + +.offset5 { + margin-left: 420px; +} + +.offset4 { + margin-left: 340px; +} + +.offset3 { + margin-left: 260px; +} + +.offset2 { + margin-left: 180px; +} + +.offset1 { + margin-left: 100px; +} + +.row-fluid { + width: 100%; + *zoom: 1; +} + +.row-fluid:before, +.row-fluid:after { + display: table; + line-height: 0; + content: ""; +} + +.row-fluid:after { + clear: both; +} + +.row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.127659574468085%; + *margin-left: 2.074468085106383%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.row-fluid [class*="span"]:first-child { + margin-left: 0; +} + +.row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.127659574468085%; +} + +.row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; +} + +.row-fluid .span11 { + width: 91.48936170212765%; + *width: 91.43617021276594%; +} + +.row-fluid .span10 { + width: 82.97872340425532%; + *width: 82.92553191489361%; +} + +.row-fluid .span9 { + width: 74.46808510638297%; + *width: 74.41489361702126%; +} + +.row-fluid .span8 { + width: 65.95744680851064%; + *width: 65.90425531914893%; +} + +.row-fluid .span7 { + width: 57.44680851063829%; + *width: 57.39361702127659%; +} + +.row-fluid .span6 { + width: 48.93617021276595%; + *width: 48.88297872340425%; +} + +.row-fluid .span5 { + width: 40.42553191489362%; + *width: 40.37234042553192%; +} + +.row-fluid .span4 { + width: 31.914893617021278%; + *width: 31.861702127659576%; +} + +.row-fluid .span3 { + width: 23.404255319148934%; + *width: 23.351063829787233%; +} + +.row-fluid .span2 { + width: 14.893617021276595%; + *width: 14.840425531914894%; +} + +.row-fluid .span1 { + width: 6.382978723404255%; + *width: 6.329787234042553%; +} + +.row-fluid .offset12 { + margin-left: 104.25531914893617%; + *margin-left: 104.14893617021275%; +} + +.row-fluid .offset12:first-child { + margin-left: 102.12765957446808%; + *margin-left: 102.02127659574467%; +} + +.row-fluid .offset11 { + margin-left: 95.74468085106382%; + *margin-left: 95.6382978723404%; +} + +.row-fluid .offset11:first-child { + margin-left: 93.61702127659574%; + *margin-left: 93.51063829787232%; +} + +.row-fluid .offset10 { + margin-left: 87.23404255319149%; + *margin-left: 87.12765957446807%; +} + +.row-fluid .offset10:first-child { + margin-left: 85.1063829787234%; + *margin-left: 84.99999999999999%; +} + +.row-fluid .offset9 { + margin-left: 78.72340425531914%; + *margin-left: 78.61702127659572%; +} + +.row-fluid .offset9:first-child { + margin-left: 76.59574468085106%; + *margin-left: 76.48936170212764%; +} + +.row-fluid .offset8 { + margin-left: 70.2127659574468%; + *margin-left: 70.10638297872339%; +} + +.row-fluid .offset8:first-child { + margin-left: 68.08510638297872%; + *margin-left: 67.9787234042553%; +} + +.row-fluid .offset7 { + margin-left: 61.70212765957446%; + *margin-left: 61.59574468085106%; +} + +.row-fluid .offset7:first-child { + margin-left: 59.574468085106375%; + *margin-left: 59.46808510638297%; +} + +.row-fluid .offset6 { + margin-left: 53.191489361702125%; + *margin-left: 53.085106382978715%; +} + +.row-fluid .offset6:first-child { + margin-left: 51.063829787234035%; + *margin-left: 50.95744680851063%; +} + +.row-fluid .offset5 { + margin-left: 44.68085106382979%; + *margin-left: 44.57446808510638%; +} + +.row-fluid .offset5:first-child { + margin-left: 42.5531914893617%; + *margin-left: 42.4468085106383%; +} + +.row-fluid .offset4 { + margin-left: 36.170212765957444%; + *margin-left: 36.06382978723405%; +} + +.row-fluid .offset4:first-child { + margin-left: 34.04255319148936%; + *margin-left: 33.93617021276596%; +} + +.row-fluid .offset3 { + margin-left: 27.659574468085104%; + *margin-left: 27.5531914893617%; +} + +.row-fluid .offset3:first-child { + margin-left: 25.53191489361702%; + *margin-left: 25.425531914893618%; +} + +.row-fluid .offset2 { + margin-left: 19.148936170212764%; + *margin-left: 19.04255319148936%; +} + +.row-fluid .offset2:first-child { + margin-left: 17.02127659574468%; + *margin-left: 16.914893617021278%; +} + +.row-fluid .offset1 { + margin-left: 10.638297872340425%; + *margin-left: 10.53191489361702%; +} + +.row-fluid .offset1:first-child { + margin-left: 8.51063829787234%; + *margin-left: 8.404255319148938%; +} + +[class*="span"].hide, +.row-fluid [class*="span"].hide { + display: none; +} + +[class*="span"].pull-right, +.row-fluid [class*="span"].pull-right { + float: right; +} + +.container { + margin-right: auto; + margin-left: auto; + *zoom: 1; +} + +.container:before, +.container:after { + display: table; + line-height: 0; + content: ""; +} + +.container:after { + clear: both; +} + +.container-fluid { + padding-right: 20px; + padding-left: 20px; + *zoom: 1; +} + +.container-fluid:before, +.container-fluid:after { + display: table; + line-height: 0; + content: ""; +} + +.container-fluid:after { + clear: both; +} + +p { + margin: 0 0 10px; +} + +.lead { + margin-bottom: 20px; + font-size: 21px; + font-weight: 200; + line-height: 30px; +} + +small { + font-size: 85%; +} + +strong { + font-weight: bold; +} + +em { + font-style: italic; +} + +cite { + font-style: normal; +} + +.muted { + color: #999999; +} + +a.muted:hover, +a.muted:focus { + color: #808080; +} + +.text-warning { + color: #c09853; +} + +a.text-warning:hover, +a.text-warning:focus { + color: #a47e3c; +} + +.text-error { + color: #b94a48; +} + +a.text-error:hover, +a.text-error:focus { + color: #953b39; +} + +.text-info { + color: #3a87ad; +} + +a.text-info:hover, +a.text-info:focus { + color: #2d6987; +} + +.text-success { + color: #468847; +} + +a.text-success:hover, +a.text-success:focus { + color: #356635; +} + +.text-left { + text-align: left; +} + +.text-right { + text-align: right; +} + +.text-center { + text-align: center; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 10px 0; + font-family: inherit; + font-weight: bold; + line-height: 20px; + color: inherit; + text-rendering: optimizelegibility; +} + +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small { + font-weight: normal; + line-height: 1; + color: #999999; +} + +h1, +h2, +h3 { + line-height: 40px; +} + +h1 { + font-size: 38.5px; +} + +h2 { + font-size: 31.5px; +} + +h3 { + font-size: 24.5px; +} + +h4 { + font-size: 17.5px; +} + +h5 { + font-size: 14px; +} + +h6 { + font-size: 11.9px; +} + +h1 small { + font-size: 24.5px; +} + +h2 small { + font-size: 17.5px; +} + +h3 small { + font-size: 14px; +} + +h4 small { + font-size: 14px; +} + +.page-header { + padding-bottom: 9px; + margin: 20px 0 30px; + border-bottom: 1px solid #eeeeee; +} + +ul, +ol { + padding: 0; + margin: 0 0 10px 25px; +} + +ul ul, +ul ol, +ol ol, +ol ul { + margin-bottom: 0; +} + +li { + line-height: 20px; +} + +ul.unstyled, +ol.unstyled { + margin-left: 0; + list-style: none; +} + +ul.inline, +ol.inline { + margin-left: 0; + list-style: none; +} + +ul.inline > li, +ol.inline > li { + display: inline-block; + *display: inline; + padding-right: 5px; + padding-left: 5px; + *zoom: 1; +} + +dl { + margin-bottom: 20px; +} + +dt, +dd { + line-height: 20px; +} + +dt { + font-weight: bold; +} + +dd { + margin-left: 10px; +} + +.dl-horizontal { + *zoom: 1; +} + +.dl-horizontal:before, +.dl-horizontal:after { + display: table; + line-height: 0; + content: ""; +} + +.dl-horizontal:after { + clear: both; +} + +.dl-horizontal dt { + float: left; + width: 160px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; +} + +.dl-horizontal dd { + margin-left: 180px; +} + +hr { + margin: 20px 0; + border: 0; + border-top: 1px solid #eeeeee; + border-bottom: 1px solid #ffffff; +} + +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #999999; +} + +abbr.initialism { + font-size: 90%; + text-transform: uppercase; +} + +blockquote { + padding: 0 0 0 15px; + margin: 0 0 20px; + border-left: 5px solid #eeeeee; +} + +blockquote p { + margin-bottom: 0; + font-size: 17.5px; + font-weight: 300; + line-height: 1.25; +} + +blockquote small { + display: block; + line-height: 20px; + color: #999999; +} + +blockquote small:before { + content: '\2014 \00A0'; +} + +blockquote.pull-right { + float: right; + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #eeeeee; + border-left: 0; +} + +blockquote.pull-right p, +blockquote.pull-right small { + text-align: right; +} + +blockquote.pull-right small:before { + content: ''; +} + +blockquote.pull-right small:after { + content: '\00A0 \2014'; +} + +q:before, +q:after, +blockquote:before, +blockquote:after { + content: ""; +} + +address { + display: block; + margin-bottom: 20px; + font-style: normal; + line-height: 20px; +} + +code, +pre { + padding: 0 3px 2px; + font-family: Monaco, Menlo, Consolas, "Courier New", monospace; + font-size: 12px; + color: #333333; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +code { + padding: 2px 4px; + color: #d14; + white-space: nowrap; + background-color: #f7f7f9; + border: 1px solid #e1e1e8; +} + +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 20px; + word-break: break-all; + word-wrap: break-word; + white-space: pre; + white-space: pre-wrap; + background-color: #f5f5f5; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.15); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +pre.prettyprint { + margin-bottom: 20px; +} + +pre code { + padding: 0; + color: inherit; + white-space: pre; + white-space: pre-wrap; + background-color: transparent; + border: 0; +} + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} + +form { + margin: 0 0 20px; +} + +fieldset { + padding: 0; + margin: 0; + border: 0; +} + +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: 40px; + color: #333333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} + +legend small { + font-size: 15px; + color: #999999; +} + +label, +input, +button, +select, +textarea { + font-size: 14px; + font-weight: normal; + line-height: 20px; +} + +input, +button, +select, +textarea { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +label { + display: block; + margin-bottom: 5px; +} + +select, +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + display: inline-block; + height: 20px; + padding: 4px 6px; + margin-bottom: 10px; + font-size: 14px; + line-height: 20px; + color: #555555; + vertical-align: middle; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +input, +textarea, +.uneditable-input { + width: 206px; +} + +textarea { + height: auto; +} + +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + background-color: #ffffff; + border: 1px solid #cccccc; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; + -moz-transition: border linear 0.2s, box-shadow linear 0.2s; + -o-transition: border linear 0.2s, box-shadow linear 0.2s; + transition: border linear 0.2s, box-shadow linear 0.2s; +} + +textarea:focus, +input[type="text"]:focus, +input[type="password"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="date"]:focus, +input[type="month"]:focus, +input[type="time"]:focus, +input[type="week"]:focus, +input[type="number"]:focus, +input[type="email"]:focus, +input[type="url"]:focus, +input[type="search"]:focus, +input[type="tel"]:focus, +input[type="color"]:focus, +.uneditable-input:focus { + border-color: rgba(82, 168, 236, 0.8); + outline: 0; + outline: thin dotted \9; + /* IE6-9 */ + + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); +} + +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + *margin-top: 0; + line-height: normal; +} + +input[type="file"], +input[type="image"], +input[type="submit"], +input[type="reset"], +input[type="button"], +input[type="radio"], +input[type="checkbox"] { + width: auto; +} + +select, +input[type="file"] { + height: 30px; + /* In IE7, the height of the select element cannot be changed by height, only font-size */ + + *margin-top: 4px; + /* For IE7, add top margin to align select with labels */ + + line-height: 30px; +} + +select { + width: 220px; + background-color: #ffffff; + border: 1px solid #cccccc; +} + +select[multiple], +select[size] { + height: auto; +} + +select:focus, +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +.uneditable-input, +.uneditable-textarea { + color: #999999; + cursor: not-allowed; + background-color: #fcfcfc; + border-color: #cccccc; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); +} + +.uneditable-input { + overflow: hidden; + white-space: nowrap; +} + +.uneditable-textarea { + width: auto; + height: auto; +} + +input:-moz-placeholder, +textarea:-moz-placeholder { + color: #999999; +} + +input:-ms-input-placeholder, +textarea:-ms-input-placeholder { + color: #999999; +} + +input::-webkit-input-placeholder, +textarea::-webkit-input-placeholder { + color: #999999; +} + +.radio, +.checkbox { + min-height: 20px; + padding-left: 20px; +} + +.radio input[type="radio"], +.checkbox input[type="checkbox"] { + float: left; + margin-left: -20px; +} + +.controls > .radio:first-child, +.controls > .checkbox:first-child { + padding-top: 5px; +} + +.radio.inline, +.checkbox.inline { + display: inline-block; + padding-top: 5px; + margin-bottom: 0; + vertical-align: middle; +} + +.radio.inline + .radio.inline, +.checkbox.inline + .checkbox.inline { + margin-left: 10px; +} + +.input-mini { + width: 60px; +} + +.input-small { + width: 90px; +} + +.input-medium { + width: 150px; +} + +.input-large { + width: 210px; +} + +.input-xlarge { + width: 270px; +} + +.input-xxlarge { + width: 530px; +} + +input[class*="span"], +select[class*="span"], +textarea[class*="span"], +.uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"] { + float: none; + margin-left: 0; +} + +.input-append input[class*="span"], +.input-append .uneditable-input[class*="span"], +.input-prepend input[class*="span"], +.input-prepend .uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"], +.row-fluid .input-prepend [class*="span"], +.row-fluid .input-append [class*="span"] { + display: inline-block; +} + +input, +textarea, +.uneditable-input { + margin-left: 0; +} + +.controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; +} + +input.span12, +textarea.span12, +.uneditable-input.span12 { + width: 926px; +} + +input.span11, +textarea.span11, +.uneditable-input.span11 { + width: 846px; +} + +input.span10, +textarea.span10, +.uneditable-input.span10 { + width: 766px; +} + +input.span9, +textarea.span9, +.uneditable-input.span9 { + width: 686px; +} + +input.span8, +textarea.span8, +.uneditable-input.span8 { + width: 606px; +} + +input.span7, +textarea.span7, +.uneditable-input.span7 { + width: 526px; +} + +input.span6, +textarea.span6, +.uneditable-input.span6 { + width: 446px; +} + +input.span5, +textarea.span5, +.uneditable-input.span5 { + width: 366px; +} + +input.span4, +textarea.span4, +.uneditable-input.span4 { + width: 286px; +} + +input.span3, +textarea.span3, +.uneditable-input.span3 { + width: 206px; +} + +input.span2, +textarea.span2, +.uneditable-input.span2 { + width: 126px; +} + +input.span1, +textarea.span1, +.uneditable-input.span1 { + width: 46px; +} + +.controls-row { + *zoom: 1; +} + +.controls-row:before, +.controls-row:after { + display: table; + line-height: 0; + content: ""; +} + +.controls-row:after { + clear: both; +} + +.controls-row [class*="span"], +.row-fluid .controls-row [class*="span"] { + float: left; +} + +.controls-row .checkbox[class*="span"], +.controls-row .radio[class*="span"] { + padding-top: 5px; +} + +input[disabled], +select[disabled], +textarea[disabled], +input[readonly], +select[readonly], +textarea[readonly] { + cursor: not-allowed; + background-color: #eeeeee; +} + +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"][readonly], +input[type="checkbox"][readonly] { + background-color: transparent; +} + +.control-group.warning .control-label, +.control-group.warning .help-block, +.control-group.warning .help-inline { + color: #c09853; +} + +.control-group.warning .checkbox, +.control-group.warning .radio, +.control-group.warning input, +.control-group.warning select, +.control-group.warning textarea { + color: #c09853; +} + +.control-group.warning input, +.control-group.warning select, +.control-group.warning textarea { + border-color: #c09853; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.warning input:focus, +.control-group.warning select:focus, +.control-group.warning textarea:focus { + border-color: #a47e3c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; +} + +.control-group.warning .input-prepend .add-on, +.control-group.warning .input-append .add-on { + color: #c09853; + background-color: #fcf8e3; + border-color: #c09853; +} + +.control-group.error .control-label, +.control-group.error .help-block, +.control-group.error .help-inline { + color: #b94a48; +} + +.control-group.error .checkbox, +.control-group.error .radio, +.control-group.error input, +.control-group.error select, +.control-group.error textarea { + color: #b94a48; +} + +.control-group.error input, +.control-group.error select, +.control-group.error textarea { + border-color: #b94a48; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.error input:focus, +.control-group.error select:focus, +.control-group.error textarea:focus { + border-color: #953b39; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; +} + +.control-group.error .input-prepend .add-on, +.control-group.error .input-append .add-on { + color: #b94a48; + background-color: #f2dede; + border-color: #b94a48; +} + +.control-group.success .control-label, +.control-group.success .help-block, +.control-group.success .help-inline { + color: #468847; +} + +.control-group.success .checkbox, +.control-group.success .radio, +.control-group.success input, +.control-group.success select, +.control-group.success textarea { + color: #468847; +} + +.control-group.success input, +.control-group.success select, +.control-group.success textarea { + border-color: #468847; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.success input:focus, +.control-group.success select:focus, +.control-group.success textarea:focus { + border-color: #356635; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; +} + +.control-group.success .input-prepend .add-on, +.control-group.success .input-append .add-on { + color: #468847; + background-color: #dff0d8; + border-color: #468847; +} + +.control-group.info .control-label, +.control-group.info .help-block, +.control-group.info .help-inline { + color: #3a87ad; +} + +.control-group.info .checkbox, +.control-group.info .radio, +.control-group.info input, +.control-group.info select, +.control-group.info textarea { + color: #3a87ad; +} + +.control-group.info input, +.control-group.info select, +.control-group.info textarea { + border-color: #3a87ad; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.info input:focus, +.control-group.info select:focus, +.control-group.info textarea:focus { + border-color: #2d6987; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; +} + +.control-group.info .input-prepend .add-on, +.control-group.info .input-append .add-on { + color: #3a87ad; + background-color: #d9edf7; + border-color: #3a87ad; +} + +input:focus:invalid, +textarea:focus:invalid, +select:focus:invalid { + color: #b94a48; + border-color: #ee5f5b; +} + +input:focus:invalid:focus, +textarea:focus:invalid:focus, +select:focus:invalid:focus { + border-color: #e9322d; + -webkit-box-shadow: 0 0 6px #f8b9b7; + -moz-box-shadow: 0 0 6px #f8b9b7; + box-shadow: 0 0 6px #f8b9b7; +} + +.form-actions { + padding: 19px 20px 20px; + margin-top: 20px; + margin-bottom: 20px; + background-color: #f5f5f5; + border-top: 1px solid #e5e5e5; + *zoom: 1; +} + +.form-actions:before, +.form-actions:after { + display: table; + line-height: 0; + content: ""; +} + +.form-actions:after { + clear: both; +} + +.help-block, +.help-inline { + color: #595959; +} + +.help-block { + display: block; + margin-bottom: 10px; +} + +.help-inline { + display: inline-block; + *display: inline; + padding-left: 5px; + vertical-align: middle; + *zoom: 1; +} + +.input-append, +.input-prepend { + display: inline-block; + margin-bottom: 10px; + font-size: 0; + white-space: nowrap; + vertical-align: middle; +} + +.input-append input, +.input-prepend input, +.input-append select, +.input-prepend select, +.input-append .uneditable-input, +.input-prepend .uneditable-input, +.input-append .dropdown-menu, +.input-prepend .dropdown-menu, +.input-append .popover, +.input-prepend .popover { + font-size: 14px; +} + +.input-append input, +.input-prepend input, +.input-append select, +.input-prepend select, +.input-append .uneditable-input, +.input-prepend .uneditable-input { + position: relative; + margin-bottom: 0; + *margin-left: 0; + vertical-align: top; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-append input:focus, +.input-prepend input:focus, +.input-append select:focus, +.input-prepend select:focus, +.input-append .uneditable-input:focus, +.input-prepend .uneditable-input:focus { + z-index: 2; +} + +.input-append .add-on, +.input-prepend .add-on { + display: inline-block; + width: auto; + height: 20px; + min-width: 16px; + padding: 4px 5px; + font-size: 14px; + font-weight: normal; + line-height: 20px; + text-align: center; + text-shadow: 0 1px 0 #ffffff; + background-color: #eeeeee; + border: 1px solid #ccc; +} + +.input-append .add-on, +.input-prepend .add-on, +.input-append .btn, +.input-prepend .btn, +.input-append .btn-group > .dropdown-toggle, +.input-prepend .btn-group > .dropdown-toggle { + vertical-align: top; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.input-append .active, +.input-prepend .active { + background-color: #a9dba9; + border-color: #46a546; +} + +.input-prepend .add-on, +.input-prepend .btn { + margin-right: -1px; +} + +.input-prepend .add-on:first-child, +.input-prepend .btn:first-child { + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.input-append input, +.input-append select, +.input-append .uneditable-input { + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.input-append input + .btn-group .btn:last-child, +.input-append select + .btn-group .btn:last-child, +.input-append .uneditable-input + .btn-group .btn:last-child { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-append .add-on, +.input-append .btn, +.input-append .btn-group { + margin-left: -1px; +} + +.input-append .add-on:last-child, +.input-append .btn:last-child, +.input-append .btn-group:last-child > .dropdown-toggle { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-prepend.input-append input, +.input-prepend.input-append select, +.input-prepend.input-append .uneditable-input { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.input-prepend.input-append input + .btn-group .btn, +.input-prepend.input-append select + .btn-group .btn, +.input-prepend.input-append .uneditable-input + .btn-group .btn { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-prepend.input-append .add-on:first-child, +.input-prepend.input-append .btn:first-child { + margin-right: -1px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.input-prepend.input-append .add-on:last-child, +.input-prepend.input-append .btn:last-child { + margin-left: -1px; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-prepend.input-append .btn-group:first-child { + margin-left: 0; +} + +input.search-query { + padding-right: 14px; + padding-right: 4px \9; + padding-left: 14px; + padding-left: 4px \9; + /* IE7-8 doesn't have border-radius, so don't indent the padding */ + + margin-bottom: 0; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +/* Allow for input prepend/append in search forms */ + +.form-search .input-append .search-query, +.form-search .input-prepend .search-query { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.form-search .input-append .search-query { + -webkit-border-radius: 14px 0 0 14px; + -moz-border-radius: 14px 0 0 14px; + border-radius: 14px 0 0 14px; +} + +.form-search .input-append .btn { + -webkit-border-radius: 0 14px 14px 0; + -moz-border-radius: 0 14px 14px 0; + border-radius: 0 14px 14px 0; +} + +.form-search .input-prepend .search-query { + -webkit-border-radius: 0 14px 14px 0; + -moz-border-radius: 0 14px 14px 0; + border-radius: 0 14px 14px 0; +} + +.form-search .input-prepend .btn { + -webkit-border-radius: 14px 0 0 14px; + -moz-border-radius: 14px 0 0 14px; + border-radius: 14px 0 0 14px; +} + +.form-search input, +.form-inline input, +.form-horizontal input, +.form-search textarea, +.form-inline textarea, +.form-horizontal textarea, +.form-search select, +.form-inline select, +.form-horizontal select, +.form-search .help-inline, +.form-inline .help-inline, +.form-horizontal .help-inline, +.form-search .uneditable-input, +.form-inline .uneditable-input, +.form-horizontal .uneditable-input, +.form-search .input-prepend, +.form-inline .input-prepend, +.form-horizontal .input-prepend, +.form-search .input-append, +.form-inline .input-append, +.form-horizontal .input-append { + display: inline-block; + *display: inline; + margin-bottom: 0; + vertical-align: middle; + *zoom: 1; +} + +.form-search .hide, +.form-inline .hide, +.form-horizontal .hide { + display: none; +} + +.form-search label, +.form-inline label, +.form-search .btn-group, +.form-inline .btn-group { + display: inline-block; +} + +.form-search .input-append, +.form-inline .input-append, +.form-search .input-prepend, +.form-inline .input-prepend { + margin-bottom: 0; +} + +.form-search .radio, +.form-search .checkbox, +.form-inline .radio, +.form-inline .checkbox { + padding-left: 0; + margin-bottom: 0; + vertical-align: middle; +} + +.form-search .radio input[type="radio"], +.form-search .checkbox input[type="checkbox"], +.form-inline .radio input[type="radio"], +.form-inline .checkbox input[type="checkbox"] { + float: left; + margin-right: 3px; + margin-left: 0; +} + +.control-group { + margin-bottom: 10px; +} + +legend + .control-group { + margin-top: 20px; + -webkit-margin-top-collapse: separate; +} + +.form-horizontal .control-group { + margin-bottom: 20px; + *zoom: 1; +} + +.form-horizontal .control-group:before, +.form-horizontal .control-group:after { + display: table; + line-height: 0; + content: ""; +} + +.form-horizontal .control-group:after { + clear: both; +} + +.form-horizontal .control-label { + float: left; + width: 160px; + padding-top: 5px; + text-align: right; +} + +.form-horizontal .controls { + *display: inline-block; + *padding-left: 20px; + margin-left: 180px; + *margin-left: 0; +} + +.form-horizontal .controls:first-child { + *padding-left: 180px; +} + +.form-horizontal .help-block { + margin-bottom: 0; +} + +.form-horizontal input + .help-block, +.form-horizontal select + .help-block, +.form-horizontal textarea + .help-block, +.form-horizontal .uneditable-input + .help-block, +.form-horizontal .input-prepend + .help-block, +.form-horizontal .input-append + .help-block { + margin-top: 10px; +} + +.form-horizontal .form-actions { + padding-left: 180px; +} + +table { + max-width: 100%; + background-color: transparent; + border-collapse: collapse; + border-spacing: 0; +} + +.table { + width: 100%; + margin-bottom: 20px; +} + +.table th, +.table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #dddddd; +} + +.table th { + font-weight: bold; +} + +.table thead th { + vertical-align: bottom; +} + +.table caption + thead tr:first-child th, +.table caption + thead tr:first-child td, +.table colgroup + thead tr:first-child th, +.table colgroup + thead tr:first-child td, +.table thead:first-child tr:first-child th, +.table thead:first-child tr:first-child td { + border-top: 0; +} + +.table tbody + tbody { + border-top: 2px solid #dddddd; +} + +.table .table { + background-color: #ffffff; +} + +.table-condensed th, +.table-condensed td { + padding: 4px 5px; +} + +.table-bordered { + border: 1px solid #dddddd; + border-collapse: separate; + *border-collapse: collapse; + border-left: 0; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.table-bordered th, +.table-bordered td { + border-left: 1px solid #dddddd; +} + +.table-bordered caption + thead tr:first-child th, +.table-bordered caption + tbody tr:first-child th, +.table-bordered caption + tbody tr:first-child td, +.table-bordered colgroup + thead tr:first-child th, +.table-bordered colgroup + tbody tr:first-child th, +.table-bordered colgroup + tbody tr:first-child td, +.table-bordered thead:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child td { + border-top: 0; +} + +.table-bordered thead:first-child tr:first-child > th:first-child, +.table-bordered tbody:first-child tr:first-child > td:first-child, +.table-bordered tbody:first-child tr:first-child > th:first-child { + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; +} + +.table-bordered thead:first-child tr:first-child > th:last-child, +.table-bordered tbody:first-child tr:first-child > td:last-child, +.table-bordered tbody:first-child tr:first-child > th:last-child { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; +} + +.table-bordered thead:last-child tr:last-child > th:first-child, +.table-bordered tbody:last-child tr:last-child > td:first-child, +.table-bordered tbody:last-child tr:last-child > th:first-child, +.table-bordered tfoot:last-child tr:last-child > td:first-child, +.table-bordered tfoot:last-child tr:last-child > th:first-child { + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; +} + +.table-bordered thead:last-child tr:last-child > th:last-child, +.table-bordered tbody:last-child tr:last-child > td:last-child, +.table-bordered tbody:last-child tr:last-child > th:last-child, +.table-bordered tfoot:last-child tr:last-child > td:last-child, +.table-bordered tfoot:last-child tr:last-child > th:last-child { + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-bottomright: 4px; +} + +.table-bordered tfoot + tbody:last-child tr:last-child td:first-child { + -webkit-border-bottom-left-radius: 0; + border-bottom-left-radius: 0; + -moz-border-radius-bottomleft: 0; +} + +.table-bordered tfoot + tbody:last-child tr:last-child td:last-child { + -webkit-border-bottom-right-radius: 0; + border-bottom-right-radius: 0; + -moz-border-radius-bottomright: 0; +} + +.table-bordered caption + thead tr:first-child th:first-child, +.table-bordered caption + tbody tr:first-child td:first-child, +.table-bordered colgroup + thead tr:first-child th:first-child, +.table-bordered colgroup + tbody tr:first-child td:first-child { + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; +} + +.table-bordered caption + thead tr:first-child th:last-child, +.table-bordered caption + tbody tr:first-child td:last-child, +.table-bordered colgroup + thead tr:first-child th:last-child, +.table-bordered colgroup + tbody tr:first-child td:last-child { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; +} + +.table-striped tbody > tr:nth-child(odd) > td, +.table-striped tbody > tr:nth-child(odd) > th { + background-color: #f9f9f9; +} + +.table-hover tbody tr:hover > td, +.table-hover tbody tr:hover > th { + background-color: #f5f5f5; +} + +table td[class*="span"], +table th[class*="span"], +.row-fluid table td[class*="span"], +.row-fluid table th[class*="span"] { + display: table-cell; + float: none; + margin-left: 0; +} + +.table td.span1, +.table th.span1 { + float: none; + width: 44px; + margin-left: 0; +} + +.table td.span2, +.table th.span2 { + float: none; + width: 124px; + margin-left: 0; +} + +.table td.span3, +.table th.span3 { + float: none; + width: 204px; + margin-left: 0; +} + +.table td.span4, +.table th.span4 { + float: none; + width: 284px; + margin-left: 0; +} + +.table td.span5, +.table th.span5 { + float: none; + width: 364px; + margin-left: 0; +} + +.table td.span6, +.table th.span6 { + float: none; + width: 444px; + margin-left: 0; +} + +.table td.span7, +.table th.span7 { + float: none; + width: 524px; + margin-left: 0; +} + +.table td.span8, +.table th.span8 { + float: none; + width: 604px; + margin-left: 0; +} + +.table td.span9, +.table th.span9 { + float: none; + width: 684px; + margin-left: 0; +} + +.table td.span10, +.table th.span10 { + float: none; + width: 764px; + margin-left: 0; +} + +.table td.span11, +.table th.span11 { + float: none; + width: 844px; + margin-left: 0; +} + +.table td.span12, +.table th.span12 { + float: none; + width: 924px; + margin-left: 0; +} + +.table tbody tr.success > td { + background-color: #dff0d8; +} + +.table tbody tr.error > td { + background-color: #f2dede; +} + +.table tbody tr.warning > td { + background-color: #fcf8e3; +} + +.table tbody tr.info > td { + background-color: #d9edf7; +} + +.table-hover tbody tr.success:hover > td { + background-color: #d0e9c6; +} + +.table-hover tbody tr.error:hover > td { + background-color: #ebcccc; +} + +.table-hover tbody tr.warning:hover > td { + background-color: #faf2cc; +} + +.table-hover tbody tr.info:hover > td { + background-color: #c4e3f3; +} + +[class^="icon-"], +[class*=" icon-"] { + display: inline-block; + width: 14px; + height: 14px; + margin-top: 1px; + *margin-right: .3em; + line-height: 14px; + vertical-align: text-top; + background-image: url("../img/glyphicons-halflings.png"); + background-position: 14px 14px; + background-repeat: no-repeat; +} + +/* White icons with optional class, or on hover/focus/active states of certain elements */ + +.icon-white, +.nav-pills > .active > a > [class^="icon-"], +.nav-pills > .active > a > [class*=" icon-"], +.nav-list > .active > a > [class^="icon-"], +.nav-list > .active > a > [class*=" icon-"], +.navbar-inverse .nav > .active > a > [class^="icon-"], +.navbar-inverse .nav > .active > a > [class*=" icon-"], +.dropdown-menu > li > a:hover > [class^="icon-"], +.dropdown-menu > li > a:focus > [class^="icon-"], +.dropdown-menu > li > a:hover > [class*=" icon-"], +.dropdown-menu > li > a:focus > [class*=" icon-"], +.dropdown-menu > .active > a > [class^="icon-"], +.dropdown-menu > .active > a > [class*=" icon-"], +.dropdown-submenu:hover > a > [class^="icon-"], +.dropdown-submenu:focus > a > [class^="icon-"], +.dropdown-submenu:hover > a > [class*=" icon-"], +.dropdown-submenu:focus > a > [class*=" icon-"] { + background-image: url("../img/glyphicons-halflings-white.png"); +} + +.icon-glass { + background-position: 0 0; +} + +.icon-music { + background-position: -24px 0; +} + +.icon-search { + background-position: -48px 0; +} + +.icon-envelope { + background-position: -72px 0; +} + +.icon-heart { + background-position: -96px 0; +} + +.icon-star { + background-position: -120px 0; +} + +.icon-star-empty { + background-position: -144px 0; +} + +.icon-user { + background-position: -168px 0; +} + +.icon-film { + background-position: -192px 0; +} + +.icon-th-large { + background-position: -216px 0; +} + +.icon-th { + background-position: -240px 0; +} + +.icon-th-list { + background-position: -264px 0; +} + +.icon-ok { + background-position: -288px 0; +} + +.icon-remove { + background-position: -312px 0; +} + +.icon-zoom-in { + background-position: -336px 0; +} + +.icon-zoom-out { + background-position: -360px 0; +} + +.icon-off { + background-position: -384px 0; +} + +.icon-signal { + background-position: -408px 0; +} + +.icon-cog { + background-position: -432px 0; +} + +.icon-trash { + background-position: -456px 0; +} + +.icon-home { + background-position: 0 -24px; +} + +.icon-file { + background-position: -24px -24px; +} + +.icon-time { + background-position: -48px -24px; +} + +.icon-road { + background-position: -72px -24px; +} + +.icon-download-alt { + background-position: -96px -24px; +} + +.icon-download { + background-position: -120px -24px; +} + +.icon-upload { + background-position: -144px -24px; +} + +.icon-inbox { + background-position: -168px -24px; +} + +.icon-play-circle { + background-position: -192px -24px; +} + +.icon-repeat { + background-position: -216px -24px; +} + +.icon-refresh { + background-position: -240px -24px; +} + +.icon-list-alt { + background-position: -264px -24px; +} + +.icon-lock { + background-position: -287px -24px; +} + +.icon-flag { + background-position: -312px -24px; +} + +.icon-headphones { + background-position: -336px -24px; +} + +.icon-volume-off { + background-position: -360px -24px; +} + +.icon-volume-down { + background-position: -384px -24px; +} + +.icon-volume-up { + background-position: -408px -24px; +} + +.icon-qrcode { + background-position: -432px -24px; +} + +.icon-barcode { + background-position: -456px -24px; +} + +.icon-tag { + background-position: 0 -48px; +} + +.icon-tags { + background-position: -25px -48px; +} + +.icon-book { + background-position: -48px -48px; +} + +.icon-bookmark { + background-position: -72px -48px; +} + +.icon-print { + background-position: -96px -48px; +} + +.icon-camera { + background-position: -120px -48px; +} + +.icon-font { + background-position: -144px -48px; +} + +.icon-bold { + background-position: -167px -48px; +} + +.icon-italic { + background-position: -192px -48px; +} + +.icon-text-height { + background-position: -216px -48px; +} + +.icon-text-width { + background-position: -240px -48px; +} + +.icon-align-left { + background-position: -264px -48px; +} + +.icon-align-center { + background-position: -288px -48px; +} + +.icon-align-right { + background-position: -312px -48px; +} + +.icon-align-justify { + background-position: -336px -48px; +} + +.icon-list { + background-position: -360px -48px; +} + +.icon-indent-left { + background-position: -384px -48px; +} + +.icon-indent-right { + background-position: -408px -48px; +} + +.icon-facetime-video { + background-position: -432px -48px; +} + +.icon-picture { + background-position: -456px -48px; +} + +.icon-pencil { + background-position: 0 -72px; +} + +.icon-map-marker { + background-position: -24px -72px; +} + +.icon-adjust { + background-position: -48px -72px; +} + +.icon-tint { + background-position: -72px -72px; +} + +.icon-edit { + background-position: -96px -72px; +} + +.icon-share { + background-position: -120px -72px; +} + +.icon-check { + background-position: -144px -72px; +} + +.icon-move { + background-position: -168px -72px; +} + +.icon-step-backward { + background-position: -192px -72px; +} + +.icon-fast-backward { + background-position: -216px -72px; +} + +.icon-backward { + background-position: -240px -72px; +} + +.icon-play { + background-position: -264px -72px; +} + +.icon-pause { + background-position: -288px -72px; +} + +.icon-stop { + background-position: -312px -72px; +} + +.icon-forward { + background-position: -336px -72px; +} + +.icon-fast-forward { + background-position: -360px -72px; +} + +.icon-step-forward { + background-position: -384px -72px; +} + +.icon-eject { + background-position: -408px -72px; +} + +.icon-chevron-left { + background-position: -432px -72px; +} + +.icon-chevron-right { + background-position: -456px -72px; +} + +.icon-plus-sign { + background-position: 0 -96px; +} + +.icon-minus-sign { + background-position: -24px -96px; +} + +.icon-remove-sign { + background-position: -48px -96px; +} + +.icon-ok-sign { + background-position: -72px -96px; +} + +.icon-question-sign { + background-position: -96px -96px; +} + +.icon-info-sign { + background-position: -120px -96px; +} + +.icon-screenshot { + background-position: -144px -96px; +} + +.icon-remove-circle { + background-position: -168px -96px; +} + +.icon-ok-circle { + background-position: -192px -96px; +} + +.icon-ban-circle { + background-position: -216px -96px; +} + +.icon-arrow-left { + background-position: -240px -96px; +} + +.icon-arrow-right { + background-position: -264px -96px; +} + +.icon-arrow-up { + background-position: -289px -96px; +} + +.icon-arrow-down { + background-position: -312px -96px; +} + +.icon-share-alt { + background-position: -336px -96px; +} + +.icon-resize-full { + background-position: -360px -96px; +} + +.icon-resize-small { + background-position: -384px -96px; +} + +.icon-plus { + background-position: -408px -96px; +} + +.icon-minus { + background-position: -433px -96px; +} + +.icon-asterisk { + background-position: -456px -96px; +} + +.icon-exclamation-sign { + background-position: 0 -120px; +} + +.icon-gift { + background-position: -24px -120px; +} + +.icon-leaf { + background-position: -48px -120px; +} + +.icon-fire { + background-position: -72px -120px; +} + +.icon-eye-open { + background-position: -96px -120px; +} + +.icon-eye-close { + background-position: -120px -120px; +} + +.icon-warning-sign { + background-position: -144px -120px; +} + +.icon-plane { + background-position: -168px -120px; +} + +.icon-calendar { + background-position: -192px -120px; +} + +.icon-random { + width: 16px; + background-position: -216px -120px; +} + +.icon-comment { + background-position: -240px -120px; +} + +.icon-magnet { + background-position: -264px -120px; +} + +.icon-chevron-up { + background-position: -288px -120px; +} + +.icon-chevron-down { + background-position: -313px -119px; +} + +.icon-retweet { + background-position: -336px -120px; +} + +.icon-shopping-cart { + background-position: -360px -120px; +} + +.icon-folder-close { + width: 16px; + background-position: -384px -120px; +} + +.icon-folder-open { + width: 16px; + background-position: -408px -120px; +} + +.icon-resize-vertical { + background-position: -432px -119px; +} + +.icon-resize-horizontal { + background-position: -456px -118px; +} + +.icon-hdd { + background-position: 0 -144px; +} + +.icon-bullhorn { + background-position: -24px -144px; +} + +.icon-bell { + background-position: -48px -144px; +} + +.icon-certificate { + background-position: -72px -144px; +} + +.icon-thumbs-up { + background-position: -96px -144px; +} + +.icon-thumbs-down { + background-position: -120px -144px; +} + +.icon-hand-right { + background-position: -144px -144px; +} + +.icon-hand-left { + background-position: -168px -144px; +} + +.icon-hand-up { + background-position: -192px -144px; +} + +.icon-hand-down { + background-position: -216px -144px; +} + +.icon-circle-arrow-right { + background-position: -240px -144px; +} + +.icon-circle-arrow-left { + background-position: -264px -144px; +} + +.icon-circle-arrow-up { + background-position: -288px -144px; +} + +.icon-circle-arrow-down { + background-position: -312px -144px; +} + +.icon-globe { + background-position: -336px -144px; +} + +.icon-wrench { + background-position: -360px -144px; +} + +.icon-tasks { + background-position: -384px -144px; +} + +.icon-filter { + background-position: -408px -144px; +} + +.icon-briefcase { + background-position: -432px -144px; +} + +.icon-fullscreen { + background-position: -456px -144px; +} + +.dropup, +.dropdown { + position: relative; +} + +.dropdown-toggle { + *margin-bottom: -3px; +} + +.dropdown-toggle:active, +.open .dropdown-toggle { + outline: 0; +} + +.caret { + display: inline-block; + width: 0; + height: 0; + vertical-align: top; + border-top: 4px solid #000000; + border-right: 4px solid transparent; + border-left: 4px solid transparent; + content: ""; +} + +.dropdown .caret { + margin-top: 8px; + margin-left: 2px; +} + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + list-style: none; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + *border-right-width: 2px; + *border-bottom-width: 2px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} + +.dropdown-menu.pull-right { + right: 0; + left: auto; +} + +.dropdown-menu .divider { + *width: 100%; + height: 1px; + margin: 9px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} + +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 20px; + color: #333333; + white-space: nowrap; +} + +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus, +.dropdown-submenu:hover > a, +.dropdown-submenu:focus > a { + color: #ffffff; + text-decoration: none; + background-color: #0081c2; + background-image: -moz-linear-gradient(top, #0088cc, #0077b3); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); + background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); + background-image: -o-linear-gradient(top, #0088cc, #0077b3); + background-image: linear-gradient(to bottom, #0088cc, #0077b3); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); +} + +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #ffffff; + text-decoration: none; + background-color: #0081c2; + background-image: -moz-linear-gradient(top, #0088cc, #0077b3); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); + background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); + background-image: -o-linear-gradient(top, #0088cc, #0077b3); + background-image: linear-gradient(to bottom, #0088cc, #0077b3); + background-repeat: repeat-x; + outline: 0; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); +} + +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #999999; +} + +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + cursor: default; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.open { + *z-index: 1000; +} + +.open > .dropdown-menu { + display: block; +} + +.dropdown-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 990; +} + +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} + +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px solid #000000; + content: ""; +} + +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 1px; +} + +.dropdown-submenu { + position: relative; +} + +.dropdown-submenu > .dropdown-menu { + top: 0; + left: 100%; + margin-top: -6px; + margin-left: -1px; + -webkit-border-radius: 0 6px 6px 6px; + -moz-border-radius: 0 6px 6px 6px; + border-radius: 0 6px 6px 6px; +} + +.dropdown-submenu:hover > .dropdown-menu { + display: block; +} + +.dropup .dropdown-submenu > .dropdown-menu { + top: auto; + bottom: 0; + margin-top: 0; + margin-bottom: -2px; + -webkit-border-radius: 5px 5px 5px 0; + -moz-border-radius: 5px 5px 5px 0; + border-radius: 5px 5px 5px 0; +} + +.dropdown-submenu > a:after { + display: block; + float: right; + width: 0; + height: 0; + margin-top: 5px; + margin-right: -10px; + border-color: transparent; + border-left-color: #cccccc; + border-style: solid; + border-width: 5px 0 5px 5px; + content: " "; +} + +.dropdown-submenu:hover > a:after { + border-left-color: #ffffff; +} + +.dropdown-submenu.pull-left { + float: none; +} + +.dropdown-submenu.pull-left > .dropdown-menu { + left: -100%; + margin-left: 10px; + -webkit-border-radius: 6px 0 6px 6px; + -moz-border-radius: 6px 0 6px 6px; + border-radius: 6px 0 6px 6px; +} + +.dropdown .dropdown-menu .nav-header { + padding-right: 20px; + padding-left: 20px; +} + +.typeahead { + z-index: 1051; + margin-top: 2px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); +} + +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); +} + +.well-large { + padding: 24px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.well-small { + padding: 9px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + -moz-transition: opacity 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} + +.fade.in { + opacity: 1; +} + +.collapse { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition: height 0.35s ease; + -moz-transition: height 0.35s ease; + -o-transition: height 0.35s ease; + transition: height 0.35s ease; +} + +.collapse.in { + height: auto; +} + +.close { + float: right; + font-size: 20px; + font-weight: bold; + line-height: 20px; + color: #000000; + text-shadow: 0 1px 0 #ffffff; + opacity: 0.2; + filter: alpha(opacity=20); +} + +.close:hover, +.close:focus { + color: #000000; + text-decoration: none; + cursor: pointer; + opacity: 0.4; + filter: alpha(opacity=40); +} + +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} + +.btn { + display: inline-block; + *display: inline; + padding: 4px 12px; + margin-bottom: 0; + *margin-left: .3em; + font-size: 14px; + line-height: 20px; + color: #333333; + text-align: center; + text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); + vertical-align: middle; + cursor: pointer; + background-color: #f5f5f5; + *background-color: #e6e6e6; + background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); + background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); + background-image: linear-gradient(to bottom, #ffffff, #e6e6e6); + background-repeat: repeat-x; + border: 1px solid #cccccc; + *border: 0; + border-color: #e6e6e6 #e6e6e6 #bfbfbf; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + border-bottom-color: #b3b3b3; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + *zoom: 1; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn:hover, +.btn:focus, +.btn:active, +.btn.active, +.btn.disabled, +.btn[disabled] { + color: #333333; + background-color: #e6e6e6; + *background-color: #d9d9d9; +} + +.btn:active, +.btn.active { + background-color: #cccccc \9; +} + +.btn:first-child { + *margin-left: 0; +} + +.btn:hover, +.btn:focus { + color: #333333; + text-decoration: none; + background-position: 0 -15px; + -webkit-transition: background-position 0.1s linear; + -moz-transition: background-position 0.1s linear; + -o-transition: background-position 0.1s linear; + transition: background-position 0.1s linear; +} + +.btn:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +.btn.active, +.btn:active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn.disabled, +.btn[disabled] { + cursor: default; + background-image: none; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +.btn-large { + padding: 11px 19px; + font-size: 17.5px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.btn-large [class^="icon-"], +.btn-large [class*=" icon-"] { + margin-top: 4px; +} + +.btn-small { + padding: 2px 10px; + font-size: 11.9px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.btn-small [class^="icon-"], +.btn-small [class*=" icon-"] { + margin-top: 0; +} + +.btn-mini [class^="icon-"], +.btn-mini [class*=" icon-"] { + margin-top: -1px; +} + +.btn-mini { + padding: 0 6px; + font-size: 10.5px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.btn-block { + display: block; + width: 100%; + padding-right: 0; + padding-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.btn-block + .btn-block { + margin-top: 5px; +} + +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} + +.btn-primary.active, +.btn-warning.active, +.btn-danger.active, +.btn-success.active, +.btn-info.active, +.btn-inverse.active { + color: rgba(255, 255, 255, 0.75); +} + +.btn-primary { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #006dcc; + *background-color: #0044cc; + background-image: -moz-linear-gradient(top, #0088cc, #0044cc); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); + background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); + background-image: -o-linear-gradient(top, #0088cc, #0044cc); + background-image: linear-gradient(to bottom, #0088cc, #0044cc); + background-repeat: repeat-x; + border-color: #0044cc #0044cc #002a80; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-primary:hover, +.btn-primary:focus, +.btn-primary:active, +.btn-primary.active, +.btn-primary.disabled, +.btn-primary[disabled] { + color: #ffffff; + background-color: #0044cc; + *background-color: #003bb3; +} + +.btn-primary:active, +.btn-primary.active { + background-color: #003399 \9; +} + +.btn-warning { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #faa732; + *background-color: #f89406; + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(to bottom, #fbb450, #f89406); + background-repeat: repeat-x; + border-color: #f89406 #f89406 #ad6704; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-warning:hover, +.btn-warning:focus, +.btn-warning:active, +.btn-warning.active, +.btn-warning.disabled, +.btn-warning[disabled] { + color: #ffffff; + background-color: #f89406; + *background-color: #df8505; +} + +.btn-warning:active, +.btn-warning.active { + background-color: #c67605 \9; +} + +.btn-danger { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #da4f49; + *background-color: #bd362f; + background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); + background-image: linear-gradient(to bottom, #ee5f5b, #bd362f); + background-repeat: repeat-x; + border-color: #bd362f #bd362f #802420; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-danger:hover, +.btn-danger:focus, +.btn-danger:active, +.btn-danger.active, +.btn-danger.disabled, +.btn-danger[disabled] { + color: #ffffff; + background-color: #bd362f; + *background-color: #a9302a; +} + +.btn-danger:active, +.btn-danger.active { + background-color: #942a25 \9; +} + +.btn-success { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #5bb75b; + *background-color: #51a351; + background-image: -moz-linear-gradient(top, #62c462, #51a351); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); + background-image: -webkit-linear-gradient(top, #62c462, #51a351); + background-image: -o-linear-gradient(top, #62c462, #51a351); + background-image: linear-gradient(to bottom, #62c462, #51a351); + background-repeat: repeat-x; + border-color: #51a351 #51a351 #387038; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-success:hover, +.btn-success:focus, +.btn-success:active, +.btn-success.active, +.btn-success.disabled, +.btn-success[disabled] { + color: #ffffff; + background-color: #51a351; + *background-color: #499249; +} + +.btn-success:active, +.btn-success.active { + background-color: #408140 \9; +} + +.btn-info { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #49afcd; + *background-color: #2f96b4; + background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); + background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); + background-image: linear-gradient(to bottom, #5bc0de, #2f96b4); + background-repeat: repeat-x; + border-color: #2f96b4 #2f96b4 #1f6377; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-info:hover, +.btn-info:focus, +.btn-info:active, +.btn-info.active, +.btn-info.disabled, +.btn-info[disabled] { + color: #ffffff; + background-color: #2f96b4; + *background-color: #2a85a0; +} + +.btn-info:active, +.btn-info.active { + background-color: #24748c \9; +} + +.btn-inverse { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #363636; + *background-color: #222222; + background-image: -moz-linear-gradient(top, #444444, #222222); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222)); + background-image: -webkit-linear-gradient(top, #444444, #222222); + background-image: -o-linear-gradient(top, #444444, #222222); + background-image: linear-gradient(to bottom, #444444, #222222); + background-repeat: repeat-x; + border-color: #222222 #222222 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-inverse:hover, +.btn-inverse:focus, +.btn-inverse:active, +.btn-inverse.active, +.btn-inverse.disabled, +.btn-inverse[disabled] { + color: #ffffff; + background-color: #222222; + *background-color: #151515; +} + +.btn-inverse:active, +.btn-inverse.active { + background-color: #080808 \9; +} + +button.btn, +input[type="submit"].btn { + *padding-top: 3px; + *padding-bottom: 3px; +} + +button.btn::-moz-focus-inner, +input[type="submit"].btn::-moz-focus-inner { + padding: 0; + border: 0; +} + +button.btn.btn-large, +input[type="submit"].btn.btn-large { + *padding-top: 7px; + *padding-bottom: 7px; +} + +button.btn.btn-small, +input[type="submit"].btn.btn-small { + *padding-top: 3px; + *padding-bottom: 3px; +} + +button.btn.btn-mini, +input[type="submit"].btn.btn-mini { + *padding-top: 1px; + *padding-bottom: 1px; +} + +.btn-link, +.btn-link:active, +.btn-link[disabled] { + background-color: transparent; + background-image: none; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +.btn-link { + color: #0088cc; + cursor: pointer; + border-color: transparent; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-link:hover, +.btn-link:focus { + color: #005580; + text-decoration: underline; + background-color: transparent; +} + +.btn-link[disabled]:hover, +.btn-link[disabled]:focus { + color: #333333; + text-decoration: none; +} + +.btn-group { + position: relative; + display: inline-block; + *display: inline; + *margin-left: .3em; + font-size: 0; + white-space: nowrap; + vertical-align: middle; + *zoom: 1; +} + +.btn-group:first-child { + *margin-left: 0; +} + +.btn-group + .btn-group { + margin-left: 5px; +} + +.btn-toolbar { + margin-top: 10px; + margin-bottom: 10px; + font-size: 0; +} + +.btn-toolbar > .btn + .btn, +.btn-toolbar > .btn-group + .btn, +.btn-toolbar > .btn + .btn-group { + margin-left: 5px; +} + +.btn-group > .btn { + position: relative; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-group > .btn + .btn { + margin-left: -1px; +} + +.btn-group > .btn, +.btn-group > .dropdown-menu, +.btn-group > .popover { + font-size: 14px; +} + +.btn-group > .btn-mini { + font-size: 10.5px; +} + +.btn-group > .btn-small { + font-size: 11.9px; +} + +.btn-group > .btn-large { + font-size: 17.5px; +} + +.btn-group > .btn:first-child { + margin-left: 0; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-topleft: 4px; +} + +.btn-group > .btn:last-child, +.btn-group > .dropdown-toggle { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-bottomright: 4px; +} + +.btn-group > .btn.large:first-child { + margin-left: 0; + -webkit-border-bottom-left-radius: 6px; + border-bottom-left-radius: 6px; + -webkit-border-top-left-radius: 6px; + border-top-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + -moz-border-radius-topleft: 6px; +} + +.btn-group > .btn.large:last-child, +.btn-group > .large.dropdown-toggle { + -webkit-border-top-right-radius: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + border-bottom-right-radius: 6px; + -moz-border-radius-topright: 6px; + -moz-border-radius-bottomright: 6px; +} + +.btn-group > .btn:hover, +.btn-group > .btn:focus, +.btn-group > .btn:active, +.btn-group > .btn.active { + z-index: 2; +} + +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} + +.btn-group > .btn + .dropdown-toggle { + *padding-top: 5px; + padding-right: 8px; + *padding-bottom: 5px; + padding-left: 8px; + -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn-group > .btn-mini + .dropdown-toggle { + *padding-top: 2px; + padding-right: 5px; + *padding-bottom: 2px; + padding-left: 5px; +} + +.btn-group > .btn-small + .dropdown-toggle { + *padding-top: 5px; + *padding-bottom: 4px; +} + +.btn-group > .btn-large + .dropdown-toggle { + *padding-top: 7px; + padding-right: 12px; + *padding-bottom: 7px; + padding-left: 12px; +} + +.btn-group.open .dropdown-toggle { + background-image: none; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn-group.open .btn.dropdown-toggle { + background-color: #e6e6e6; +} + +.btn-group.open .btn-primary.dropdown-toggle { + background-color: #0044cc; +} + +.btn-group.open .btn-warning.dropdown-toggle { + background-color: #f89406; +} + +.btn-group.open .btn-danger.dropdown-toggle { + background-color: #bd362f; +} + +.btn-group.open .btn-success.dropdown-toggle { + background-color: #51a351; +} + +.btn-group.open .btn-info.dropdown-toggle { + background-color: #2f96b4; +} + +.btn-group.open .btn-inverse.dropdown-toggle { + background-color: #222222; +} + +.btn .caret { + margin-top: 8px; + margin-left: 0; +} + +.btn-large .caret { + margin-top: 6px; +} + +.btn-large .caret { + border-top-width: 5px; + border-right-width: 5px; + border-left-width: 5px; +} + +.btn-mini .caret, +.btn-small .caret { + margin-top: 8px; +} + +.dropup .btn-large .caret { + border-bottom-width: 5px; +} + +.btn-primary .caret, +.btn-warning .caret, +.btn-danger .caret, +.btn-info .caret, +.btn-success .caret, +.btn-inverse .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.btn-group-vertical { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; +} + +.btn-group-vertical > .btn { + display: block; + float: none; + max-width: 100%; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-group-vertical > .btn + .btn { + margin-top: -1px; + margin-left: 0; +} + +.btn-group-vertical > .btn:first-child { + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} + +.btn-group-vertical > .btn:last-child { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} + +.btn-group-vertical > .btn-large:first-child { + -webkit-border-radius: 6px 6px 0 0; + -moz-border-radius: 6px 6px 0 0; + border-radius: 6px 6px 0 0; +} + +.btn-group-vertical > .btn-large:last-child { + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; +} + +.alert { + padding: 8px 35px 8px 14px; + margin-bottom: 20px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + background-color: #fcf8e3; + border: 1px solid #fbeed5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.alert, +.alert h4 { + color: #c09853; +} + +.alert h4 { + margin: 0; +} + +.alert .close { + position: relative; + top: -2px; + right: -21px; + line-height: 20px; +} + +.alert-success { + color: #468847; + background-color: #dff0d8; + border-color: #d6e9c6; +} + +.alert-success h4 { + color: #468847; +} + +.alert-danger, +.alert-error { + color: #b94a48; + background-color: #f2dede; + border-color: #eed3d7; +} + +.alert-danger h4, +.alert-error h4 { + color: #b94a48; +} + +.alert-info { + color: #3a87ad; + background-color: #d9edf7; + border-color: #bce8f1; +} + +.alert-info h4 { + color: #3a87ad; +} + +.alert-block { + padding-top: 14px; + padding-bottom: 14px; +} + +.alert-block > p, +.alert-block > ul { + margin-bottom: 0; +} + +.alert-block p + p { + margin-top: 5px; +} + +.nav { + margin-bottom: 20px; + margin-left: 0; + list-style: none; +} + +.nav > li > a { + display: block; +} + +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: #eeeeee; +} + +.nav > li > a > img { + max-width: none; +} + +.nav > .pull-right { + float: right; +} + +.nav-header { + display: block; + padding: 3px 15px; + font-size: 11px; + font-weight: bold; + line-height: 20px; + color: #999999; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + text-transform: uppercase; +} + +.nav li + .nav-header { + margin-top: 9px; +} + +.nav-list { + padding-right: 15px; + padding-left: 15px; + margin-bottom: 0; +} + +.nav-list > li > a, +.nav-list .nav-header { + margin-right: -15px; + margin-left: -15px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); +} + +.nav-list > li > a { + padding: 3px 15px; +} + +.nav-list > .active > a, +.nav-list > .active > a:hover, +.nav-list > .active > a:focus { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); + background-color: #0088cc; +} + +.nav-list [class^="icon-"], +.nav-list [class*=" icon-"] { + margin-right: 2px; +} + +.nav-list .divider { + *width: 100%; + height: 1px; + margin: 9px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} + +.nav-tabs, +.nav-pills { + *zoom: 1; +} + +.nav-tabs:before, +.nav-pills:before, +.nav-tabs:after, +.nav-pills:after { + display: table; + line-height: 0; + content: ""; +} + +.nav-tabs:after, +.nav-pills:after { + clear: both; +} + +.nav-tabs > li, +.nav-pills > li { + float: left; +} + +.nav-tabs > li > a, +.nav-pills > li > a { + padding-right: 12px; + padding-left: 12px; + margin-right: 2px; + line-height: 14px; +} + +.nav-tabs { + border-bottom: 1px solid #ddd; +} + +.nav-tabs > li { + margin-bottom: -1px; +} + +.nav-tabs > li > a { + padding-top: 8px; + padding-bottom: 8px; + line-height: 20px; + border: 1px solid transparent; + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} + +.nav-tabs > li > a:hover, +.nav-tabs > li > a:focus { + border-color: #eeeeee #eeeeee #dddddd; +} + +.nav-tabs > .active > a, +.nav-tabs > .active > a:hover, +.nav-tabs > .active > a:focus { + color: #555555; + cursor: default; + background-color: #ffffff; + border: 1px solid #ddd; + border-bottom-color: transparent; +} + +.nav-pills > li > a { + padding-top: 8px; + padding-bottom: 8px; + margin-top: 2px; + margin-bottom: 2px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} + +.nav-pills > .active > a, +.nav-pills > .active > a:hover, +.nav-pills > .active > a:focus { + color: #ffffff; + background-color: #0088cc; +} + +.nav-stacked > li { + float: none; +} + +.nav-stacked > li > a { + margin-right: 0; +} + +.nav-tabs.nav-stacked { + border-bottom: 0; +} + +.nav-tabs.nav-stacked > li > a { + border: 1px solid #ddd; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.nav-tabs.nav-stacked > li:first-child > a { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-topleft: 4px; +} + +.nav-tabs.nav-stacked > li:last-child > a { + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -moz-border-radius-bottomright: 4px; + -moz-border-radius-bottomleft: 4px; +} + +.nav-tabs.nav-stacked > li > a:hover, +.nav-tabs.nav-stacked > li > a:focus { + z-index: 2; + border-color: #ddd; +} + +.nav-pills.nav-stacked > li > a { + margin-bottom: 3px; +} + +.nav-pills.nav-stacked > li:last-child > a { + margin-bottom: 1px; +} + +.nav-tabs .dropdown-menu { + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; +} + +.nav-pills .dropdown-menu { + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.nav .dropdown-toggle .caret { + margin-top: 6px; + border-top-color: #0088cc; + border-bottom-color: #0088cc; +} + +.nav .dropdown-toggle:hover .caret, +.nav .dropdown-toggle:focus .caret { + border-top-color: #005580; + border-bottom-color: #005580; +} + +/* move down carets for tabs */ + +.nav-tabs .dropdown-toggle .caret { + margin-top: 8px; +} + +.nav .active .dropdown-toggle .caret { + border-top-color: #fff; + border-bottom-color: #fff; +} + +.nav-tabs .active .dropdown-toggle .caret { + border-top-color: #555555; + border-bottom-color: #555555; +} + +.nav > .dropdown.active > a:hover, +.nav > .dropdown.active > a:focus { + cursor: pointer; +} + +.nav-tabs .open .dropdown-toggle, +.nav-pills .open .dropdown-toggle, +.nav > li.dropdown.open.active > a:hover, +.nav > li.dropdown.open.active > a:focus { + color: #ffffff; + background-color: #999999; + border-color: #999999; +} + +.nav li.dropdown.open .caret, +.nav li.dropdown.open.active .caret, +.nav li.dropdown.open a:hover .caret, +.nav li.dropdown.open a:focus .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; + opacity: 1; + filter: alpha(opacity=100); +} + +.tabs-stacked .open > a:hover, +.tabs-stacked .open > a:focus { + border-color: #999999; +} + +.tabbable { + *zoom: 1; +} + +.tabbable:before, +.tabbable:after { + display: table; + line-height: 0; + content: ""; +} + +.tabbable:after { + clear: both; +} + +.tab-content { + overflow: auto; +} + +.tabs-below > .nav-tabs, +.tabs-right > .nav-tabs, +.tabs-left > .nav-tabs { + border-bottom: 0; +} + +.tab-content > .tab-pane, +.pill-content > .pill-pane { + display: none; +} + +.tab-content > .active, +.pill-content > .active { + display: block; +} + +.tabs-below > .nav-tabs { + border-top: 1px solid #ddd; +} + +.tabs-below > .nav-tabs > li { + margin-top: -1px; + margin-bottom: 0; +} + +.tabs-below > .nav-tabs > li > a { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} + +.tabs-below > .nav-tabs > li > a:hover, +.tabs-below > .nav-tabs > li > a:focus { + border-top-color: #ddd; + border-bottom-color: transparent; +} + +.tabs-below > .nav-tabs > .active > a, +.tabs-below > .nav-tabs > .active > a:hover, +.tabs-below > .nav-tabs > .active > a:focus { + border-color: transparent #ddd #ddd #ddd; +} + +.tabs-left > .nav-tabs > li, +.tabs-right > .nav-tabs > li { + float: none; +} + +.tabs-left > .nav-tabs > li > a, +.tabs-right > .nav-tabs > li > a { + min-width: 74px; + margin-right: 0; + margin-bottom: 3px; +} + +.tabs-left > .nav-tabs { + float: left; + margin-right: 19px; + border-right: 1px solid #ddd; +} + +.tabs-left > .nav-tabs > li > a { + margin-right: -1px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.tabs-left > .nav-tabs > li > a:hover, +.tabs-left > .nav-tabs > li > a:focus { + border-color: #eeeeee #dddddd #eeeeee #eeeeee; +} + +.tabs-left > .nav-tabs .active > a, +.tabs-left > .nav-tabs .active > a:hover, +.tabs-left > .nav-tabs .active > a:focus { + border-color: #ddd transparent #ddd #ddd; + *border-right-color: #ffffff; +} + +.tabs-right > .nav-tabs { + float: right; + margin-left: 19px; + border-left: 1px solid #ddd; +} + +.tabs-right > .nav-tabs > li > a { + margin-left: -1px; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.tabs-right > .nav-tabs > li > a:hover, +.tabs-right > .nav-tabs > li > a:focus { + border-color: #eeeeee #eeeeee #eeeeee #dddddd; +} + +.tabs-right > .nav-tabs .active > a, +.tabs-right > .nav-tabs .active > a:hover, +.tabs-right > .nav-tabs .active > a:focus { + border-color: #ddd #ddd #ddd transparent; + *border-left-color: #ffffff; +} + +.nav > .disabled > a { + color: #999999; +} + +.nav > .disabled > a:hover, +.nav > .disabled > a:focus { + text-decoration: none; + cursor: default; + background-color: transparent; +} + +.navbar { + *position: relative; + *z-index: 2; + margin-bottom: 20px; + overflow: visible; +} + +.navbar-inner { + min-height: 40px; + padding-right: 20px; + padding-left: 20px; + background-color: #fafafa; + background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2)); + background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2); + background-image: -o-linear-gradient(top, #ffffff, #f2f2f2); + background-image: linear-gradient(to bottom, #ffffff, #f2f2f2); + background-repeat: repeat-x; + border: 1px solid #d4d4d4; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0); + *zoom: 1; + -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); +} + +.navbar-inner:before, +.navbar-inner:after { + display: table; + line-height: 0; + content: ""; +} + +.navbar-inner:after { + clear: both; +} + +.navbar .container { + width: auto; +} + +.nav-collapse.collapse { + height: auto; + overflow: visible; +} + +.navbar .brand { + display: block; + float: left; + padding: 10px 20px 10px; + margin-left: -20px; + font-size: 20px; + font-weight: 200; + color: #777777; + text-shadow: 0 1px 0 #ffffff; +} + +.navbar .brand:hover, +.navbar .brand:focus { + text-decoration: none; +} + +.navbar-text { + margin-bottom: 0; + line-height: 40px; + color: #777777; +} + +.navbar-link { + color: #777777; +} + +.navbar-link:hover, +.navbar-link:focus { + color: #333333; +} + +.navbar .divider-vertical { + height: 40px; + margin: 0 9px; + border-right: 1px solid #ffffff; + border-left: 1px solid #f2f2f2; +} + +.navbar .btn, +.navbar .btn-group { + margin-top: 5px; +} + +.navbar .btn-group .btn, +.navbar .input-prepend .btn, +.navbar .input-append .btn, +.navbar .input-prepend .btn-group, +.navbar .input-append .btn-group { + margin-top: 0; +} + +.navbar-form { + margin-bottom: 0; + *zoom: 1; +} + +.navbar-form:before, +.navbar-form:after { + display: table; + line-height: 0; + content: ""; +} + +.navbar-form:after { + clear: both; +} + +.navbar-form input, +.navbar-form select, +.navbar-form .radio, +.navbar-form .checkbox { + margin-top: 5px; +} + +.navbar-form input, +.navbar-form select, +.navbar-form .btn { + display: inline-block; + margin-bottom: 0; +} + +.navbar-form input[type="image"], +.navbar-form input[type="checkbox"], +.navbar-form input[type="radio"] { + margin-top: 3px; +} + +.navbar-form .input-append, +.navbar-form .input-prepend { + margin-top: 5px; + white-space: nowrap; +} + +.navbar-form .input-append input, +.navbar-form .input-prepend input { + margin-top: 0; +} + +.navbar-search { + position: relative; + float: left; + margin-top: 5px; + margin-bottom: 0; +} + +.navbar-search .search-query { + padding: 4px 14px; + margin-bottom: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + font-weight: normal; + line-height: 1; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +.navbar-static-top { + position: static; + margin-bottom: 0; +} + +.navbar-static-top .navbar-inner { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; + margin-bottom: 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-static-top .navbar-inner { + border-width: 0 0 1px; +} + +.navbar-fixed-bottom .navbar-inner { + border-width: 1px 0 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-fixed-bottom .navbar-inner { + padding-right: 0; + padding-left: 0; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.navbar-static-top .container, +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} + +.navbar-fixed-top { + top: 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-static-top .navbar-inner { + -webkit-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); +} + +.navbar-fixed-bottom { + bottom: 0; +} + +.navbar-fixed-bottom .navbar-inner { + -webkit-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); + box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); +} + +.navbar .nav { + position: relative; + left: 0; + display: block; + float: left; + margin: 0 10px 0 0; +} + +.navbar .nav.pull-right { + float: right; + margin-right: 0; +} + +.navbar .nav > li { + float: left; +} + +.navbar .nav > li > a { + float: none; + padding: 10px 15px 10px; + color: #777777; + text-decoration: none; + text-shadow: 0 1px 0 #ffffff; +} + +.navbar .nav .dropdown-toggle .caret { + margin-top: 8px; +} + +.navbar .nav > li > a:focus, +.navbar .nav > li > a:hover { + color: #333333; + text-decoration: none; + background-color: transparent; +} + +.navbar .nav > .active > a, +.navbar .nav > .active > a:hover, +.navbar .nav > .active > a:focus { + color: #555555; + text-decoration: none; + background-color: #e5e5e5; + -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); + -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); +} + +.navbar .btn-navbar { + display: none; + float: right; + padding: 7px 10px; + margin-right: 5px; + margin-left: 5px; + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #ededed; + *background-color: #e5e5e5; + background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5)); + background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5); + background-repeat: repeat-x; + border-color: #e5e5e5 #e5e5e5 #bfbfbf; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); +} + +.navbar .btn-navbar:hover, +.navbar .btn-navbar:focus, +.navbar .btn-navbar:active, +.navbar .btn-navbar.active, +.navbar .btn-navbar.disabled, +.navbar .btn-navbar[disabled] { + color: #ffffff; + background-color: #e5e5e5; + *background-color: #d9d9d9; +} + +.navbar .btn-navbar:active, +.navbar .btn-navbar.active { + background-color: #cccccc \9; +} + +.navbar .btn-navbar .icon-bar { + display: block; + width: 18px; + height: 2px; + background-color: #f5f5f5; + -webkit-border-radius: 1px; + -moz-border-radius: 1px; + border-radius: 1px; + -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); +} + +.btn-navbar .icon-bar + .icon-bar { + margin-top: 3px; +} + +.navbar .nav > li > .dropdown-menu:before { + position: absolute; + top: -7px; + left: 9px; + display: inline-block; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-left: 7px solid transparent; + border-bottom-color: rgba(0, 0, 0, 0.2); + content: ''; +} + +.navbar .nav > li > .dropdown-menu:after { + position: absolute; + top: -6px; + left: 10px; + display: inline-block; + border-right: 6px solid transparent; + border-bottom: 6px solid #ffffff; + border-left: 6px solid transparent; + content: ''; +} + +.navbar-fixed-bottom .nav > li > .dropdown-menu:before { + top: auto; + bottom: -7px; + border-top: 7px solid #ccc; + border-bottom: 0; + border-top-color: rgba(0, 0, 0, 0.2); +} + +.navbar-fixed-bottom .nav > li > .dropdown-menu:after { + top: auto; + bottom: -6px; + border-top: 6px solid #ffffff; + border-bottom: 0; +} + +.navbar .nav li.dropdown > a:hover .caret, +.navbar .nav li.dropdown > a:focus .caret { + border-top-color: #333333; + border-bottom-color: #333333; +} + +.navbar .nav li.dropdown.open > .dropdown-toggle, +.navbar .nav li.dropdown.active > .dropdown-toggle, +.navbar .nav li.dropdown.open.active > .dropdown-toggle { + color: #555555; + background-color: #e5e5e5; +} + +.navbar .nav li.dropdown > .dropdown-toggle .caret { + border-top-color: #777777; + border-bottom-color: #777777; +} + +.navbar .nav li.dropdown.open > .dropdown-toggle .caret, +.navbar .nav li.dropdown.active > .dropdown-toggle .caret, +.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret { + border-top-color: #555555; + border-bottom-color: #555555; +} + +.navbar .pull-right > li > .dropdown-menu, +.navbar .nav > li > .dropdown-menu.pull-right { + right: 0; + left: auto; +} + +.navbar .pull-right > li > .dropdown-menu:before, +.navbar .nav > li > .dropdown-menu.pull-right:before { + right: 12px; + left: auto; +} + +.navbar .pull-right > li > .dropdown-menu:after, +.navbar .nav > li > .dropdown-menu.pull-right:after { + right: 13px; + left: auto; +} + +.navbar .pull-right > li > .dropdown-menu .dropdown-menu, +.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu { + right: 100%; + left: auto; + margin-right: -1px; + margin-left: 0; + -webkit-border-radius: 6px 0 6px 6px; + -moz-border-radius: 6px 0 6px 6px; + border-radius: 6px 0 6px 6px; +} + +.navbar-inverse .navbar-inner { + background-color: #1b1b1b; + background-image: -moz-linear-gradient(top, #222222, #111111); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111)); + background-image: -webkit-linear-gradient(top, #222222, #111111); + background-image: -o-linear-gradient(top, #222222, #111111); + background-image: linear-gradient(to bottom, #222222, #111111); + background-repeat: repeat-x; + border-color: #252525; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0); +} + +.navbar-inverse .brand, +.navbar-inverse .nav > li > a { + color: #999999; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} + +.navbar-inverse .brand:hover, +.navbar-inverse .nav > li > a:hover, +.navbar-inverse .brand:focus, +.navbar-inverse .nav > li > a:focus { + color: #ffffff; +} + +.navbar-inverse .brand { + color: #999999; +} + +.navbar-inverse .navbar-text { + color: #999999; +} + +.navbar-inverse .nav > li > a:focus, +.navbar-inverse .nav > li > a:hover { + color: #ffffff; + background-color: transparent; +} + +.navbar-inverse .nav .active > a, +.navbar-inverse .nav .active > a:hover, +.navbar-inverse .nav .active > a:focus { + color: #ffffff; + background-color: #111111; +} + +.navbar-inverse .navbar-link { + color: #999999; +} + +.navbar-inverse .navbar-link:hover, +.navbar-inverse .navbar-link:focus { + color: #ffffff; +} + +.navbar-inverse .divider-vertical { + border-right-color: #222222; + border-left-color: #111111; +} + +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle, +.navbar-inverse .nav li.dropdown.active > .dropdown-toggle, +.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle { + color: #ffffff; + background-color: #111111; +} + +.navbar-inverse .nav li.dropdown > a:hover .caret, +.navbar-inverse .nav li.dropdown > a:focus .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret { + border-top-color: #999999; + border-bottom-color: #999999; +} + +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret, +.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret, +.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.navbar-inverse .navbar-search .search-query { + color: #ffffff; + background-color: #515151; + border-color: #111111; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + -webkit-transition: none; + -moz-transition: none; + -o-transition: none; + transition: none; +} + +.navbar-inverse .navbar-search .search-query:-moz-placeholder { + color: #cccccc; +} + +.navbar-inverse .navbar-search .search-query:-ms-input-placeholder { + color: #cccccc; +} + +.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder { + color: #cccccc; +} + +.navbar-inverse .navbar-search .search-query:focus, +.navbar-inverse .navbar-search .search-query.focused { + padding: 5px 15px; + color: #333333; + text-shadow: 0 1px 0 #ffffff; + background-color: #ffffff; + border: 0; + outline: 0; + -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); +} + +.navbar-inverse .btn-navbar { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #0e0e0e; + *background-color: #040404; + background-image: -moz-linear-gradient(top, #151515, #040404); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404)); + background-image: -webkit-linear-gradient(top, #151515, #040404); + background-image: -o-linear-gradient(top, #151515, #040404); + background-image: linear-gradient(to bottom, #151515, #040404); + background-repeat: repeat-x; + border-color: #040404 #040404 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.navbar-inverse .btn-navbar:hover, +.navbar-inverse .btn-navbar:focus, +.navbar-inverse .btn-navbar:active, +.navbar-inverse .btn-navbar.active, +.navbar-inverse .btn-navbar.disabled, +.navbar-inverse .btn-navbar[disabled] { + color: #ffffff; + background-color: #040404; + *background-color: #000000; +} + +.navbar-inverse .btn-navbar:active, +.navbar-inverse .btn-navbar.active { + background-color: #000000 \9; +} + +.breadcrumb { + padding: 8px 15px; + margin: 0 0 20px; + list-style: none; + background-color: #f5f5f5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.breadcrumb > li { + display: inline-block; + *display: inline; + text-shadow: 0 1px 0 #ffffff; + *zoom: 1; +} + +.breadcrumb > li > .divider { + padding: 0 5px; + color: #ccc; +} + +.breadcrumb > .active { + color: #999999; +} + +.pagination { + margin: 20px 0; +} + +.pagination ul { + display: inline-block; + *display: inline; + margin-bottom: 0; + margin-left: 0; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + *zoom: 1; + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.pagination ul > li { + display: inline; +} + +.pagination ul > li > a, +.pagination ul > li > span { + float: left; + padding: 4px 12px; + line-height: 20px; + text-decoration: none; + background-color: #ffffff; + border: 1px solid #dddddd; + border-left-width: 0; +} + +.pagination ul > li > a:hover, +.pagination ul > li > a:focus, +.pagination ul > .active > a, +.pagination ul > .active > span { + background-color: #f5f5f5; +} + +.pagination ul > .active > a, +.pagination ul > .active > span { + color: #999999; + cursor: default; +} + +.pagination ul > .disabled > span, +.pagination ul > .disabled > a, +.pagination ul > .disabled > a:hover, +.pagination ul > .disabled > a:focus { + color: #999999; + cursor: default; + background-color: transparent; +} + +.pagination ul > li:first-child > a, +.pagination ul > li:first-child > span { + border-left-width: 1px; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-topleft: 4px; +} + +.pagination ul > li:last-child > a, +.pagination ul > li:last-child > span { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-bottomright: 4px; +} + +.pagination-centered { + text-align: center; +} + +.pagination-right { + text-align: right; +} + +.pagination-large ul > li > a, +.pagination-large ul > li > span { + padding: 11px 19px; + font-size: 17.5px; +} + +.pagination-large ul > li:first-child > a, +.pagination-large ul > li:first-child > span { + -webkit-border-bottom-left-radius: 6px; + border-bottom-left-radius: 6px; + -webkit-border-top-left-radius: 6px; + border-top-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + -moz-border-radius-topleft: 6px; +} + +.pagination-large ul > li:last-child > a, +.pagination-large ul > li:last-child > span { + -webkit-border-top-right-radius: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + border-bottom-right-radius: 6px; + -moz-border-radius-topright: 6px; + -moz-border-radius-bottomright: 6px; +} + +.pagination-mini ul > li:first-child > a, +.pagination-small ul > li:first-child > a, +.pagination-mini ul > li:first-child > span, +.pagination-small ul > li:first-child > span { + -webkit-border-bottom-left-radius: 3px; + border-bottom-left-radius: 3px; + -webkit-border-top-left-radius: 3px; + border-top-left-radius: 3px; + -moz-border-radius-bottomleft: 3px; + -moz-border-radius-topleft: 3px; +} + +.pagination-mini ul > li:last-child > a, +.pagination-small ul > li:last-child > a, +.pagination-mini ul > li:last-child > span, +.pagination-small ul > li:last-child > span { + -webkit-border-top-right-radius: 3px; + border-top-right-radius: 3px; + -webkit-border-bottom-right-radius: 3px; + border-bottom-right-radius: 3px; + -moz-border-radius-topright: 3px; + -moz-border-radius-bottomright: 3px; +} + +.pagination-small ul > li > a, +.pagination-small ul > li > span { + padding: 2px 10px; + font-size: 11.9px; +} + +.pagination-mini ul > li > a, +.pagination-mini ul > li > span { + padding: 0 6px; + font-size: 10.5px; +} + +.pager { + margin: 20px 0; + text-align: center; + list-style: none; + *zoom: 1; +} + +.pager:before, +.pager:after { + display: table; + line-height: 0; + content: ""; +} + +.pager:after { + clear: both; +} + +.pager li { + display: inline; +} + +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #f5f5f5; +} + +.pager .next > a, +.pager .next > span { + float: right; +} + +.pager .previous > a, +.pager .previous > span { + float: left; +} + +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #999999; + cursor: default; + background-color: #fff; +} + +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000000; +} + +.modal-backdrop.fade { + opacity: 0; +} + +.modal-backdrop, +.modal-backdrop.fade.in { + opacity: 0.8; + filter: alpha(opacity=80); +} + +.modal { + position: fixed; + top: 10%; + left: 50%; + z-index: 1050; + width: 560px; + margin-left: -280px; + background-color: #ffffff; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, 0.3); + *border: 1px solid #999; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + outline: none; + -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -webkit-background-clip: padding-box; + -moz-background-clip: padding-box; + background-clip: padding-box; +} + +.modal.fade { + top: -25%; + -webkit-transition: opacity 0.3s linear, top 0.3s ease-out; + -moz-transition: opacity 0.3s linear, top 0.3s ease-out; + -o-transition: opacity 0.3s linear, top 0.3s ease-out; + transition: opacity 0.3s linear, top 0.3s ease-out; +} + +.modal.fade.in { + top: 10%; +} + +.modal-header { + padding: 9px 15px; + border-bottom: 1px solid #eee; +} + +.modal-header .close { + margin-top: 2px; +} + +.modal-header h3 { + margin: 0; + line-height: 30px; +} + +.modal-body { + position: relative; + max-height: 400px; + padding: 15px; + overflow-y: auto; +} + +.modal-form { + margin-bottom: 0; +} + +.modal-footer { + padding: 14px 15px 15px; + margin-bottom: 0; + text-align: right; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; + *zoom: 1; + -webkit-box-shadow: inset 0 1px 0 #ffffff; + -moz-box-shadow: inset 0 1px 0 #ffffff; + box-shadow: inset 0 1px 0 #ffffff; +} + +.modal-footer:before, +.modal-footer:after { + display: table; + line-height: 0; + content: ""; +} + +.modal-footer:after { + clear: both; +} + +.modal-footer .btn + .btn { + margin-bottom: 0; + margin-left: 5px; +} + +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} + +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} + +.tooltip { + position: absolute; + z-index: 1030; + display: block; + font-size: 11px; + line-height: 1.4; + opacity: 0; + filter: alpha(opacity=0); + visibility: visible; +} + +.tooltip.in { + opacity: 0.8; + filter: alpha(opacity=80); +} + +.tooltip.top { + padding: 5px 0; + margin-top: -3px; +} + +.tooltip.right { + padding: 0 5px; + margin-left: 3px; +} + +.tooltip.bottom { + padding: 5px 0; + margin-top: 3px; +} + +.tooltip.left { + padding: 0 5px; + margin-left: -3px; +} + +.tooltip-inner { + max-width: 200px; + padding: 8px; + color: #ffffff; + text-align: center; + text-decoration: none; + background-color: #000000; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} + +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-top-color: #000000; + border-width: 5px 5px 0; +} + +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-right-color: #000000; + border-width: 5px 5px 5px 0; +} + +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-left-color: #000000; + border-width: 5px 0 5px 5px; +} + +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-bottom-color: #000000; + border-width: 0 5px 5px; +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1010; + display: none; + max-width: 276px; + padding: 1px; + text-align: left; + white-space: normal; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} + +.popover.top { + margin-top: -10px; +} + +.popover.right { + margin-left: 10px; +} + +.popover.bottom { + margin-top: 10px; +} + +.popover.left { + margin-left: -10px; +} + +.popover-title { + padding: 8px 14px; + margin: 0; + font-size: 14px; + font-weight: normal; + line-height: 18px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + -webkit-border-radius: 5px 5px 0 0; + -moz-border-radius: 5px 5px 0 0; + border-radius: 5px 5px 0 0; +} + +.popover-title:empty { + display: none; +} + +.popover-content { + padding: 9px 14px; +} + +.popover .arrow, +.popover .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} + +.popover .arrow { + border-width: 11px; +} + +.popover .arrow:after { + border-width: 10px; + content: ""; +} + +.popover.top .arrow { + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999; + border-top-color: rgba(0, 0, 0, 0.25); + border-bottom-width: 0; +} + +.popover.top .arrow:after { + bottom: 1px; + margin-left: -10px; + border-top-color: #ffffff; + border-bottom-width: 0; +} + +.popover.right .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-right-color: #999; + border-right-color: rgba(0, 0, 0, 0.25); + border-left-width: 0; +} + +.popover.right .arrow:after { + bottom: -10px; + left: 1px; + border-right-color: #ffffff; + border-left-width: 0; +} + +.popover.bottom .arrow { + top: -11px; + left: 50%; + margin-left: -11px; + border-bottom-color: #999; + border-bottom-color: rgba(0, 0, 0, 0.25); + border-top-width: 0; +} + +.popover.bottom .arrow:after { + top: 1px; + margin-left: -10px; + border-bottom-color: #ffffff; + border-top-width: 0; +} + +.popover.left .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-left-color: #999; + border-left-color: rgba(0, 0, 0, 0.25); + border-right-width: 0; +} + +.popover.left .arrow:after { + right: 1px; + bottom: -10px; + border-left-color: #ffffff; + border-right-width: 0; +} + +.thumbnails { + margin-left: -20px; + list-style: none; + *zoom: 1; +} + +.thumbnails:before, +.thumbnails:after { + display: table; + line-height: 0; + content: ""; +} + +.thumbnails:after { + clear: both; +} + +.row-fluid .thumbnails { + margin-left: 0; +} + +.thumbnails > li { + float: left; + margin-bottom: 20px; + margin-left: 20px; +} + +.thumbnail { + display: block; + padding: 4px; + line-height: 20px; + border: 1px solid #ddd; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} + +a.thumbnail:hover, +a.thumbnail:focus { + border-color: #0088cc; + -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); +} + +.thumbnail > img { + display: block; + max-width: 100%; + margin-right: auto; + margin-left: auto; +} + +.thumbnail .caption { + padding: 9px; + color: #555555; +} + +.media, +.media-body { + overflow: hidden; + *overflow: visible; + zoom: 1; +} + +.media, +.media .media { + margin-top: 15px; +} + +.media:first-child { + margin-top: 0; +} + +.media-object { + display: block; +} + +.media-heading { + margin: 0 0 5px; +} + +.media > .pull-left { + margin-right: 10px; +} + +.media > .pull-right { + margin-left: 10px; +} + +.media-list { + margin-left: 0; + list-style: none; +} + +.label, +.badge { + display: inline-block; + padding: 2px 4px; + font-size: 11.844px; + font-weight: bold; + line-height: 14px; + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + white-space: nowrap; + vertical-align: baseline; + background-color: #999999; +} + +.label { + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.badge { + padding-right: 9px; + padding-left: 9px; + -webkit-border-radius: 9px; + -moz-border-radius: 9px; + border-radius: 9px; +} + +.label:empty, +.badge:empty { + display: none; +} + +a.label:hover, +a.label:focus, +a.badge:hover, +a.badge:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} + +.label-important, +.badge-important { + background-color: #b94a48; +} + +.label-important[href], +.badge-important[href] { + background-color: #953b39; +} + +.label-warning, +.badge-warning { + background-color: #f89406; +} + +.label-warning[href], +.badge-warning[href] { + background-color: #c67605; +} + +.label-success, +.badge-success { + background-color: #468847; +} + +.label-success[href], +.badge-success[href] { + background-color: #356635; +} + +.label-info, +.badge-info { + background-color: #3a87ad; +} + +.label-info[href], +.badge-info[href] { + background-color: #2d6987; +} + +.label-inverse, +.badge-inverse { + background-color: #333333; +} + +.label-inverse[href], +.badge-inverse[href] { + background-color: #1a1a1a; +} + +.btn .label, +.btn .badge { + position: relative; + top: -1px; +} + +.btn-mini .label, +.btn-mini .badge { + top: 0; +} + +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-moz-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-ms-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-o-keyframes progress-bar-stripes { + from { + background-position: 0 0; + } + to { + background-position: 40px 0; + } +} + +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +.progress { + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: #f7f7f7; + background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); + background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9); + background-repeat: repeat-x; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0); + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); +} + +.progress .bar { + float: left; + width: 0; + height: 100%; + font-size: 12px; + color: #ffffff; + text-align: center; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #0e90d2; + background-image: -moz-linear-gradient(top, #149bdf, #0480be); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); + background-image: -webkit-linear-gradient(top, #149bdf, #0480be); + background-image: -o-linear-gradient(top, #149bdf, #0480be); + background-image: linear-gradient(to bottom, #149bdf, #0480be); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0); + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -webkit-transition: width 0.6s ease; + -moz-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; +} + +.progress .bar + .bar { + -webkit-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -moz-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); +} + +.progress-striped .bar { + background-color: #149bdf; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + -moz-background-size: 40px 40px; + -o-background-size: 40px 40px; + background-size: 40px 40px; +} + +.progress.active .bar { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -moz-animation: progress-bar-stripes 2s linear infinite; + -ms-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} + +.progress-danger .bar, +.progress .bar-danger { + background-color: #dd514c; + background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); + background-image: linear-gradient(to bottom, #ee5f5b, #c43c35); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0); +} + +.progress-danger.progress-striped .bar, +.progress-striped .bar-danger { + background-color: #ee5f5b; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-success .bar, +.progress .bar-success { + background-color: #5eb95e; + background-image: -moz-linear-gradient(top, #62c462, #57a957); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); + background-image: -webkit-linear-gradient(top, #62c462, #57a957); + background-image: -o-linear-gradient(top, #62c462, #57a957); + background-image: linear-gradient(to bottom, #62c462, #57a957); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0); +} + +.progress-success.progress-striped .bar, +.progress-striped .bar-success { + background-color: #62c462; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-info .bar, +.progress .bar-info { + background-color: #4bb1cf; + background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); + background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); + background-image: -o-linear-gradient(top, #5bc0de, #339bb9); + background-image: linear-gradient(to bottom, #5bc0de, #339bb9); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0); +} + +.progress-info.progress-striped .bar, +.progress-striped .bar-info { + background-color: #5bc0de; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-warning .bar, +.progress .bar-warning { + background-color: #faa732; + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(to bottom, #fbb450, #f89406); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); +} + +.progress-warning.progress-striped .bar, +.progress-striped .bar-warning { + background-color: #fbb450; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.accordion { + margin-bottom: 20px; +} + +.accordion-group { + margin-bottom: 2px; + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.accordion-heading { + border-bottom: 0; +} + +.accordion-heading .accordion-toggle { + display: block; + padding: 8px 15px; +} + +.accordion-toggle { + cursor: pointer; +} + +.accordion-inner { + padding: 9px 15px; + border-top: 1px solid #e5e5e5; +} + +.carousel { + position: relative; + margin-bottom: 20px; + line-height: 1; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} + +.carousel-inner > .item { + position: relative; + display: none; + -webkit-transition: 0.6s ease-in-out left; + -moz-transition: 0.6s ease-in-out left; + -o-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; +} + +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + line-height: 1; +} + +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} + +.carousel-inner > .active { + left: 0; +} + +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} + +.carousel-inner > .next { + left: 100%; +} + +.carousel-inner > .prev { + left: -100%; +} + +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} + +.carousel-inner > .active.left { + left: -100%; +} + +.carousel-inner > .active.right { + left: 100%; +} + +.carousel-control { + position: absolute; + top: 40%; + left: 15px; + width: 40px; + height: 40px; + margin-top: -20px; + font-size: 60px; + font-weight: 100; + line-height: 30px; + color: #ffffff; + text-align: center; + background: #222222; + border: 3px solid #ffffff; + -webkit-border-radius: 23px; + -moz-border-radius: 23px; + border-radius: 23px; + opacity: 0.5; + filter: alpha(opacity=50); +} + +.carousel-control.right { + right: 15px; + left: auto; +} + +.carousel-control:hover, +.carousel-control:focus { + color: #ffffff; + text-decoration: none; + opacity: 0.9; + filter: alpha(opacity=90); +} + +.carousel-indicators { + position: absolute; + top: 15px; + right: 15px; + z-index: 5; + margin: 0; + list-style: none; +} + +.carousel-indicators li { + display: block; + float: left; + width: 10px; + height: 10px; + margin-left: 5px; + text-indent: -999px; + background-color: #ccc; + background-color: rgba(255, 255, 255, 0.25); + border-radius: 5px; +} + +.carousel-indicators .active { + background-color: #fff; +} + +.carousel-caption { + position: absolute; + right: 0; + bottom: 0; + left: 0; + padding: 15px; + background: #333333; + background: rgba(0, 0, 0, 0.75); +} + +.carousel-caption h4, +.carousel-caption p { + line-height: 20px; + color: #ffffff; +} + +.carousel-caption h4 { + margin: 0 0 5px; +} + +.carousel-caption p { + margin-bottom: 0; +} + +.hero-unit { + padding: 60px; + margin-bottom: 30px; + font-size: 18px; + font-weight: 200; + line-height: 30px; + color: inherit; + background-color: #eeeeee; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.hero-unit h1 { + margin-bottom: 0; + font-size: 60px; + line-height: 1; + letter-spacing: -1px; + color: inherit; +} + +.hero-unit li { + line-height: 30px; +} + +.pull-right { + float: right; +} + +.pull-left { + float: left; +} + +.hide { + display: none; +} + +.show { + display: block; +} + +.invisible { + visibility: hidden; +} + +.affix { + position: fixed; +} diff --git a/_static/bootstrap-2.3.2/css/bootstrap.min.css b/_static/bootstrap-2.3.2/css/bootstrap.min.css new file mode 100644 index 000000000..b6428e695 --- /dev/null +++ b/_static/bootstrap-2.3.2/css/bootstrap.min.css @@ -0,0 +1,9 @@ +/*! + * Bootstrap v2.3.2 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:hover,a:focus{color:#005580;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}a.muted:hover,a.muted:focus{color:#808080}.text-warning{color:#c09853}a.text-warning:hover,a.text-warning:focus{color:#a47e3c}.text-error{color:#b94a48}a.text-error:hover,a.text-error:focus{color:#953b39}.text-info{color:#3a87ad}a.text-info:hover,a.text-info:focus{color:#2d6987}.text-success{color:#468847}a.text-success:hover,a.text-success:focus{color:#356635}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{line-height:40px}h1{font-size:38.5px}h2{font-size:31.5px}h3{font-size:24.5px}h4{font-size:17.5px}h5{font-size:14px}h6{font-size:11.9px}h1 small{font-size:24.5px}h2 small{font-size:17.5px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555;vertical-align:middle;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:20px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:14px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#f5f5f5}table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success>td{background-color:#dff0d8}.table tbody tr.error>td{background-color:#f2dede}.table tbody tr.warning>td{background-color:#fcf8e3}.table tbody tr.info>td{background-color:#d9edf7}.table-hover tbody tr.success:hover>td{background-color:#d0e9c6}.table-hover tbody tr.error:hover>td{background-color:#ebcccc}.table-hover tbody tr.warning:hover>td{background-color:#faf2cc}.table-hover tbody tr.info:hover>td{background-color:#c4e3f3}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{width:16px;background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #ccc;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#006dcc;*background-color:#04c;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0044cc',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.btn-primary:active,.btn-primary.active{background-color:#039 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;*background-color:#f89406;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffbd362f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff51a351',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2f96b4',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#363636;*background-color:#222;background-image:-moz-linear-gradient(top,#444,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#08c;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#005580;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:14px}.btn-group>.btn-mini{font-size:10.5px}.btn-group>.btn-small{font-size:11.9px}.btn-group>.btn-large{font-size:17.5px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#04c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert,.alert h4{color:#c09853}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-success h4{color:#468847}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-danger h4,.alert-error h4{color:#b94a48}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-info h4{color:#3a87ad}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#08c}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#fff;background-color:#08c}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#08c;border-bottom-color:#08c}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top,#fff,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#fff,#f2f2f2);background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff2f2f2',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px;color:#777}.navbar-link{color:#777}.navbar-link:hover,.navbar-link:focus{color:#333}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #fff;border-left:1px solid #f2f2f2}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#333;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ededed;*background-color:#e5e5e5;background-image:-moz-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f2f2f2),to(#e5e5e5));background-image:-webkit-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-o-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:linear-gradient(to bottom,#f2f2f2,#e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2',endColorstr='#ffe5e5e5',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#e5e5e5;*background-color:#d9d9d9}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#ccc \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#333;border-bottom-color:#333}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#555;background-color:#e5e5e5}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777;border-bottom-color:#777}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top,#222,#111);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#111));background-image:-webkit-linear-gradient(top,#222,#111);background-image:-o-linear-gradient(top,#222,#111);background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff111111',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#999}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e0e0e;*background-color:#040404;background-image:-moz-linear-gradient(top,#151515,#040404);background-image:-webkit-gradient(linear,0 0,0 100%,from(#151515),to(#040404));background-image:-webkit-linear-gradient(top,#151515,#040404);background-image:-o-linear-gradient(top,#151515,#040404);background-image:linear-gradient(to bottom,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515',endColorstr='#ff040404',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5}.pagination ul>.active>a,.pagination ul>.active>span{color:#999;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#999;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:10.5px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#08c;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.media,.media-body{overflow:hidden;*overflow:visible;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255,255,255,0.25);border-radius:5px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed} diff --git a/_static/bootstrap-2.3.2/img/glyphicons-halflings-white.png b/_static/bootstrap-2.3.2/img/glyphicons-halflings-white.png new file mode 100644 index 000000000..3bf6484a2 Binary files /dev/null and b/_static/bootstrap-2.3.2/img/glyphicons-halflings-white.png differ diff --git a/_static/bootstrap-2.3.2/img/glyphicons-halflings.png b/_static/bootstrap-2.3.2/img/glyphicons-halflings.png new file mode 100644 index 000000000..a99699932 Binary files /dev/null and b/_static/bootstrap-2.3.2/img/glyphicons-halflings.png differ diff --git a/_static/bootstrap-2.3.2/js/bootstrap.js b/_static/bootstrap-2.3.2/js/bootstrap.js new file mode 100644 index 000000000..638bb1877 --- /dev/null +++ b/_static/bootstrap-2.3.2/js/bootstrap.js @@ -0,0 +1,2287 @@ +/* =================================================== + * bootstrap-transition.js v2.3.2 + * http://twitter.github.com/bootstrap/javascript.html#transitions + * =================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* CSS TRANSITION SUPPORT (http://www.modernizr.com/) + * ======================================================= */ + + $(function () { + + $.support.transition = (function () { + + var transitionEnd = (function () { + + var el = document.createElement('bootstrap') + , transEndEventNames = { + 'WebkitTransition' : 'webkitTransitionEnd' + , 'MozTransition' : 'transitionend' + , 'OTransition' : 'oTransitionEnd otransitionend' + , 'transition' : 'transitionend' + } + , name + + for (name in transEndEventNames){ + if (el.style[name] !== undefined) { + return transEndEventNames[name] + } + } + + }()) + + return transitionEnd && { + end: transitionEnd + } + + })() + + }) + +}(window.$jqTheme || window.jQuery); +/* ========================================================== + * bootstrap-alert.js v2.3.2 + * http://twitter.github.com/bootstrap/javascript.html#alerts + * ========================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* ALERT CLASS DEFINITION + * ====================== */ + + var dismiss = '[data-dismiss="alert"]' + , Alert = function (el) { + $(el).on('click', dismiss, this.close) + } + + Alert.prototype.close = function (e) { + var $this = $(this) + , selector = $this.attr('data-target') + , $parent + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 + } + + $parent = $(selector) + + e && e.preventDefault() + + $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent()) + + $parent.trigger(e = $.Event('close')) + + if (e.isDefaultPrevented()) return + + $parent.removeClass('in') + + function removeElement() { + $parent + .trigger('closed') + .remove() + } + + $.support.transition && $parent.hasClass('fade') ? + $parent.on($.support.transition.end, removeElement) : + removeElement() + } + + + /* ALERT PLUGIN DEFINITION + * ======================= */ + + var old = $.fn.alert + + $.fn.alert = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('alert') + if (!data) $this.data('alert', (data = new Alert(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + $.fn.alert.Constructor = Alert + + + /* ALERT NO CONFLICT + * ================= */ + + $.fn.alert.noConflict = function () { + $.fn.alert = old + return this + } + + + /* ALERT DATA-API + * ============== */ + + $(document).on('click.alert.data-api', dismiss, Alert.prototype.close) + +}(window.$jqTheme || window.jQuery); +/* ============================================================ + * bootstrap-button.js v2.3.2 + * http://twitter.github.com/bootstrap/javascript.html#buttons + * ============================================================ + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================ */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* BUTTON PUBLIC CLASS DEFINITION + * ============================== */ + + var Button = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, $.fn.button.defaults, options) + } + + Button.prototype.setState = function (state) { + var d = 'disabled' + , $el = this.$element + , data = $el.data() + , val = $el.is('input') ? 'val' : 'html' + + state = state + 'Text' + data.resetText || $el.data('resetText', $el[val]()) + + $el[val](data[state] || this.options[state]) + + // push to event loop to allow forms to submit + setTimeout(function () { + state == 'loadingText' ? + $el.addClass(d).attr(d, d) : + $el.removeClass(d).removeAttr(d) + }, 0) + } + + Button.prototype.toggle = function () { + var $parent = this.$element.closest('[data-toggle="buttons-radio"]') + + $parent && $parent + .find('.active') + .removeClass('active') + + this.$element.toggleClass('active') + } + + + /* BUTTON PLUGIN DEFINITION + * ======================== */ + + var old = $.fn.button + + $.fn.button = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('button') + , options = typeof option == 'object' && option + if (!data) $this.data('button', (data = new Button(this, options))) + if (option == 'toggle') data.toggle() + else if (option) data.setState(option) + }) + } + + $.fn.button.defaults = { + loadingText: 'loading...' + } + + $.fn.button.Constructor = Button + + + /* BUTTON NO CONFLICT + * ================== */ + + $.fn.button.noConflict = function () { + $.fn.button = old + return this + } + + + /* BUTTON DATA-API + * =============== */ + + $(document).on('click.button.data-api', '[data-toggle^=button]', function (e) { + var $btn = $(e.target) + if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') + $btn.button('toggle') + }) + +}(window.$jqTheme || window.jQuery); +/* ========================================================== + * bootstrap-carousel.js v2.3.2 + * http://twitter.github.com/bootstrap/javascript.html#carousel + * ========================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* CAROUSEL CLASS DEFINITION + * ========================= */ + + var Carousel = function (element, options) { + this.$element = $(element) + this.$indicators = this.$element.find('.carousel-indicators') + this.options = options + this.options.pause == 'hover' && this.$element + .on('mouseenter', $.proxy(this.pause, this)) + .on('mouseleave', $.proxy(this.cycle, this)) + } + + Carousel.prototype = { + + cycle: function (e) { + if (!e) this.paused = false + if (this.interval) clearInterval(this.interval); + this.options.interval + && !this.paused + && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) + return this + } + + , getActiveIndex: function () { + this.$active = this.$element.find('.item.active') + this.$items = this.$active.parent().children() + return this.$items.index(this.$active) + } + + , to: function (pos) { + var activeIndex = this.getActiveIndex() + , that = this + + if (pos > (this.$items.length - 1) || pos < 0) return + + if (this.sliding) { + return this.$element.one('slid', function () { + that.to(pos) + }) + } + + if (activeIndex == pos) { + return this.pause().cycle() + } + + return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos])) + } + + , pause: function (e) { + if (!e) this.paused = true + if (this.$element.find('.next, .prev').length && $.support.transition.end) { + this.$element.trigger($.support.transition.end) + this.cycle(true) + } + clearInterval(this.interval) + this.interval = null + return this + } + + , next: function () { + if (this.sliding) return + return this.slide('next') + } + + , prev: function () { + if (this.sliding) return + return this.slide('prev') + } + + , slide: function (type, next) { + var $active = this.$element.find('.item.active') + , $next = next || $active[type]() + , isCycling = this.interval + , direction = type == 'next' ? 'left' : 'right' + , fallback = type == 'next' ? 'first' : 'last' + , that = this + , e + + this.sliding = true + + isCycling && this.pause() + + $next = $next.length ? $next : this.$element.find('.item')[fallback]() + + e = $.Event('slide', { + relatedTarget: $next[0] + , direction: direction + }) + + if ($next.hasClass('active')) return + + if (this.$indicators.length) { + this.$indicators.find('.active').removeClass('active') + this.$element.one('slid', function () { + var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()]) + $nextIndicator && $nextIndicator.addClass('active') + }) + } + + if ($.support.transition && this.$element.hasClass('slide')) { + this.$element.trigger(e) + if (e.isDefaultPrevented()) return + $next.addClass(type) + $next[0].offsetWidth // force reflow + $active.addClass(direction) + $next.addClass(direction) + this.$element.one($.support.transition.end, function () { + $next.removeClass([type, direction].join(' ')).addClass('active') + $active.removeClass(['active', direction].join(' ')) + that.sliding = false + setTimeout(function () { that.$element.trigger('slid') }, 0) + }) + } else { + this.$element.trigger(e) + if (e.isDefaultPrevented()) return + $active.removeClass('active') + $next.addClass('active') + this.sliding = false + this.$element.trigger('slid') + } + + isCycling && this.cycle() + + return this + } + + } + + + /* CAROUSEL PLUGIN DEFINITION + * ========================== */ + + var old = $.fn.carousel + + $.fn.carousel = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('carousel') + , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option) + , action = typeof option == 'string' ? option : options.slide + if (!data) $this.data('carousel', (data = new Carousel(this, options))) + if (typeof option == 'number') data.to(option) + else if (action) data[action]() + else if (options.interval) data.pause().cycle() + }) + } + + $.fn.carousel.defaults = { + interval: 5000 + , pause: 'hover' + } + + $.fn.carousel.Constructor = Carousel + + + /* CAROUSEL NO CONFLICT + * ==================== */ + + $.fn.carousel.noConflict = function () { + $.fn.carousel = old + return this + } + + /* CAROUSEL DATA-API + * ================= */ + + $(document).on('click.carousel.data-api', '[data-slide], [data-slide-to]', function (e) { + var $this = $(this), href + , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 + , options = $.extend({}, $target.data(), $this.data()) + , slideIndex + + $target.carousel(options) + + if (slideIndex = $this.attr('data-slide-to')) { + $target.data('carousel').pause().to(slideIndex).cycle() + } + + e.preventDefault() + }) + +}(window.$jqTheme || window.jQuery); +/* ============================================================= + * bootstrap-collapse.js v2.3.2 + * http://twitter.github.com/bootstrap/javascript.html#collapse + * ============================================================= + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================ */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* COLLAPSE PUBLIC CLASS DEFINITION + * ================================ */ + + var Collapse = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, $.fn.collapse.defaults, options) + + if (this.options.parent) { + this.$parent = $(this.options.parent) + } + + this.options.toggle && this.toggle() + } + + Collapse.prototype = { + + constructor: Collapse + + , dimension: function () { + var hasWidth = this.$element.hasClass('width') + return hasWidth ? 'width' : 'height' + } + + , show: function () { + var dimension + , scroll + , actives + , hasData + + if (this.transitioning || this.$element.hasClass('in')) return + + dimension = this.dimension() + scroll = $.camelCase(['scroll', dimension].join('-')) + actives = this.$parent && this.$parent.find('> .accordion-group > .in') + + if (actives && actives.length) { + hasData = actives.data('collapse') + if (hasData && hasData.transitioning) return + actives.collapse('hide') + hasData || actives.data('collapse', null) + } + + this.$element[dimension](0) + this.transition('addClass', $.Event('show'), 'shown') + $.support.transition && this.$element[dimension](this.$element[0][scroll]) + } + + , hide: function () { + var dimension + if (this.transitioning || !this.$element.hasClass('in')) return + dimension = this.dimension() + this.reset(this.$element[dimension]()) + this.transition('removeClass', $.Event('hide'), 'hidden') + this.$element[dimension](0) + } + + , reset: function (size) { + var dimension = this.dimension() + + this.$element + .removeClass('collapse') + [dimension](size || 'auto') + [0].offsetWidth + + this.$element[size !== null ? 'addClass' : 'removeClass']('collapse') + + return this + } + + , transition: function (method, startEvent, completeEvent) { + var that = this + , complete = function () { + if (startEvent.type == 'show') that.reset() + that.transitioning = 0 + that.$element.trigger(completeEvent) + } + + this.$element.trigger(startEvent) + + if (startEvent.isDefaultPrevented()) return + + this.transitioning = 1 + + this.$element[method]('in') + + $.support.transition && this.$element.hasClass('collapse') ? + this.$element.one($.support.transition.end, complete) : + complete() + } + + , toggle: function () { + this[this.$element.hasClass('in') ? 'hide' : 'show']() + } + + } + + + /* COLLAPSE PLUGIN DEFINITION + * ========================== */ + + var old = $.fn.collapse + + $.fn.collapse = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('collapse') + , options = $.extend({}, $.fn.collapse.defaults, $this.data(), typeof option == 'object' && option) + if (!data) $this.data('collapse', (data = new Collapse(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + $.fn.collapse.defaults = { + toggle: true + } + + $.fn.collapse.Constructor = Collapse + + + /* COLLAPSE NO CONFLICT + * ==================== */ + + $.fn.collapse.noConflict = function () { + $.fn.collapse = old + return this + } + + + /* COLLAPSE DATA-API + * ================= */ + + $(document).on('click.collapse.data-api', '[data-toggle=collapse]', function (e) { + var $this = $(this), href + , target = $this.attr('data-target') + || e.preventDefault() + || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 + , option = $(target).data('collapse') ? 'toggle' : $this.data() + $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed') + $(target).collapse(option) + }) + +}(window.$jqTheme || window.jQuery); +/* ============================================================ + * bootstrap-dropdown.js v2.3.2 + * http://twitter.github.com/bootstrap/javascript.html#dropdowns + * ============================================================ + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================ */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* DROPDOWN CLASS DEFINITION + * ========================= */ + + var toggle = '[data-toggle=dropdown]' + , Dropdown = function (element) { + var $el = $(element).on('click.dropdown.data-api', this.toggle) + $('html').on('click.dropdown.data-api', function () { + $el.parent().removeClass('open') + }) + } + + Dropdown.prototype = { + + constructor: Dropdown + + , toggle: function (e) { + var $this = $(this) + , $parent + , isActive + + if ($this.is('.disabled, :disabled')) return + + $parent = getParent($this) + + isActive = $parent.hasClass('open') + + clearMenus() + + if (!isActive) { + if ('ontouchstart' in document.documentElement) { + // if mobile we we use a backdrop because click events don't delegate + $('