The data of the four global catalogs used in this study are stored in text files which can be read using Pandas in Python. The easiest way to make them available in Python is to import Pandas using the following command import pandas as pd and then reading in the data using GCMT_catalog = pd.read_csv('GCMT_catalog.txt', delimiter=',') USGS_catalog = pd.read_csv('USGS_catalog.txt', delimiter=',') GFZ_catalog = pd.read_csv('GFZ_catalog.txt', delimiter=',') CMT3D_catalog = pd.read_csv('CMT3D_catalog.txt', delimiter=',') This yields a dataframe for each moment tensor catalog with columns - event name - date - time - latitude - longitude - depth - Mrr - Mtt - Mpp - Mrt - Mrp - Mtp as reported in the catalogs. For the GCMT catalog - the only one reporting errors in the moment tensor elements -, the following columns are also included: - MrrError - MttError - MppError - MrtError - MrpError - MtpError To determine whether a focal mechanism belongs to the same event in all of the four catalogs, the following script was used: import obspy GCMT_catalog['datetime'] = pd.to_datetime(GCMT_catalog['date'] + GCMT_catalog['time'], format='%Y-%m-%d%H:%M:%S.%f') USGS_catalog['datetime'] = pd.to_datetime(USGS_catalog['date'] + USGS_catalog['time'].str.replace('Z', ''), format='%Y-%m-%d%H:%M:%S.%f') GFZ_catalog['datetime'] = pd.to_datetime(GFZ_catalog['date'] + GFZ_catalog['time'], format='%Y-%m-%d%H:%M:%S.%f') CMT3D_catalog['datetime'] = pd.to_datetime(CMT3D_catalog['date'] + CMT3D_catalog['time'], format='%Y-%m-%d%H:%M:%S.%f') indices = [] for i in range(len(CMT3D_catalog)): if i%1000==0: print (i) event = CMT3D_catalog.iloc[i] datetime = event['datetime'] latitude = event['latitude'] longitude = event['longitude'] magnitude = event['magnitude'] if (len(GFZ_catalog.loc[(abs(GFZ_catalog['datetime']-datetime).dt.total_seconds()<=60) & (obspy.geodetics.base.locations2degrees(latitude,longitude,GFZ_catalog['latitude'],GFZ_catalog['longitude'])<=1) & (abs(GFZ_catalog['magnitude']-magnitude)<=0.5)])==1) and \ (len(USGS_catalog.loc[(abs(USGS_catalog['datetime']-datetime).dt.total_seconds()<=60) & (obspy.geodetics.base.locations2degrees(latitude,longitude,USGS_catalog['latitude'],USGS_catalog['longitude'])<=1) & (abs(USGS_catalog['magnitude']-magnitude)<=0.5)])==1) and \ (len(GCMT_catalog.loc[(abs(GCMT_catalog['datetime']-datetime).dt.total_seconds()<=60) & (obspy.geodetics.base.locations2degrees(latitude,longitude,GCMT_catalog['latitude'],GCMT_catalog['longitude'])<=1) & (abs(GCMT_catalog['magnitude']-magnitude)<=0.5)])==1): indices.append([GCMT_catalog.loc[(abs(GCMT_catalog['datetime']-datetime).dt.total_seconds()<=60) & (obspy.geodetics.base.locations2degrees(latitude,longitude,GCMT_catalog['latitude'],GCMT_catalog['longitude'])<=1)].index.values[0], \ USGS_catalog.loc[(abs(USGS_catalog['datetime']-datetime).dt.total_seconds()<=60) & (obspy.geodetics.base.locations2degrees(latitude,longitude,USGS_catalog['latitude'],USGS_catalog['longitude'])<=1)].index.values[0], \ GFZ_catalog.loc[(abs(GFZ_catalog['datetime']-datetime).dt.total_seconds()<=60) & (obspy.geodetics.base.locations2degrees(latitude,longitude,GFZ_catalog['latitude'],GFZ_catalog['longitude'])<=1)].index.values[0], \ i]) This script selects earthquakes based on their origin time, epicentral distance and magnitude, and provides a list of indices for the corresponding events in each catalog.