Menu Close

The seismic moment tensor is becoming a standard for description of earthquake kinematic source processes in the whole range of magnitudes. Seismic moment tensor inversion allows to estimate the fault plane parameters and the balance between volumetric and non-volumetric strain in the seismic source. The resolved seismic moment tensors are typically decomposed into volumetric and deviatoric components using various decomposition schemes allowing to understand the detailed physical kinematic processes occurring in the sources regardless of the type of seismicity as well as regardless of its size.

We provide the community with hybridMT moment tensor inversion and refinement software package for MATLAB/shell environment. The command line tool (Windows/Linux) focimt and its MATLAB wrapper focimt.m  (which are both described shortly in a separate page) allow performing unconstrained full, deviatoric and double-couple constrained seismic moment tensor inversions in time domain. The output data may be exported in ASCII format or as MATLAB cell/structure arrays. Also, the output may be exported to a graphical representation of seismic moment tensors in a form of “beach ball” plots. The seismic moment tensors may be refined using hybridmt.m routine when earthquakes form a cluster. The package was thoroughly tested with synthetic data, acoustic emission data from laboratory experiments as well as induced seismicity data from geothermal sites.


Grzegorz Kwiatek and Patricia Martínez-Garzón

hybridMT package is licensed under GNU General Public License (GPL).


When you find hybridMT package useful, please refer to it in your work:

Kwiatek, G., Martínez-Garzón, P., and M. Bohnhoff (2016). HybridMT: A MATLAB/Shell Environment Package for Seismic Moment Tensor Inversion and Refinement. Seismol. Res. Lett. 87 (4), DOI: 10.1785/0220150251.


Download hybridMT software package

