Falcon Noise AnalysisΒΆ

The noise in the Falcon-style (dual-complement, single-disc) airborne gravity gradiometer is well characterised by the difference noise. Thus the noise in each component is half the standard deviation of the difference between complements):

\[N_{NE}=0.5\,\sigma\left(A_{NE}-B_{NE}\right)\]
\[N_{UV}=0.5\,\sigma\left(A_{UV}-B_{UV}\right)\]

where \(A_{NE}\) is the \(NE\) component of the gravity gradient as measured by the \(A\) complement, and similarly for \(A_{UV}\), \(B_{NE}\), and \(B_{UV}\). It is also useful to check for excess high frequency signal, and to check for any demodulation phase error as described below.

We will use the Canobie Falcon data for these examples so ensure you have run the Prepare_XYZ notebook first so that these data are prepared for review.


Import the required modules, set the path to the geowhizz files and list the channels.

from pathlib import Path
import galileoQC as qc
data_root = r'./CanobieData/'
canobieHDF_file = Path(data_root + r'Canobie.hdf5')
qc.reportChannels(canobieHDF_file)
---------------------------------------------------------------------------
FileNotFoundError                         Traceback (most recent call last)
Cell In[3], line 1
----> 1 qc.reportChannels(canobieHDF_file)

File ~/.local/lib/python3.12/site-packages/galileoQC/whizzFiles/reportData.py:158, in reportChannels(whizzFile, channel, verbose)
    134 """
    135 Prints a short summary of the channel names in a HDF5 Whizz file.
    136 
   (...)    154 
    155 """
    156 filename = str(whizzFile)
--> 158 with h5py.File(filename, 'r') as f:
    160     whizzHeader = list(f.keys())[0]
    161     g = f[whizzHeader]        

File ~/.local/lib/python3.12/site-packages/h5py/_hl/files.py:555, in File.__init__(self, name, mode, driver, libver, userblock_size, swmr, rdcc_nslots, rdcc_nbytes, rdcc_w0, track_order, fs_strategy, fs_persist, fs_threshold, fs_page_size, page_buf_size, min_meta_keep, min_raw_keep, locking, alignment_threshold, alignment_interval, meta_block_size, track_times, **kwds)
    546     fapl = make_fapl(driver, libver, rdcc_nslots, rdcc_nbytes, rdcc_w0,
    547                      locking, page_buf_size, min_meta_keep, min_raw_keep,
    548                      alignment_threshold=alignment_threshold,
    549                      alignment_interval=alignment_interval,
    550                      meta_block_size=meta_block_size,
    551                      **kwds)
    552     fcpl = make_fcpl(track_order=track_order, track_times=track_times,
    553                      fs_strategy=fs_strategy, fs_persist=fs_persist,
    554                      fs_threshold=fs_threshold, fs_page_size=fs_page_size)
--> 555     fid = make_fid(name, mode, userblock_size, fapl, fcpl, swmr=swmr)
    557 if isinstance(libver, tuple):
    558     self._libver = libver

File ~/.local/lib/python3.12/site-packages/h5py/_hl/files.py:232, in make_fid(name, mode, userblock_size, fapl, fcpl, swmr)
    230     if swmr:
    231         flags |= h5f.ACC_SWMR_READ
--> 232     fid = h5f.open(name, flags, fapl=fapl)
    233 elif mode == 'r+':
    234     fid = h5f.open(name, h5f.ACC_RDWR, fapl=fapl)

File h5py/_objects.pyx:54, in h5py._objects.with_phil.wrapper()
---> 54 'Could not get source, probably due dynamically evaluated source code.'

File h5py/_objects.pyx:55, in h5py._objects.with_phil.wrapper()
---> 55 'Could not get source, probably due dynamically evaluated source code.'

File h5py/h5f.pyx:106, in h5py.h5f.open()
--> 106 'Could not get source, probably due dynamically evaluated source code.'

FileNotFoundError: [Errno 2] Unable to synchronously open file (unable to open file: name = 'CanobieData/Canobie.hdf5', errno = 2, error message = 'No such file or directory', flags = 0, o_flags = 0)

The diffNoiseVturb function plots the difference noise for each survey line against the turbulence for that line. Higher turbulence generally results in higher noise and the plot allows one to decide on a reasonable turbulence limit for the data. In addition, flight-lines with a difference noise that is off the general trend (high noise at low turbulence) should be questioned even if they meet specification.

In this example, we get very low noise estimates and there are no data off-trend.

The usual error_spec is \(5\,E\) but here we have set it to \(2.5\,E\) in order to force an error message, purely for an example. You can see that lines that fail the set specification are labeled on the plot.

qc.diffNoiseVturb(canobieHDF_file, eNE='Noise_NE', eUV='Noise_UV', turbulence='TURBULENCE',
                  error_spec=2.5, labelLines=True)
../_images/3fe70e5e3d9531e51d19821920909a588d04b1bfd2166018b080093651f55c23.png
100060.000 fails with noise 2.80 > 2.5, mean turbulence = 0.66.

Any rectification process can down-convert high frequency vibration into the signal band of a sensor. Gravity gradiometers have an intrinsic rectification process via their sensitivity to products of rotational velocity so it is useful to check for excess high frequency signal since it may lead to error in the final data.

The function checkHighFreq checks for unusually high amplitude, high frequency signal in the raw gradient channels. The input gradient channels are high-pass filtered and a rolling standard deviation is used to find periods of higher amplitudes. High turbulence is sometimes associated with high frequency noise so the turbulence is also plotted for comparison.

Experience with Falcon data suggests that sections of data where checkHighFreq finds high frequency noise above \(15\,E\) are of concern and ought to be followed up with the service provider.

A plot showing where the high frequency noise occurs along line is shown for all lines that have excess high frequency signal. The Canobie data do not have any high frequency noise problems, so the noiseLimit has been artifically set here to \(6.5\,E\) just to get a plot for the example.

qc.checkHighFreq(canobieHDF_file, noiseLimit=6.5, 
                 channels=['ANE_TC_2p67', 'AUV_TC_2p67', 'BNE_TC_2p67', 'BUV_TC_2p67'], 
                 cutoffs=[0.15, 3.6], vertaccel='TURBULENCE', verbose=True, plot_flag=True)
Checked 6 lines; 1 line had high frequency signal above 6.5.
Line 100030.000: peak HF noise in ANE_TC_2p67 = 6.9.
../_images/bbf8a9a20add284b6d6f8751f2894eb5bab2e4e726b3494423de5772a622d787.png