instrument correction database


I am working with data from a Kinemetrics FBA-11 accelerometer network. I have used detrend(‘demean’) to remove drift but it seems that there are still artifacts from the instrument. I want to use instrument correction in obspy and I am wondering if there is a central database that provides the needed PAZ etc?

Many thanks


Happy New Year.

There is PDCC, IRIS’s Java-based metadata management tool:

This uses a central database called the Nominal Response Library.

or visit gempa GmbH’s SMP web-based tool:

Kind Regards from New York,

You can also directly access the IRIS NRL (nominal response library) through this URL:

Thank you both very much and a happy new year!

I've used the resp file you mentioned, found at
and it looks much better: I'm interested in displacement (FBA-11
accelerometers on 6th and 8th floor of a building). If I detrend the
stream and integrate twice (without correction) I get

If I now use instrument correction:

seedresp = {'filename':
            'date': UTCDateTime("2007-08-09T07:57:49Z"),
            'units': 'DIS' # Units to return response in ('DIS', 'VEL' or ACC)}

the new plot I get is which looks much
better. However, this is still not correct. There is an animation
available for the this data stream

and it moves much more before it returns to its starting position than
one sees in

Many thanks for your help!

Hi John,

looks like blown up low frequency noise to me. Try lowering the water
level (e.g. 60, 30 or even down to 10) and/or pre-filtering in frequency
domain (to the part of the spectrum that is of interest, use option
Set the parameters for your Stream.simulate() call, you can look up the
options at the corresponding low level function here:


I am now prefiltering:

fl1 = 0
fl2 = 0.45
fl3 = 5.
fl4 = 500.
and use water_level=60.

What confuses is me is that calling Stream.simulate() with seedresp
set to units: 'VEL' and subsequently calling Stream.integrate() to get
the DIStance, gives something completely different than calling
Stream.simulate() with seedresp set to units: 'DIS'.

with units 'VEL':
with units 'VEL' after Stream.integrate():
with units 'DIS':

I can't say what is going wrong for you (with just pictures) but i can
say that it works in principle when using correct response information
and proper options and pre/post-processing:

#!/usr/bin/env python
from obspy import read
import matplotlib.pyplot as plt

kwargs = dict(water_level=60, pre_filt=(1, 3, 20, 30))

tr = read()[0]
tr.simulate(seedresp={"filename": "RESP.BW.RJOB..EHZ", "units": "DIS"},
tr.filter(type="highpass", freq=0.1)

tr = read()[0]
tr.simulate(seedresp={"filename": "RESP.BW.RJOB..EHZ", "units": "VEL"},
tr.filter(type="highpass", freq=0.1)

tr = read()[0]
tr.simulate(seedresp={"filename": "RESP.BW.RJOB..EHZ", "units": "ACC"},
tr.filter(type="highpass", freq=0.1)

The necessary response can be prepared as RESP like:
obspy-dataless2resp dataless.seed.BW_RJOB

I assume there is something wrong with your processing chain and the
response information you put together (e.g. digitizer?). You should end
up in m/s or m and your numbers are a bit high for that.


That was extremely helpful, thx! I now end up with (nearly) the same plot after correcting either directly for DIS or alternatively for ACC and then integrating twice ( However, I’m still dubious about the actual numbers: the data is from a Kinemetrics FBA-11 acclerometer on the 6th floor of a building, hence they are way too high to make sense in meters?

My goal is to simply reproduce the animation

with obspy. I’m using the resp file from and the

data which is from an earthquake with ML=4.6 that was 30km away so I don’t see where things are going wrong.

Hello John,

Just a wild thought that you might have already dealt with, but did you include the sensitivity of the digitizer in your resp file (Volts/count)? I think the NRL response library assumes a digitizer with a unity sensitivity(1 Volt/count). You could always find the digitizer you are using in the NRL and include that piece into stage 2 of your resp file.


Hi John,

You also need to know the gain in counts/V of the digitizer and account for that. Right now you’re only correcting for the sensor…


Thx! That must be it, the NRL resp file was indeed using 1V/count. However, all says is that they are Quanterra 4128s digitizers and according to the NRL response library these can be user configured. Is there any way I can find out what setting was used from the SAC files on
Another basic question: incorporating the digitizer gain would only affect the amplitude however the resp files about the digitzers at NRL seem to have much more information about response coefficients. Wouldn’t I have to include this information as well?

Hi John,

The only way to figure out digitizer settings without meta-data (such as a dataless SEED or stationXML file) is to contact the original deployer and ask, however, you are in luck. These data are also archived at the IRIS DMC so you can get the full meta-data there. Go to this link, select any of the stations, then select “view RESP”…


Thanks Renate, that’s brilliant! I’m now using the RESP file from but I’m getting a warning from Obspy:

WARNING: FIR normalized: sum[coef]=9.781111E-01; FA FABD 6N HNE

While the shape looks good, I’m dubious about the amplitude numbers…the maximum change of position during the event on the 6th floor would have only been 0.6mm?
(The first row is uncorrected data, the 2nd instrument corrected for ACC with RESP and the third instrument corrected for DIS with RESP)
The (obs)python code I used is