Current version of hybridMT package is 1.6.2 that was published on April 26th, 2023. The hybridMT package may be requested by filling the online form below. After submitting the form, the email will be sent to You with a download link (please check your spam folder if the email will not appear in your mail box after a couple of minutes).

    Your Name (required)

    Your Email (required)

    Affiliation (Optional)


    The hybridMT package contains documentation that directly integrates with MATLAB help system (as MATLAB documentation is composed of HTML documents, it can be also open in any web browser). In addition, the PDF documentation is provided in package. Also, you can download the PDF documentation separately from here:

    Documentation of hybridMT moment tensor inversion and refinement package

    File size: 1.7 MB | File version: 1.0 | Downloaded: 152

    Finally, there is a FAQ section just below.


    • What is the magnitude limit for application of fociMT or hybridMT algorithms?
      • The fociMT algorithm is point-source moment tensor inversion and the fault rupture processes (e.g. directivity or spatial changes in elementary moment tensors) are NOT considered. As such, the algorithm is valid for events with simple source time functions that can be represented by a single pulse. Therefore, it is suggested to use the algorithm for events with moment magnitudes not exceeding Mw 4.

    • Should focal mechanisms (or moment tensors) I intend to refine altogether with hybridMT technique be similar?
      • No. There is no requirement that input data come from earthquakes displaying similar focal mechanism. The hybridMT refinement method is NOT based on empirical Green’s function technique, where this requirement is imposed. Actually, the larger the variability of focal mechanism, the better refinement of seismic moment tensors is generally expected.

    • Is your method for refining seismic moment tensor based on empirical Green’s function technique?
      • Shortly speaking, no. The moment tensor refinement method used in hybridMT algorithm is NOT using the concept of empirical Green’s function technique, although the refinement of seismic moment tensors is also achieved by suppressing the propagation effects (similarly to EGF method). As such, none of EGF assumptions (i.e. similarity of focal mechanisms forming the cluster) is not relevant for hybridMT refinement.

    • What is the “omega” parameter in the focimt input file and how to calculate it?
      • focimt_seismogram“omega” parameter which is a part of ASCII input file is basically the area below the first P-wave ground displacement pulse (in time domain) or equivalently the spectral level taken from the amplitude spectrum of ground displacement pulse. The unit of “omega” parameter is [m * s] (meter times second), and it comes from the fact that we multiply the amplitude of first P-wave pulse using ground displacement seismogram in [m] by the half of duration of the first P-wave pulse in [s]. Regardless of whether time or frequency domain was used to extract the “omega” value, the parameter should contain the sign information. The sign of “omega” is in accordance with the seismological convention, i.e. it is positive for the positive first P-wave ground displacement amplitude (i.e. ground motion AWAY from the seismic source) and negative otherwise (ground motion TOWARDS the seismic source).

        In case of simple impulsive source time functions it is typically not necessary to calculate the integral of ground displacement first P-wave pulse. Instead, the amplitude D (cf. picture) including sign information of first P-wave pulse may be taken from ground displacement seismogram (the seismogram should be calibrated to [m]) and multiplied by the the rise time (i.e. time interval between the P-wave onset and P-wave amplitude, t_max-t_ons in seconds [s]). In this case, the integral of the pulse is simply replaced by the area of the triangle.

    • What full moment tensor decomposition scheme is used in focimt.m?
      • The MATLAB wrapper focimt.m has no option for changing the decomposition scheme, which is currently fixed to Jost and Herrmann’s (1989) approach. However, the focimt application has implemented an alternative decomposition scheme based on Vavrycuk’s (2001) approach. In focimt application this is specified by option -d D or -d Y (see the documentation of focimt application for details). Therefore, the hardcoded decomposition scheme in focimt.m may be changed from Jost and Herrmann’s to Vavrycuk’s approach simply by changing the following line from (note change from “D” to “Y” in option -d):

        commandline = ['-i ' temp '.txt -d DWAFTUMVE -o ' temp ' -s ' solutions ' -n ' normfunc ' ' bbsize ' ' bbformat ' ' bbproj ' ' jacknife ' ' bootstrap ' ' vmodel ' ' ball];


        commandline = ['-i ' temp '.txt -d YWAFTUMVE -o ' temp ' -s ' solutions ' -n ' normfunc ' ' bbsize ' ' bbformat ' ' bbproj ' ' jacknife ' ' bootstrap ' ' vmodel ' ' ball];

        Future version of focimt.m implement the decomposition switch parameter.

    • How should I provide takeoff angle in RAW ASCII file format?
      • focimt_coordinatesThe takeoff angle is measured in degrees from dowgoing ray (towards the center of Earth) direction. The seismic ray leaving the source purely up (towards the Earth surface) has takeoff angle of 180 degrees. The ray leaving earthquake source towards center of Earth has a takeoff angle of 0 degrees.

    • What is the azimuth convention for RAW ASCII file format?
      • The azimuth of a vector from the seismic hypocenter to the seismic station is measured in degrees, and it is positive from north towards east. 0,90,180, and 270 degrees corresponds to the station located North, East, South, and West from the earthquake hypocenter.

    • What is the incidence angle convention for RAW ASCII input file?
      • focimt_coordinatesThe angle of incidence in RAW ASCII input file follows the standard seismological convention. The angle of incidence to the sensor is measured in degrees from down direction (towards center of Earth). In other words, the seismic ray pointing directly up (perpendicular towards the surface) has 0 degrees incidence angle and pure horizontal ray (parallel to the surface) has 90 degrees incidence angle.

        Note #1: In case of pure horizontal ray (incidence = 90) one should not expect P-wave arrival to be visible on vertical component. Phases with incidence angle = 90 degrees should be disregarded from processing.

        Note #2: Large values of incidence angle (>80 degrees) leads to high corrections for “omega” parameter, as the “omega” is divided by the cosine of the angle of incidence. This typically leads to overestimation of total and scalar seismic moment, as well as it may influence the moment tensor decomposition.

    • Why I get error message on “incorrect expression or statement” when running drawhudsonnet.m or drawstereonet.m?
      • If you get error similar to this:

        >> drawhudsonnet;
        ??? Error: File: drawhudsonnet.m Line: 119 Column: 3
        Expression or statement is incorrect--possibly unbalanced (, {, or [.

        it is likely due to the fact that your version of MATLAB does not support empty output arguments that are specified in MATLAB as “~” (tilde character). If possible, please update your MATLAB to the newest version that handles empty output arguments. Alternatively, please change every null output variable “~” to any valid and not used variable name, e.g. “dummy”:

        [~,DD] = eig(M);


        [dummy,DD] = eig(M);

        This problem will be resolved in future version of hybridMT.

    • Why I receive error messages “Argument ‘###’ failed validation with error: ####”
      • Consider a scenario of executing the drawstereonet.m function:

        [X,Y] = drawstereonet([10 20 30 40],[50 60 70 80]);
        ??? Error using ==> drawstereonet at 43
        Argument 'AZM' failed validation with error:
        Undefined function or method 'ismatrix' for input arguments of type 'double'.

        This error results from the fact your MATLAB version does not contain ismatrix() routine. If it is possible, please update the MATLAB to the newest version. Alternatively, you can try to disable the validation routine. In case of example above, by changing line:

        p.addOptional('AZM', [], @(x) ismatrix(x) && isnumeric(x) );


        p.addOptional('AZM', [], @(x) isnumeric(x) );