diff --git a/biosppy/plotting.py b/biosppy/plotting.py index 2e4177a8..0447b448 100644 --- a/biosppy/plotting.py +++ b/biosppy/plotting.py @@ -1820,6 +1820,187 @@ def plot_pcg(ts=None, else: # close plt.close(fig) + +def plot_egm(ts=None, + raw=None, + filtered=None, + rhythm=None, + active_regions=None, + ts_windowed = None, + windowed = None, + lat_index=None, + lat=None, + df = None, + freqs = None, + power = None, + entropy = None, + oi = None, + ri = None, + units=None, + path=None, + show=False): + """Create a summary plot from the output of signals.egm.egm. + + Parameters + ---------- + ts : array + Signal time axis reference (seconds). + raw : array + Raw EGM signal. + filtered : array + Filtered EGM signal. + rhythm : str + Rhythm of the EGM signal. Must be 'sinus' or 'af'. + active_regions : array + Active regions of the EGM signal. + ts_windowed : array, optional + Signal time axis reference (seconds) for windowed signal. + windowed : array, optional + Windowed EGM signal. + act : int, optional + Index corresponding to the activation time of the EGM signal. + lat : float, optional + Activation time in milliseconds (ms). + df : float, optional + Dominant frequency of the EGM signal (Hz). + freqs : array, optional + Frequencies of the dominant frequency spectrum. + power : array, optional + Power of the dominant frequency spectrum. + entropy : float, optional + Entropy of the EGM signal. + oi : float, optional + Organization index of the EGM signal. + ri : float, optional + Regularity index of the EGM signal. + units : str, optional + Units of the vertical axis. If provided, the plot title will include + the units information. Default is None. + path : str, optional + If provided, the plot will be saved to the specified file. + show : bool, optional + If True, show the plot immediately. + + """ + # get matplotlib parameters + plt.rcParams.update(_get_params()) + + if rhythm == 'sinus': + attr = 'Sinus Rhythm' + elif rhythm == 'af': + attr = 'Atrial Fibrillation' + + fig = plt.figure(figsize=(12, 5)) + fig.suptitle('EGM Summary - ' + attr, fontsize=12, fontweight='bold') + gs = gridspec.GridSpec(6, 2) + fig.subplots_adjust(top=0.88, bottom=0.12, hspace=0.9, wspace=0.3, + left=0.1, right=0.96) + + # signal + ax1 = fig.add_subplot(gs[:4, 0]) + ax1.set_title('Signal') + + ax1.plot(ts, raw, linewidth=MED_LW, label='Raw', + color=color_palette('blue')) + ax1.plot(ts, filtered+np.mean(raw), linewidth=MINOR_LW, label='Filtered', + color=color_palette('dark-red')) + + ax1.set_ylabel('Amplitude' if units is None else 'Amplitude (%s)' % units) + ax1.legend(loc='upper right') + ax1.tick_params(axis='x', which='both', bottom=False, top=False, + labelbottom=False) + ax1.spines['bottom'].set_visible(False) + + # filtered signal + ax2 = fig.add_subplot(gs[4:8, 0], sharex=ax1) + ax2.set_title('Active EGM regions') + + ymin = np.min(filtered) + ymax = np.max(filtered) + alpha = 0.1 * (ymax - ymin) + ymax += alpha + ymin -= alpha + + ax2.plot(ts, filtered, linewidth=MED_LW, color=color_palette('blue')) + ax2.plot(ts, active_regions*max(filtered), linewidth=MINOR_LW, + color=color_palette('dark-red')) + ax2.set_ylabel('Amplitude' if units is None else 'Amplitude (%s)' % units) + ax2.tick_params(axis='x', which='both', bottom=False, top=False, + labelbottom=False) + ax2.spines['bottom'].set_visible(False) + + # align y axis labels + fig.align_ylabels([ax1, ax2]) + + if rhythm == 'sinus': + # activation time + ax4 = fig.add_subplot(gs[1:5, 1]) + ax4.set_title('Activation Time') + + if windowed is not None: + egm_windowed = windowed + else: + egm_windowed = filtered + ts_windowed = ts + + ymin = np.min(egm_windowed) + ymax = np.max(egm_windowed) + alpha = 0.1 * (ymax - ymin) + ymax += alpha + ymin -= alpha + + + + ax4.plot(ts_windowed, egm_windowed, linewidth=MINOR_LW, color=color_palette('blue')) + ax4.plot(ts_windowed[int(lat_index)], egm_windowed[int(lat_index)], label='Activation Time = ' + '%.2f' % lat + ' ms', marker='o', markersize=4, color=color_palette('dark-red')) + ax4.set_ylabel('Amplitude' if units is None else 'Amplitude (%s)' % units) + ax4.legend(loc='upper right') + ax4.set_xlabel('Time (s)') + + elif rhythm == 'af': + + ax3 = fig.add_subplot(gs[0:4, 1]) + egm_windowed = filtered + ymin = np.min(egm_windowed) + ymax = np.max(egm_windowed) + alpha = 0.1 * (ymax - ymin) + ymax += alpha + ymin -= alpha + + ax3.plot(freqs,power, linewidth=MINOR_LW, color=color_palette('blue')) + ax3.axvline(df,linewidth=MINOR_LW, color=color_palette('dark-red')) + ax3.text(df+0.5, max(power)/2,'Dominant Frequency = ' + '%.2f' % df + ' Hz') + ax3.set_ylabel('Power') + ax3.set_xlim(0, 20) + ax3.set_xlabel('Frequency (Hz)') + + # text below ax4 left side + ax5 = fig.add_subplot(gs[4:5, 1]) + ax5.text(0, 0, 'Entropy = %.2f' % entropy) + ax5.text(0, -1, 'Organization Index = %.2f' % oi) + ax5.text(0, -2, 'Regularity Index = %.2f' % ri) + ax5.axis('off') + + + # add logo + add_logo(fig) + + # save to file + if path is not None: + path = utils.normpath(path) + root, ext = os.path.splitext(path) + ext = ext.lower() + if ext not in ['png', 'jpg']: + path = root + '.png' + + fig.savefig(path, dpi=200, bbox_inches='tight') + + # show + if show: + plt.show() + else: + # close + plt.close(fig) def _plot_rates(thresholds, rates, variables, diff --git a/biosppy/signals/egm.py b/biosppy/signals/egm.py new file mode 100644 index 00000000..dfa351e5 --- /dev/null +++ b/biosppy/signals/egm.py @@ -0,0 +1,925 @@ +# -*- coding: utf-8 -*- +""" +biosppy.signals.egm +------------------- + +This module provides methods to process intracardiac EGM (Electrogram) signals. + +:copyright: (c) 2015-2016 by Instituto de Telecomunicacoes +:license: BSD 3-clause, see LICENSE for more details. +""" +# 3rd party +import numpy as np +import scipy +import matplotlib.pyplot as plt +import inspect +import warnings + +# local +from .. import plotting, utils + + +def egm(signal=None, sampling_rate=1000., type = 'bipolar', rhythm = None, woi=None, reference=None, method = 'nleo', threshold=None, show=True): + """ Process intracardiac EGM (Electrogram) signals. + The outputs of this function depend on the rhythm of the EGM signal. + + Parameters + ---------- + signal : array + An array with the EGM signal. + sampling_rate : int, float, optional + Sampling frequency (Hz) of the EGM signal (default is 1000 Hz). + type : str, optional + Type of EGM signal. Must be 'bipolar' or 'unipolar' (default is 'bipolar'). + rhythm : str + Rhythm of the EGM signal. Must be 'sinus' or 'af'. + woi : array, optional + Window of interest as [from, to] in samples. If provided, the EGM signal will be cropped to this window. + reference : int, optional + Reference sample index for the window of interest. If provided, the window will be centered around this reference. + method : str, optional + Method to calculate activation time. Must be 'nleo', 'dvdt', 'max', or 'min' (default is 'nleo'). + threshold : float, optional + Threshold for the NLEO signal. If provided, the NLEO signal will be thresholded. + show : bool, optional + If True, show a summary plot. + + Returns + ---------- + ts : array + Signal time axis reference (seconds). + filtered : array + Filtered EGM signal. + active_regions : array + Active regions of the EGM signal. + ts_windowed : array + Time axis reference for the windowed EGM signal (seconds). + windowed : array + Windowed EGM signal. + lat_index : int + Index corresponding to the activation time of the EGM signal. + lat : float + Activation time in milliseconds. + df : float + Dominant frequency (Hz). + freqs : array + Frequencies of dominant frequency spectrum (Hz). + power : array + Power of dominant frequency spectrum. + entropy : float + Shannon entropy of the EGM signal. + oi : float + Organization index of the EGM signal. + ri : array + Regularity index of the EGM signal. + """ + + warnings.filterwarnings("ignore") + + # check inputs + if signal is None: + raise TypeError("Please specify an input signal.") + + if type is None or type not in ['bipolar', 'unipolar']: + raise ValueError("Invalid type. Must be 'bipolar' or 'unipolar'.") + + if rhythm is None or rhythm not in ['sinus', 'af']: + raise ValueError("Invalid rhythm. Must be 'sinus' or 'af'.") + + # ensure numpy + signal = np.array(signal) + + sampling_rate = float(sampling_rate) + + # set outputs + + windowed = None + ts_windowed = None + lat_index = None + lat = None + df = None + freqs = None + spectrum = None + entropy = None + organization = None + regularity = None + + # filter signal + + if type == 'bipolar': + # bandpass filter for bipolar signals + lowcut = 30.0 + highcut = 300.0 + order = 4 + b, a = scipy.signal.butter(order, [lowcut, highcut], btype='band', fs=sampling_rate) + filtered_signal = scipy.signal.filtfilt(b, a, signal) + + else: + # bandpass filter for unipolar signals + lowcut = 0.05 + highcut = 600.0 + order = 4 + b, a = scipy.signal.butter(order, [lowcut, highcut], btype='band', fs=sampling_rate) + filtered_signal = scipy.signal.filtfilt(b, a, signal) + + # get active regions + _, _, nleo_threshold, _, _ = nleo(filtered_signal, sampling_rate=sampling_rate, plot=False) + + if rhythm == 'sinus': + + # calculate activation time using specified method + methods = { + 'nleo': nleo_lat, + 'dvdt': dvdt_lat, + 'max': max_lat, + 'min': min_lat + } + + if method not in methods: + raise ValueError("Invalid method. Must be 'nleo', 'dvdt','max', or 'min'.") + + lat_index, lat = call_lat_method(lat_method=methods[method], filtered_signal=filtered_signal, sampling_rate=sampling_rate, woi=woi, reference=reference, plot=False) + + else: + # for atrial fibrillation, calculate dominant frequency, entropy, organization index, and regularity index + + df, freqs, spectrum = dominant_frequency(filtered_signal, sampling_rate=sampling_rate, plot=False) + + entropy, = shannon_entropy(filtered_signal, sampling_rate=sampling_rate, plot=False) + + organization, = organization_index(filtered_signal, sampling_rate=sampling_rate) + + regularity, = regularity_index(filtered_signal, sampling_rate=sampling_rate) + + + if woi is not None: + windowed, = get_woi(signal, int(woi[0]), int(woi[1]), int(reference)) + ts_windowed = np.linspace(0, (len(windowed)-1)/sampling_rate, len(windowed), endpoint=True) + + # get time vectors + length = len(signal) + T = (length - 1) / sampling_rate + ts = np.linspace(0, T, length, endpoint=True) + + args = [ts, filtered_signal, nleo_threshold, ts_windowed, windowed, lat_index, lat, df, freqs, spectrum, entropy, organization, regularity] + names = ['ts', 'filtered', 'active_regions', 'ts_windowed', 'windowed', 'lat_index', 'lat', 'df', 'freqs', 'power', 'entropy', 'oi', 'ri'] + + warnings.resetwarnings() + + if show: + plotting.plot_egm(ts=ts, + raw=signal, + filtered=filtered_signal, + rhythm=rhythm, + active_regions=nleo_threshold, + ts_windowed=ts_windowed, + windowed = windowed, + lat_index=lat_index, + lat=lat, + df = df, + freqs = freqs, + power = spectrum, + entropy = entropy, + oi = organization, + ri = regularity, + units=None, + path=None, + show=show) + + return utils.ReturnTuple(args, names) + +def call_lat_method(lat_method, filtered_signal, sampling_rate, verbose=False, **kwargs): + + """Checks **kwargs against valid optional parameters for the selected method + and calls it with the valid arguments. + + Parameters + ---------- + lat_method : function + The method to calculate activation time (e.g., 'nleo_activation_time'). + filtered_signal : array + The preprocessed EGM signal to analyze. + sampling_rate : float + The sampling frequency of the EGM signal. + woi : list, optional + Window of interest as [from, to] in samples. If provided, the EGM signal will be cropped to this window. + reference : int, optional + Reference sample index for the window of interest. If provided, the window will be centered around this reference. + plot : bool, optional + If True, plots the EGM signal with activation time marked. + **kwargs : dict + Additional keyword arguments to pass to the activation time method. + + Returns + ------- + lat_index : int + Index corresponding to the activation time of the EGM signal. + lat : float + Activation time in milliseconds. If woi is provided, time is centered in the window. + """ + + sig = inspect.signature(lat_method) + allowed_args = sig.parameters.keys() + valid_args = {kwarg: val for kwarg, val in kwargs.items() if kwarg in allowed_args} + if verbose: + print(f"Passed valid parameters for activation method: {lat_method}: {valid_args}") + lat_index, lat = lat_method( + signal=filtered_signal, sampling_rate=sampling_rate, **valid_args + ) + return (lat_index, lat) + + + + + +def get_woi(signal, woi_from, woi_to, reference=None): + """ + Extracts a window of interest (WOI) from the EGM signal. + + Parameters: + ---------- + signal : array + An array with the EGM signal. + woi_from : int + Starting index of the window of interest. + woi_to : int + Ending index of the window of interest. + reference : int, optional + Reference sample index for the window of interest. If provided, the window will be centered around this reference. + + Returns: + ---------- + egm_woi : array + The EGM signal cropped to the window of interest. + """ + + if reference is not None: + idx_from = reference + woi_from + idx_to = reference + woi_to + else: + idx_from = woi_from + idx_to = woi_to + + return utils.ReturnTuple((signal[idx_from:idx_to],), + ('egm_woi',)) + +def nleo_lat(signal=None, sampling_rate=1000., woi = None, reference = None, plot=False): + + """ + Calculate the NLEO (Non-Linear Energy Operator) and activation times from EGM signals. + + Parameters: + ---------- + egm : np.ndarray + An array with the EGM signal. + sampling_rate : int, float, optional + Sampling frequency (Hz). + woi : list, optional + Window of interest as [from, to] in samples. If provided, the EGM signal will be cropped to this window. + reference : int, optional + Reference sample index for the window of interest. If provided, the window will be centered around this reference. + plot : bool, optional + If True, plots the EGM signal with activation time marked. + + Returns: + ---------- + nleo : np.ndarray + The NLEO of the EGM signal. + nleo_filt : np.ndarray + The low-pass filtered NLEO. + lat_index : np.ndarray + Activation time corresponding to the EGM signal. + """ + + warnings.warn("Activation time can only be calculated for sinus rhythm signals.") + + _, _, _,lat_index, lat = nleo(signal, sampling_rate, woi=woi, reference=reference, plot=plot) + + return utils.ReturnTuple((lat_index, lat), + ('lat_index', 'lat')) + + +def nleo(signal=None, sampling_rate=1000., woi = None, reference = None, threshold = None, plot=False): + """ + Calculate activation time based on the NLEO (Non-Linear Energy Operator) method. + + Parameters: + ---------- + signal : array + An array with the EGM signal. + sampling_rate : int, float, optional + Sampling frequency (Hz) of the EGM signal (default is 1000 Hz). + woi : list, optional + Window of interest as [from, to] in samples. If provided, the EGM signal will be cropped to this window. + reference : int, optional + Reference sample index for the window of interest. If provided, the window will be centered around this reference. + plot : bool, optional + If True, plots the EGM signal with activation time marked. + + Returns: + ---------- + nleo : array + The NLEO of the EGM signal. + nleo_filt : array + The low-pass filtered NLEO. + nleo_threshold : array + The thresholded NLEO signal. + lat_index : int + Index corresponding to the activation time of the EGM signal. + lat : float + Activation time in milliseconds. If woi is provided, time is centered in the window. + """ + + if woi is not None: + signal, = get_woi(signal, int(woi[0]), int(woi[1]), int(reference)) + + egm_squared = signal**2 + egm_rs = signal[1:] + egm_ls = signal[:-1] + + # top and tail signals + egm_squared = egm_squared[1:-1] + egm_rs = egm_rs[1:] + egm_ls = egm_ls[:-1] + + # calculate nleo + nleo = egm_squared - (egm_rs * egm_ls) + + # add zeros to beginning and end + nleo = np.concatenate(([0], nleo, [0])) + + # low-pass filter (zero phase) + cutoff = 24 # Hz + order = 8 + b, a = scipy.signal.butter(order, cutoff, btype='low', fs = sampling_rate) + nleo_filt = scipy.signal.filtfilt(b, a, nleo) + + if threshold is None: + P1 = np.percentile(abs(nleo_filt), 5) + P2 = np.percentile(abs(nleo_filt), 95) + threshold = P1 + 0.2 * (P2) + nleo_threshold = np.zeros_like(nleo_filt) + nleo_threshold[abs(nleo_filt) >= threshold] = 1 + + # remove non-active parts shorter than 30 samples + min_inactive_length = 30 + inactive_regions = np.where(nleo_threshold == 0)[0] + diff_inactive = np.diff(inactive_regions) + split_indices = np.where(diff_inactive > 1)[0] + start_idx = 0 + for split_idx in split_indices: + region = inactive_regions[start_idx:split_idx + 1] + if len(region) < min_inactive_length: + nleo_threshold[region] = 1 + start_idx = split_idx + 1 + # check last region + region = inactive_regions[start_idx:] + if len(region) < min_inactive_length: + nleo_threshold[region] = 1 + + # activation time + x = np.linspace(1, len(nleo_filt), len(nleo_filt)) + auc = scipy.integrate.cumulative_trapezoid(nleo_filt, x, initial=0) + lat_index = np.interp(auc[-1] / 2, auc, x) + + # convert to time + lat = lat_index / sampling_rate * 1000 # convert to milliseconds + # center in window + # if woi is not None: + # lat = lat - woi[0] # center in window + + if plot: + + time = np.arange(len(signal)) / sampling_rate + plt.plot(time, signal, label='Signal') + plt.plot(time[int(lat_index)], signal[int(lat_index)], label='Activation Time', marker='o', markersize=8, color='red') + plt.tight_layout() + plt.show() + + + return utils.ReturnTuple((nleo, nleo_filt, nleo_threshold, lat_index, lat), + ('nleo', 'nleo_filt', 'nleo_threshold', 'lat_index', 'lat')) + + + +def dvdt_lat(signal=None, sampling_rate=1000., woi = None, reference = None, plot=False): + + """ + Calculate activation time based on maximum negative dv/dt from EGM signal. + + Parameters: + ---------- + signal : array + An array with the EGM signal. + sampling_rate : int, float, optional + Sampling frequency (Hz) of the EGM signal (default is 1000 Hz). + woi : list, optional + Window of interest as [from, to] in samples. If provided, the EGM signal will be cropped to this window. + reference : int, optional + Reference sample index for the window of interest. If provided, the window will be centered around this reference. + plot : bool, optional + If True, plots the EGM signal with activation time marked. + + Returns: + ---------- + lat_index : int + Index corresponding to the activation time of the EGM signal. + lat : float + Activation time in milliseconds. If woi is provided, time is centered in the window. + """ + + warnings.warn("Activation time can only be calculated for sinus rhythm signals.") + + if woi is not None: + signal, = get_woi(signal, int(woi[0]), int(woi[1]), int(reference)) + + # compute dv/dt + dvdt = np.gradient(signal) + + # get activation time as index of maximum -dv/dt + lat_index = np.argmax(-dvdt) + + # convert to time + lat = lat_index / sampling_rate * 1000 # convert to milliseconds + # center in window + # if woi is not None: + # lat = lat - woi[0] # center in window + + if plot: + time = np.arange(len(signal)) / sampling_rate + plt.plot(time, signal, label='Signal') + plt.plot(time[lat_index], signal[lat_index], label='Activation Time', marker='o', markersize=8, color='red') + plt.tight_layout() + plt.show() + + return utils.ReturnTuple((lat_index, lat), + ('lat_index', 'lat')) + + + +def max_lat(signal=None, sampling_rate=1000., woi = None, reference = None, plot=False): + """ + Calculate activation time based on maximum amplitude from EGM signal. + + Parameters: + ---------- + signal : array + An array with the EGM signal. + sampling_rate : int, float, optional + Sampling frequency (Hz) of the EGM signal (default is 1000 Hz). + woi : list, optional + Window of interest as [from, to] in samples. If provided, the EGM signal will be cropped to this window. + reference : int, optional + Reference sample index for the window of interest. If provided, the window will be centered around this reference. + plot : bool, optional + If True, plots the EGM signal with activation time marked. + + Returns: + ---------- + lat_index : int + Index corresponding to the activation time of the EGM signal. + lat : float + Activation time in milliseconds. If woi is provided, time is centered in the window. + """ + + warnings.warn("Activation time can only be calculated for sinus rhythm signals.") + + if woi is not None: + signal, = get_woi(signal, int(woi[0]), int(woi[1]), int(reference)) + + # get activation time as index of maximum amplitude + lat_index = np.argmax(signal) + + # convert to time + lat = lat_index / sampling_rate * 1000 # convert to milliseconds + # center in window + # if woi is not None: + # lat = lat - woi[0] # center in window + + if plot: + time = np.arange(len(signal)) / sampling_rate + plt.plot(time, signal, label='EGM Signal') + plt.plot(time[lat_index], signal[lat_index], label='Activation Time', marker='o', markersize=8, color='red') + plt.tight_layout() + plt.show() + + return utils.ReturnTuple((lat_index, lat), + ('lat_index', 'lat')) + +def min_lat(signal=None, sampling_rate=1000., woi = None, reference = None, plot=False): + """ + Calculate activation time based on minimum amplitude from EGM signal. + + Parameters: + ---------- + signal : array + An array with the EGM signal. + sampling_rate : int, float, optional + Sampling frequency (Hz) of the EGM signal (default is 1000 Hz). + woi : list, optional + Window of interest as [from, to] in samples. If provided, the EGM signal will be cropped to this window. + reference : int, optional + Reference sample index for the window of interest. If provided, the window will be centered around this reference. + plot : bool, optional + If True, plots the EGM signal with activation time marked. + + Returns: + ---------- + lat_index : int + Index corresponding to the activation time of the EGM signal. + lat : float + Activation time in milliseconds. If woi is provided, time is centered in the window. + """ + + warnings.warn("Activation time can only be calculated for sinus rhythm signals.") + + if woi is not None: + signal, = get_woi(signal, int(woi[0]), int(woi[1]), int(reference)) + + # get activation time as index of minimum amplitude + lat_index = np.argmin(signal) + + # convert to time + lat = lat_index / sampling_rate * 1000 # convert to milliseconds + # center in window + # if woi is not None: + # lat = lat - woi[0] # center in window + + if plot: + time = np.arange(len(signal)) / sampling_rate + plt.plot(time, signal, label='EGM Signal') + plt.plot(time[lat_index], signal[lat_index], label='Activation Time', marker='o', markersize=8, color='red') + plt.tight_layout() + plt.show() + + return utils.ReturnTuple((lat_index, lat), + ('lat_index', 'lat')) + +def get_activation_times(signals=None, sampling_rate=1000., woi=None, reference=None, method='nleo'): + """ + Calculate activation times for multiple EGM signals. + + Parameters: + ---------- + signals : array + A 2D array where each row is an EGM signal. + sampling_rate : int, float, optional + Sampling frequency (Hz) of the EGM signals (default is 1000 Hz). + woi : list, optional + Window of interest as [from, to] in samples. If provided, each EGM signal will be cropped to this window. + reference : int, optional + Reference sample index for the window of interest. If provided, the window will be centered around this reference. + + Returns: + lat_indexes : int + Indexes corresponding to the activation times of each EGM signal. + lats : float + Activation times in milliseconds. If woi is provided, time is centered in the window. + """ + + warnings.warn("Activation time can only be calculated for sinus rhythm signals.") + + n_signals = signals.shape[0] + lat_idx = np.zeros(n_signals) + lat_times = np.zeros(n_signals) + + for i in range(n_signals): + if method == 'nleo': + _, _, lat_index, lat = nleo_lat(signals[i, :], sampling_rate, woi=woi, reference=reference) + elif method == 'dvdt': + lat_index, lat = dvdt_lat(signals[i, :], sampling_rate, woi=woi, reference=reference) + elif method == 'max': + lat_index, lat = max_lat(signals[i, :], sampling_rate, woi=woi, reference=reference) + elif method == 'min': + lat_index, lat = min_lat(signals[i, :], sampling_rate, woi=woi, reference=reference) + else: + raise ValueError("Invalid method. Must be 'nleo', 'dvdt','max', or 'min'.") + lat_idx[i] = lat_index + lat_times[i] = lat + return utils.ReturnTuple((lat_idx, lat_times), + ('lat_indexes', 'lats')) + +def compare_activation_times(signal=None, sampling_rate=1000., woi=None, reference=None, plot=False): + """ + Compare activation times calculated by different methods for a single EGM signal. + + Parameters: + ---------- + signal : array + An array with the EGM signal. + sampling_rate : int, float, optional + Sampling frequency (Hz) of the EGM signal (default is 1000 Hz). + woi : list, optional + Window of interest as [from, to] in samples. If provided, the EGM signal will be cropped to this window. + reference : int, optional + Reference sample index for the window of interest. If provided, the window will be centered around this reference. + plot : bool, optional + If True, plots the EGM signal with activation times marked. + + Returns: + ---------- + lat_index_nleo : int + Index corresponding to the activation time from NLEO method. + lat_index_dvdt : int + Index corresponding to the activation time from -dv/dt method. + lat_index_max : int + Index corresponding to the activation time from maximum amplitude method. + lat_index_min : int + Index corresponding to the activation time from minimum amplitude method. + lat_nleo : float + Activation time in milliseconds from NLEO method. + lat_dvdt : float + Activation time in milliseconds from -dv/dt method. + lat_max : float + Activation time in milliseconds from maximum amplitude method. + lat_min : float + Activation time in milliseconds from minimum amplitude method. + """ + + warnings.warn("Activation time can only be calculated for sinus rhythm signals.") + + # run all methods + lat_index_nleo, lat_nleo = nleo_lat(signal, sampling_rate, woi=woi, reference=reference) + lat_index_dvdt, lat_dvdt = dvdt_lat(signal, sampling_rate, woi=woi, reference=reference) + lat_index_max, lat_max = max_lat(signal, sampling_rate, woi=woi, reference=reference) + lat_index_min, lat_min = min_lat(signal, sampling_rate, woi=woi, reference=reference) + + if plot: + if woi is not None: + signal, = get_woi(signal, int(woi[0]), int(woi[1]), int(reference)) + time = np.arange(len(signal)) / sampling_rate + plt.figure() + plt.plot(time, signal, label='Signal') + plt.plot(time[int(lat_index_nleo)], signal[int(lat_index_nleo)], label='NLEO Activation Time', marker='o', markersize=8) + plt.plot(time[int(lat_index_dvdt)], signal[int(lat_index_dvdt)], label='-dv/dt Activation Time', marker='o', markersize=8) + plt.plot(time[int(lat_index_max)], signal[int(lat_index_max)], label='Max Amplitude Activation Time', marker='o', markersize=8) + plt.plot(time[int(lat_index_min)], signal[int(lat_index_min)], label='Min Amplitude Activation Time', marker='o', markersize=8) + plt.legend() + plt.tight_layout() + plt.show() + + return utils.ReturnTuple((lat_index_nleo, lat_index_dvdt, lat_index_max, lat_index_min, lat_nleo, lat_dvdt, lat_max, lat_min), + ('lat_index_nleo', 'lat_index_dvdt', 'lat_index_max', 'lat_index_min', 'lat_nleo', 'lat_dvdt', 'lat_max', 'lat_min')) + +def get_voltage(signal=None, woi=None, reference=None): + """ + Get the maximum voltage of the EGM signal. + + Parameters: + ---------- + signal : array + An array with the EGM signal. + woi : list, optional + Window of interest as [from, to] in samples. If provided, the EGM signal will be cropped to this window. + reference : int, optional + Reference sample index for the window of interest. If provided, the window will be centered around this reference. + + Returns: + ---------- + voltage : float + The maximum voltage of the EGM signal. + """ + warnings.filterwarnings("ignore") + + idx, _ = max_lat(signal, woi=woi, reference=reference) + + warnings.resetwarnings() + + if woi is not None: + signal, = get_woi(signal, int(woi[0]), int(woi[1]), int(reference)) + voltage = signal[int(idx)] + + + + return utils.ReturnTuple((voltage,), + ('voltage',)) + +def get_voltages(signals=None, woi=None, reference=None): + """ + Get the maximum voltages for multiple EGM signals. + + Parameters: + ---------- + signals : array + A 2D array where each row is an EGM signal. + woi : list, optional + Window of interest as [from, to] in samples. If provided, each EGM signal will be cropped to this window. + reference : int, optional + Reference sample index for the window of interest. If provided, the window will be centered around this reference. + + Returns: + ---------- + voltages : array + An array of maximum voltages for each EGM signal. + """ + + n_signals = signals.shape[0] + voltages = np.zeros(n_signals) + + for i in range(n_signals): + voltage_temp = get_voltage(signals[i, :], woi=woi, reference=reference) + voltages[i] = voltage_temp + + return utils.ReturnTuple((voltages,), + ('voltages',)) + +def dominant_frequency(signal=None, sampling_rate=1000., plot=False): + """ + Get the dominant frequency of the EGM signal. + + Parameters: + ---------- + signal : array + An array with the EGM signal. + sampling_rate : int, float, optional + Sampling frequency (Hz) of the EGM signal (default is 1000 Hz). + plot : bool, optional + If True, plots the power spectral density of the EGM signal. + + Returns: + ---------- + dominant_freq : float + The dominant frequency of the EGM signal in Hz. + fft_freqs : array + The frequencies of the power spectral density of the dominant frequency spectrum. + psd : array + The power spectral density of the dominant frequency spectrum. + """ + warnings.warn("Dominant frequency can only be calculated for atrial fibrillation signals.") + + # Butterworth IIR bandpass filter between 40 and 250 Hz + lowcut = 40.0 + highcut = 250.0 + order = 8 + b, a = scipy.signal.butter(order, [lowcut, highcut], btype='band', fs=sampling_rate) + signal = scipy.signal.filtfilt(b, a, signal) + + # signal rectification + signal = np.abs(signal) + + # Butterworth IIR low-pass filter with cutoff frequency of 20 Hz + cutoff = 20.0 + b, a = scipy.signal.butter(order, cutoff, btype='low', fs=sampling_rate) + signal = scipy.signal.filtfilt(b, a, signal) + + # compute fft with zero padding to next power of 2 + n = len(signal) + nfft = 2**np.ceil(np.log2(n)).astype(int) + # pad signal + signal = np.pad(signal, (0, nfft - n), mode='constant') + from scipy.signal.windows import hann + from scipy.fft import fft, fftfreq + w = hann(nfft) + fft_vals = fft(signal*w) + + # sample spacing + T = 1.0 / sampling_rate + fft_freqs = fftfreq(nfft, T)[:nfft // 2] + fft_vals = fft_vals[:nfft // 2] + psd = 2.0 / (nfft * T) * np.abs(fft_vals)**2 + + # get dominant frequency between 3 and 10 Hz + idx = np.where((fft_freqs >= 3) & (fft_freqs <= 10)) + psd_max = psd[idx] + fft_freqs_max = fft_freqs[idx] + dominant_freq = fft_freqs_max[np.argmax(psd_max)] + + if plot: + plt.figure() + plt.plot(fft_freqs, psd) + plt.xlabel('Frequency (Hz)') + plt.ylabel('Power Spectral Density') + plt.axvline(dominant_freq, color='r', linestyle='--', label='Dominant Frequency = ' + '%.2f' % dominant_freq + " Hz") + plt.legend() + plt.xlim(0, 20) + plt.show() + + + return utils.ReturnTuple((dominant_freq, fft_freqs, psd), + ('dominant_freq', 'fft_freqs', 'psd')) + +def shannon_entropy(signal=None, sampling_rate=1000., plot=False): + """ + Calculate Shannon entropy of the EGM signal. + + Parameters: + ---------- + signal : array + An array with the EGM signal. + sampling_rate : int, float, optional + Sampling frequency (Hz) of the EGM signal (default is 1000 Hz). + plot : bool, optional + If True, plots the histogram of the EGM signal voltages. + + Returns: + ---------- + shannon_entropy : float + Shannon entropy of the EGM signal. + """ + + # histogram with binsize of 0.01 mV + bins = np.arange(np.min(signal), np.max(signal), 0.01) + counts, bins = np.histogram(signal, bins=bins) + + # calculate Shannon entropy. If counts = 0, probability = 0 + probabilities = counts / np.sum(counts) + probabilities = probabilities[probabilities != 0] + entropy = -np.sum(probabilities * np.log2(probabilities)) + + if plot: + plt.figure() + plt.stairs(counts, bins) + plt.xlabel('Bins') + plt.ylabel('Probability') + plt.text(np.mean(bins), np.max(counts), 'Entropy = ' + '%.2f' % entropy) + plt.show() + + return utils.ReturnTuple((entropy,), + ('shannon_entropy',)) + + +def organization_index(signal=None, sampling_rate=1000.): + """ + Calculate organization index of the EGM signal. + + Parameters: + ---------- + signal : array + An array with the EGM signal. + sampling_rate : int, float, optional + Sampling frequency (Hz) of the EGM signal (default is 1000 Hz). + + Returns: + ---------- + organization_index : float + Organization index of the EGM signal. + """ + + df, freqs, spectrum = dominant_frequency(signal, sampling_rate=sampling_rate, plot=False) + + if df >= 10: + raise ValueError("Dominant frequency is greater than 10 Hz. Organization index cannot be calculated.") + + # get area under power spectrum for df plus and minus 0.75 Hz + idx = np.where((freqs >= df - 0.75) & (freqs <= df + 0.75)) + spectrum1 = spectrum[idx] + area1 = scipy.integrate.trapezoid(spectrum1) + + # get area under power spectrum for first harmonic of df plus and minus 0.75 Hz + idx = np.where((freqs >= 2 * df - 0.75) & (freqs <= 2 * df + 0.75)) + spectrum2 = spectrum[idx] + area2 = scipy.integrate.trapezoid(spectrum2) + + # get area under power spectrum for second harmonic of df plus and minus 0.75 Hz + idx = np.where((freqs >= 3 * df - 0.75) & (freqs <= 3 * df + 0.75)) + spectrum3 = spectrum[idx] + area3 = scipy.integrate.trapezoid(spectrum3) + + # get area between 3 and 20 Hz + idx = np.where((freqs >= 3) & (freqs <= 20)) + spectrum_total = spectrum[idx] + area_total = scipy.integrate.trapezoid(spectrum_total) + + # calculate organization index + oi = (area1 + area2 + area3) / area_total + + return utils.ReturnTuple((oi,), + ('organization_index',)) + +def regularity_index(signal=None, sampling_rate=1000.): + """ + Calculate regularity index of the EGM signal. + + Parameters: + ---------- + signal : array + An array with the EGM signal. + sampling_rate : int, float, optional + Sampling frequency (Hz) of the EGM signal (default is 1000 Hz). + + Returns: + ---------- + regularity_index : float + Regularity index of the EGM signal. + """ + + df, freqs, spectrum = dominant_frequency(signal, sampling_rate=sampling_rate, plot=False) + + if df >= 10: + raise ValueError("Dominant frequency is greater than 10 Hz. Regularity index cannot be calculated.") + + # get area under power spectrum for df plus and minus 0.75 Hz + idx = np.where((freqs >= df - 0.75) & (freqs <= df + 0.75)) + spectrum1 = spectrum[idx] + area1 = scipy.integrate.trapezoid(spectrum1) + + # get area between 3 and 20 Hz + idx = np.where((freqs >= 3) & (freqs <= 20)) + spectrum_total = spectrum[idx] + area_total = scipy.integrate.trapezoid(spectrum_total) + + # calculate regularity index + ri = area1 / area_total + + return utils.ReturnTuple((ri,), + ('regularity_index',)) \ No newline at end of file diff --git a/examples/egm_bipolar_af.txt b/examples/egm_bipolar_af.txt new file mode 100644 index 00000000..07017142 --- /dev/null +++ b/examples/egm_bipolar_af.txt @@ -0,0 +1,2503 @@ +# Simple Text Format +# Sampling Rate (Hz):= 1000.00 +# Units:= mV +0.000000 +-0.021000 +-0.030000 +-0.054000 +-0.090000 +-0.114000 +-0.120000 +-0.129000 +-0.162000 +-0.180000 +-0.171000 +-0.120000 +-0.081000 +-0.054000 +-0.036000 +-0.027000 +-0.009000 +-0.003000 +0.009000 +0.000000 +0.003000 +0.012000 +0.024000 +0.018000 +0.015000 +-0.003000 +-0.018000 +-0.054000 +-0.078000 +-0.114000 +-0.147000 +-0.162000 +-0.171000 +-0.174000 +-0.162000 +-0.156000 +-0.138000 +-0.123000 +-0.105000 +-0.087000 +-0.072000 +-0.051000 +-0.042000 +-0.021000 +0.000000 +0.012000 +0.018000 +0.027000 +0.030000 +0.036000 +0.036000 +0.036000 +0.039000 +0.030000 +0.024000 +0.027000 +0.018000 +0.024000 +0.021000 +0.018000 +0.015000 +0.015000 +0.009000 +0.015000 +0.012000 +0.024000 +0.018000 +0.021000 +0.006000 +0.009000 +0.012000 +0.009000 +0.009000 +0.006000 +0.009000 +0.009000 +0.003000 +0.006000 +0.003000 +0.006000 +-0.003000 +0.000000 +-0.003000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.006000 +0.003000 +0.006000 +0.012000 +0.012000 +0.012000 +0.018000 +0.024000 +0.036000 +0.036000 +0.039000 +0.036000 +0.033000 +0.039000 +0.036000 +0.045000 +0.054000 +0.051000 +0.063000 +0.066000 +0.060000 +0.066000 +0.072000 +0.075000 +0.081000 +0.099000 +0.105000 +0.117000 +0.117000 +0.111000 +0.072000 +0.060000 +-0.015000 +-0.342000 +-0.636000 +-0.966000 +-1.197000 +-1.260000 +-1.086000 +-1.032000 +-1.116000 +-1.209000 +-1.032000 +-0.699000 +-0.267000 +0.183000 +0.582000 +0.957000 +0.918000 +0.639000 +0.870000 +1.059000 +0.882000 +0.675000 +0.576000 +0.525000 +0.504000 +0.507000 +0.477000 +0.441000 +0.405000 +0.369000 +0.333000 +0.279000 +0.228000 +0.165000 +0.108000 +0.072000 +0.042000 +0.012000 +-0.003000 +-0.033000 +-0.069000 +-0.093000 +-0.117000 +-0.138000 +-0.150000 +-0.168000 +-0.186000 +-0.186000 +-0.180000 +-0.162000 +-0.162000 +-0.147000 +-0.138000 +-0.138000 +-0.135000 +-0.132000 +-0.111000 +-0.093000 +-0.090000 +-0.063000 +-0.060000 +-0.036000 +-0.033000 +-0.042000 +-0.036000 +-0.039000 +-0.042000 +-0.036000 +-0.021000 +-0.018000 +-0.003000 +0.021000 +0.039000 +0.060000 +0.072000 +0.105000 +0.132000 +0.156000 +0.183000 +0.198000 +0.216000 +0.216000 +0.210000 +0.171000 +0.132000 +0.105000 +0.075000 +0.051000 +0.057000 +0.060000 +0.051000 +0.042000 +0.027000 +0.009000 +-0.012000 +-0.042000 +-0.057000 +-0.075000 +-0.084000 +-0.096000 +-0.102000 +-0.108000 +-0.105000 +-0.099000 +-0.102000 +-0.117000 +-0.144000 +-0.177000 +-0.192000 +-0.195000 +-0.183000 +-0.168000 +-0.150000 +-0.117000 +-0.090000 +-0.075000 +-0.054000 +-0.045000 +-0.036000 +-0.030000 +-0.027000 +-0.024000 +-0.015000 +-0.009000 +0.003000 +0.000000 +0.006000 +0.009000 +0.003000 +0.018000 +0.024000 +0.027000 +0.024000 +0.030000 +0.033000 +0.039000 +0.045000 +0.048000 +0.042000 +0.042000 +0.039000 +0.036000 +0.033000 +0.030000 +0.030000 +0.030000 +0.024000 +0.027000 +0.024000 +0.030000 +0.030000 +0.027000 +0.027000 +0.030000 +0.036000 +0.042000 +0.051000 +0.069000 +0.081000 +0.084000 +0.102000 +0.090000 +0.063000 +0.054000 +0.066000 +-0.045000 +-0.351000 +-0.564000 +-0.723000 +-0.876000 +-0.873000 +-0.819000 +-0.720000 +-0.732000 +-0.711000 +-0.693000 +-0.408000 +-0.072000 +0.354000 +0.570000 +0.669000 +0.744000 +0.672000 +0.669000 +0.945000 +0.951000 +0.744000 +0.432000 +0.360000 +0.243000 +0.162000 +0.177000 +0.159000 +0.114000 +0.078000 +0.027000 +-0.012000 +-0.045000 +-0.075000 +-0.090000 +-0.096000 +-0.114000 +-0.111000 +-0.105000 +-0.105000 +-0.123000 +-0.147000 +-0.144000 +-0.102000 +-0.042000 +-0.012000 +-0.030000 +-0.057000 +-0.066000 +-0.099000 +-0.096000 +-0.105000 +-0.123000 +-0.123000 +-0.126000 +-0.111000 +-0.102000 +-0.087000 +-0.057000 +-0.030000 +-0.015000 +0.000000 +0.018000 +0.036000 +0.048000 +0.072000 +0.063000 +0.036000 +0.021000 +-0.015000 +-0.030000 +-0.063000 +-0.033000 +0.015000 +0.048000 +0.060000 +0.057000 +0.069000 +0.072000 +0.087000 +0.090000 +0.099000 +0.102000 +0.102000 +0.099000 +0.102000 +0.105000 +0.105000 +0.102000 +0.105000 +0.105000 +0.111000 +0.108000 +0.108000 +0.105000 +0.123000 +0.141000 +0.153000 +0.171000 +0.174000 +0.186000 +0.189000 +0.192000 +0.204000 +0.216000 +0.234000 +0.246000 +0.246000 +0.231000 +0.216000 +0.183000 +0.162000 +0.162000 +0.135000 +0.096000 +0.072000 +0.027000 +-0.027000 +-0.072000 +-0.075000 +-0.072000 +-0.075000 +-0.123000 +-0.150000 +-0.168000 +-0.192000 +-0.216000 +-0.243000 +-0.270000 +-0.318000 +-0.360000 +-0.387000 +-0.426000 +-0.438000 +-0.432000 +-0.435000 +-0.420000 +-0.384000 +-0.336000 +-0.279000 +-0.222000 +-0.168000 +-0.126000 +-0.090000 +-0.057000 +-0.033000 +-0.015000 +0.000000 +0.018000 +0.042000 +0.051000 +0.069000 +0.090000 +0.096000 +0.108000 +0.108000 +0.117000 +0.144000 +0.156000 +0.153000 +0.153000 +0.141000 +0.111000 +0.078000 +0.006000 +-0.348000 +-0.708000 +-0.747000 +-0.822000 +-0.939000 +-0.942000 +-0.804000 +-0.708000 +-0.615000 +-0.561000 +-0.324000 +-0.114000 +0.144000 +0.372000 +0.693000 +0.852000 +1.014000 +1.008000 +0.798000 +0.537000 +0.777000 +0.870000 +0.744000 +0.489000 +0.372000 +0.279000 +0.168000 +0.168000 +0.177000 +0.111000 +0.075000 +0.039000 +0.009000 +0.000000 +-0.039000 +-0.057000 +-0.096000 +-0.123000 +-0.147000 +-0.159000 +-0.171000 +-0.168000 +-0.171000 +-0.177000 +-0.177000 +-0.162000 +-0.159000 +-0.147000 +-0.144000 +-0.138000 +-0.102000 +-0.069000 +-0.012000 +0.036000 +0.072000 +0.060000 +0.054000 +0.021000 +0.003000 +0.000000 +0.009000 +-0.003000 +-0.015000 +-0.012000 +-0.003000 +0.003000 +0.006000 +-0.003000 +-0.012000 +-0.021000 +-0.021000 +-0.036000 +-0.021000 +-0.015000 +0.009000 +0.036000 +0.045000 +0.054000 +0.066000 +0.069000 +0.048000 +0.033000 +0.006000 +-0.018000 +-0.021000 +-0.009000 +0.003000 +0.024000 +0.042000 +0.057000 +0.054000 +0.057000 +0.060000 +0.051000 +0.045000 +0.057000 +0.051000 +0.045000 +0.039000 +0.039000 +0.042000 +0.036000 +0.039000 +0.045000 +0.036000 +0.051000 +0.063000 +0.075000 +0.078000 +0.066000 +0.042000 +0.030000 +0.030000 +0.012000 +0.000000 +-0.033000 +-0.057000 +-0.093000 +-0.111000 +-0.108000 +-0.102000 +-0.093000 +-0.081000 +-0.078000 +-0.066000 +-0.054000 +-0.042000 +-0.039000 +-0.030000 +-0.027000 +-0.015000 +-0.009000 +0.003000 +0.012000 +0.021000 +0.030000 +0.036000 +0.045000 +0.048000 +0.048000 +0.057000 +0.054000 +0.057000 +0.057000 +0.054000 +0.054000 +0.045000 +0.048000 +0.042000 +0.039000 +0.033000 +0.027000 +0.027000 +0.036000 +0.036000 +0.060000 +0.069000 +0.057000 +0.060000 +0.084000 +0.096000 +0.096000 +0.051000 +-0.183000 +-0.501000 +-0.522000 +-0.594000 +-0.624000 +-0.501000 +-0.462000 +-0.552000 +-0.690000 +-0.798000 +-0.858000 +-0.678000 +-0.498000 +-0.243000 +-0.072000 +0.132000 +0.294000 +0.438000 +0.396000 +0.855000 +1.179000 +1.158000 +0.915000 +0.567000 +0.405000 +0.363000 +0.354000 +0.294000 +0.255000 +0.219000 +0.171000 +0.084000 +-0.009000 +-0.099000 +-0.171000 +-0.225000 +-0.243000 +-0.249000 +-0.240000 +-0.240000 +-0.216000 +-0.207000 +-0.180000 +-0.171000 +-0.192000 +-0.249000 +-0.288000 +-0.297000 +-0.249000 +-0.177000 +-0.132000 +-0.087000 +-0.039000 +-0.003000 +0.027000 +0.057000 +0.114000 +0.147000 +0.177000 +0.171000 +0.150000 +0.156000 +0.141000 +0.150000 +0.120000 +0.108000 +0.093000 +0.090000 +0.087000 +0.084000 +0.084000 +0.090000 +0.099000 +0.084000 +0.072000 +0.048000 +0.030000 +0.012000 +-0.027000 +-0.054000 +-0.081000 +-0.075000 +-0.066000 +-0.087000 +-0.078000 +-0.054000 +-0.036000 +-0.030000 +-0.051000 +-0.054000 +-0.051000 +-0.039000 +-0.036000 +-0.054000 +-0.039000 +-0.030000 +-0.030000 +-0.042000 +-0.039000 +-0.003000 +0.024000 +0.057000 +0.087000 +0.111000 +0.123000 +0.141000 +0.138000 +0.129000 +0.111000 +0.111000 +0.096000 +0.093000 +0.084000 +0.078000 +0.066000 +0.054000 +0.042000 +0.033000 +0.024000 +0.006000 +0.000000 +-0.006000 +-0.009000 +-0.009000 +-0.012000 +-0.015000 +-0.015000 +-0.024000 +-0.027000 +-0.018000 +-0.015000 +-0.012000 +-0.012000 +-0.012000 +-0.012000 +-0.006000 +-0.006000 +-0.009000 +-0.006000 +-0.012000 +-0.009000 +-0.009000 +-0.015000 +-0.009000 +-0.006000 +-0.009000 +-0.006000 +-0.003000 +-0.003000 +0.003000 +0.006000 +0.000000 +0.009000 +0.015000 +0.006000 +0.000000 +-0.027000 +-0.066000 +-0.120000 +-0.135000 +-0.147000 +-0.126000 +-0.087000 +-0.015000 +0.057000 +0.123000 +0.153000 +0.135000 +0.081000 +0.033000 +0.024000 +0.033000 +0.054000 +0.051000 +0.048000 +0.078000 +0.087000 +0.093000 +0.099000 +0.102000 +0.105000 +0.069000 +0.066000 +0.114000 +0.162000 +0.162000 +0.213000 +0.243000 +0.207000 +-0.003000 +-0.318000 +-0.534000 +-0.591000 +-0.501000 +-0.426000 +-0.513000 +-0.651000 +-0.648000 +-0.303000 +0.243000 +0.483000 +0.141000 +0.288000 +0.249000 +0.126000 +0.066000 +0.066000 +0.057000 +0.054000 +0.033000 +0.003000 +-0.036000 +-0.063000 +-0.063000 +-0.057000 +-0.093000 +-0.162000 +-0.231000 +-0.228000 +-0.180000 +-0.117000 +-0.051000 +-0.012000 +-0.003000 +0.000000 +0.015000 +0.003000 +0.000000 +-0.009000 +-0.003000 +-0.015000 +-0.015000 +-0.012000 +-0.024000 +-0.015000 +-0.006000 +0.000000 +0.015000 +0.027000 +0.042000 +0.051000 +0.063000 +0.072000 +0.102000 +0.114000 +0.120000 +0.123000 +0.132000 +0.135000 +0.144000 +0.144000 +0.141000 +0.132000 +0.108000 +0.093000 +0.084000 +0.060000 +0.039000 +0.024000 +0.003000 +-0.012000 +-0.027000 +-0.042000 +-0.045000 +-0.048000 +-0.021000 +-0.003000 +0.003000 +0.021000 +0.021000 +0.018000 +0.021000 +0.024000 +0.024000 +0.024000 +0.021000 +0.003000 +-0.009000 +-0.003000 +0.012000 +0.021000 +0.030000 +0.036000 +0.024000 +0.012000 +-0.006000 +-0.021000 +-0.027000 +-0.021000 +-0.015000 +-0.021000 +-0.015000 +-0.018000 +-0.012000 +-0.021000 +-0.018000 +-0.024000 +-0.033000 +-0.039000 +-0.057000 +-0.063000 +-0.063000 +-0.045000 +-0.036000 +-0.027000 +-0.018000 +-0.009000 +-0.003000 +0.000000 +0.012000 +0.015000 +0.021000 +0.021000 +0.024000 +0.027000 +0.021000 +0.021000 +0.021000 +0.021000 +0.015000 +0.009000 +-0.009000 +-0.027000 +-0.045000 +-0.066000 +-0.087000 +-0.066000 +-0.042000 +-0.018000 +-0.015000 +0.021000 +0.078000 +0.132000 +0.171000 +0.195000 +0.234000 +0.228000 +0.210000 +0.180000 +0.144000 +0.108000 +0.069000 +0.060000 +0.045000 +0.015000 +-0.003000 +-0.015000 +-0.012000 +-0.012000 +0.000000 +-0.057000 +-0.159000 +-0.252000 +-0.285000 +-0.276000 +-0.240000 +-0.177000 +-0.114000 +-0.057000 +-0.039000 +-0.015000 +-0.006000 +-0.015000 +0.000000 +0.030000 +0.012000 +-0.027000 +-0.132000 +-0.423000 +-0.597000 +-0.729000 +-0.765000 +-0.570000 +-0.474000 +-0.483000 +-0.555000 +-0.552000 +-0.354000 +-0.048000 +0.153000 +0.135000 +0.063000 +0.387000 +0.726000 +0.633000 +0.585000 +0.567000 +0.474000 +0.417000 +0.381000 +0.336000 +0.294000 +0.279000 +0.252000 +0.219000 +0.216000 +0.210000 +0.201000 +0.204000 +0.192000 +0.174000 +0.144000 +0.108000 +0.081000 +0.051000 +0.018000 +-0.012000 +-0.039000 +-0.063000 +-0.081000 +-0.084000 +-0.090000 +-0.090000 +-0.093000 +-0.090000 +-0.090000 +-0.084000 +-0.078000 +-0.081000 +-0.078000 +-0.078000 +-0.075000 +-0.069000 +-0.060000 +-0.051000 +-0.036000 +-0.030000 +-0.021000 +-0.018000 +-0.009000 +0.000000 +0.003000 +0.015000 +0.021000 +0.012000 +0.000000 +-0.006000 +0.000000 +0.003000 +0.003000 +-0.006000 +-0.006000 +-0.018000 +-0.027000 +-0.021000 +-0.042000 +-0.045000 +-0.069000 +-0.075000 +-0.066000 +-0.060000 +-0.057000 +-0.048000 +-0.045000 +-0.051000 +-0.054000 +-0.048000 +-0.051000 +-0.054000 +-0.048000 +-0.036000 +-0.024000 +-0.006000 +0.018000 +0.066000 +0.105000 +0.123000 +0.129000 +0.120000 +0.108000 +0.084000 +0.051000 +0.018000 +0.015000 +0.012000 +0.009000 +-0.006000 +-0.024000 +-0.048000 +-0.045000 +0.000000 +0.039000 +0.066000 +0.081000 +0.093000 +0.144000 +0.162000 +0.186000 +0.201000 +0.213000 +0.228000 +0.234000 +0.234000 +0.210000 +0.168000 +0.120000 +0.069000 +0.024000 +-0.012000 +-0.057000 +-0.078000 +-0.093000 +-0.117000 +-0.123000 +-0.135000 +-0.144000 +-0.168000 +-0.180000 +-0.183000 +-0.171000 +-0.156000 +-0.135000 +-0.120000 +-0.111000 +-0.087000 +-0.063000 +-0.051000 +-0.018000 +-0.006000 +0.006000 +0.018000 +0.030000 +0.033000 +0.039000 +0.060000 +0.081000 +0.087000 +0.084000 +0.036000 +-0.033000 +-0.183000 +-0.393000 +-0.534000 +-0.579000 +-0.624000 +-0.747000 +-0.720000 +-0.678000 +-0.690000 +-0.684000 +-0.639000 +-0.549000 +-0.237000 +0.021000 +0.222000 +0.333000 +0.315000 +0.252000 +0.072000 +-0.195000 +0.078000 +0.495000 +0.705000 +0.771000 +0.666000 +0.372000 +0.099000 +-0.039000 +-0.048000 +0.057000 +0.270000 +0.222000 +0.195000 +0.171000 +0.171000 +0.159000 +0.150000 +0.150000 +0.171000 +0.159000 +0.159000 +0.165000 +0.162000 +0.156000 +0.153000 +0.177000 +0.198000 +0.207000 +0.186000 +0.150000 +0.123000 +0.099000 +0.090000 +0.075000 +0.051000 +0.024000 +0.027000 +0.033000 +0.033000 +0.030000 +0.042000 +0.051000 +0.042000 +0.054000 +0.054000 +0.048000 +0.030000 +0.012000 +-0.006000 +-0.024000 +-0.039000 +-0.048000 +-0.069000 +-0.114000 +-0.156000 +-0.186000 +-0.207000 +-0.216000 +-0.231000 +-0.249000 +-0.231000 +-0.192000 +-0.159000 +-0.117000 +-0.090000 +-0.060000 +-0.036000 +-0.015000 +-0.012000 +-0.009000 +-0.006000 +-0.003000 +-0.006000 +-0.012000 +-0.012000 +-0.024000 +-0.030000 +-0.039000 +-0.054000 +-0.072000 +-0.081000 +-0.075000 +-0.048000 +-0.021000 +0.003000 +0.030000 +0.054000 +0.069000 +0.078000 +0.069000 +0.081000 +0.084000 +0.108000 +0.132000 +0.153000 +0.165000 +0.159000 +0.150000 +0.138000 +0.108000 +0.072000 +0.036000 +0.009000 +-0.021000 +-0.042000 +-0.039000 +-0.027000 +-0.006000 +0.018000 +0.021000 +0.018000 +0.015000 +0.015000 +0.006000 +0.000000 +0.003000 +0.012000 +0.015000 +0.009000 +0.015000 +0.018000 +0.012000 +0.006000 +-0.003000 +-0.006000 +-0.024000 +-0.039000 +-0.045000 +-0.057000 +-0.051000 +-0.054000 +-0.039000 +-0.018000 +-0.012000 +0.003000 +0.012000 +0.024000 +0.048000 +0.072000 +0.069000 +0.081000 +0.096000 +0.075000 +-0.081000 +-0.306000 +-0.459000 +-0.534000 +-0.519000 +-0.543000 +-0.441000 +-0.384000 +-0.444000 +-0.501000 +-0.465000 +-0.255000 +0.000000 +0.156000 +0.228000 +0.249000 +0.246000 +0.210000 +0.105000 +0.123000 +0.429000 +0.642000 +0.666000 +0.585000 +0.372000 +0.108000 +-0.027000 +-0.120000 +-0.132000 +-0.093000 +0.021000 +0.102000 +0.036000 +0.021000 +0.021000 +0.003000 +-0.018000 +-0.045000 +-0.084000 +-0.099000 +-0.096000 +-0.090000 +-0.078000 +-0.057000 +-0.030000 +-0.012000 +-0.003000 +0.000000 +-0.003000 +-0.009000 +-0.006000 +0.015000 +0.024000 +0.054000 +0.075000 +0.093000 +0.102000 +0.120000 +0.141000 +0.159000 +0.147000 +0.111000 +0.075000 +0.063000 +0.042000 +0.039000 +0.018000 +-0.003000 +-0.015000 +-0.015000 +-0.021000 +-0.006000 +0.000000 +0.000000 +-0.015000 +-0.015000 +-0.030000 +-0.030000 +-0.036000 +-0.042000 +-0.036000 +-0.030000 +-0.030000 +-0.021000 +-0.009000 +0.006000 +0.009000 +0.018000 +0.033000 +0.051000 +0.060000 +0.066000 +0.054000 +0.015000 +-0.021000 +-0.063000 +-0.096000 +-0.102000 +-0.063000 +-0.024000 +0.006000 +0.009000 +0.015000 +0.018000 +0.036000 +0.066000 +0.087000 +0.078000 +0.099000 +0.114000 +0.105000 +0.105000 +0.066000 +0.048000 +0.006000 +-0.036000 +-0.072000 +-0.111000 +-0.144000 +-0.171000 +-0.195000 +-0.216000 +-0.231000 +-0.219000 +-0.210000 +-0.210000 +-0.198000 +-0.177000 +-0.144000 +-0.108000 +-0.072000 +-0.039000 +-0.021000 +-0.012000 +0.000000 +0.018000 +0.039000 +0.060000 +0.087000 +0.093000 +0.102000 +0.108000 +0.108000 +0.117000 +0.126000 +0.135000 +0.132000 +0.120000 +0.120000 +0.111000 +0.105000 +0.093000 +0.090000 +0.102000 +0.087000 +0.075000 +0.057000 +0.054000 +0.066000 +0.024000 +-0.141000 +-0.276000 +-0.372000 +-0.429000 +-0.471000 +-0.510000 +-0.528000 +-0.573000 +-0.609000 +-0.564000 +-0.465000 +-0.225000 +-0.048000 +0.045000 +0.132000 +0.111000 +0.147000 +0.240000 +0.213000 +0.234000 +0.630000 +0.771000 +0.642000 +0.396000 +0.216000 +0.069000 +-0.096000 +0.015000 +0.144000 +0.201000 +0.252000 +0.243000 +0.225000 +0.192000 +0.159000 +0.105000 +0.069000 +0.039000 +0.012000 +-0.015000 +-0.042000 +-0.060000 +-0.078000 +-0.090000 +-0.093000 +-0.108000 +-0.102000 +-0.114000 +-0.108000 +-0.087000 +-0.051000 +-0.015000 +-0.015000 +-0.030000 +-0.012000 +0.036000 +0.042000 +-0.012000 +-0.069000 +-0.078000 +-0.069000 +-0.027000 +0.000000 +0.027000 +0.039000 +0.030000 +0.021000 +0.036000 +0.048000 +0.057000 +0.045000 +0.039000 +0.018000 +0.021000 +0.024000 +0.045000 +0.048000 +0.054000 +0.057000 +0.054000 +0.048000 +0.048000 +0.039000 +0.033000 +0.027000 +0.024000 +0.009000 +0.000000 +-0.021000 +-0.036000 +-0.054000 +-0.084000 +-0.099000 +-0.129000 +-0.126000 +-0.105000 +-0.051000 +-0.024000 +0.000000 +0.006000 +0.012000 +0.006000 +0.021000 +0.021000 +0.030000 +0.021000 +0.024000 +0.033000 +0.036000 +0.036000 +0.063000 +0.093000 +0.108000 +0.117000 +0.147000 +0.132000 +0.111000 +0.069000 +0.042000 +0.009000 +0.015000 +0.018000 +0.006000 +0.003000 +-0.003000 +0.006000 +-0.003000 +-0.009000 +-0.021000 +-0.021000 +-0.015000 +-0.015000 +-0.018000 +0.009000 +0.027000 +0.021000 +0.024000 +0.033000 +0.024000 +0.000000 +0.003000 +0.009000 +0.012000 +0.006000 +-0.003000 +-0.003000 +-0.012000 +-0.012000 +-0.036000 +-0.060000 +-0.099000 +-0.141000 +-0.144000 +-0.141000 +-0.165000 +-0.240000 +-0.288000 +-0.375000 +-0.459000 +-0.579000 +-0.687000 +-0.819000 +-0.933000 +-0.924000 +-0.723000 +-0.447000 +-0.243000 +-0.156000 +-0.096000 +-0.015000 +0.171000 +0.360000 +0.522000 +0.582000 +0.462000 +0.171000 +-0.057000 +0.324000 +0.852000 +1.137000 +1.266000 +1.278000 +1.065000 +0.771000 +0.441000 +0.258000 +0.123000 +0.120000 +0.102000 +-0.033000 +-0.141000 +-0.213000 +-0.237000 +-0.252000 +-0.255000 +-0.270000 +-0.273000 +-0.255000 +-0.252000 +-0.234000 +-0.210000 +-0.213000 +-0.201000 +-0.183000 +-0.162000 +-0.147000 +-0.126000 +-0.102000 +-0.099000 +-0.078000 +-0.072000 +-0.051000 +-0.045000 +-0.033000 +-0.027000 +-0.030000 +-0.030000 +-0.018000 +-0.009000 +0.000000 +0.006000 +0.021000 +0.045000 +0.066000 +0.087000 +0.096000 +0.099000 +0.102000 +0.096000 +0.084000 +0.072000 +0.033000 +0.003000 +0.000000 +0.006000 +0.021000 +0.051000 +0.057000 +0.054000 +0.036000 +0.015000 +0.015000 +0.018000 +0.015000 +0.015000 +0.006000 +0.003000 +-0.009000 +-0.009000 +-0.024000 +-0.021000 +-0.009000 +0.000000 +0.015000 +0.021000 +0.015000 +0.009000 +0.000000 +-0.015000 +-0.027000 +-0.036000 +-0.042000 +-0.039000 +-0.033000 +-0.033000 +-0.045000 +-0.060000 +-0.066000 +-0.057000 +-0.030000 +-0.015000 +-0.021000 +-0.054000 +-0.066000 +0.012000 +0.141000 +0.228000 +0.312000 +0.360000 +0.363000 +0.324000 +0.288000 +0.246000 +0.204000 +0.174000 +0.111000 +0.057000 +0.012000 +-0.030000 +-0.051000 +-0.054000 +-0.066000 +-0.102000 +-0.120000 +-0.147000 +-0.165000 +-0.162000 +-0.171000 +-0.168000 +-0.159000 +-0.141000 +-0.126000 +-0.126000 +-0.120000 +-0.105000 +-0.081000 +-0.060000 +-0.147000 +-0.324000 +-0.399000 +-0.414000 +-0.492000 +-0.519000 +-0.522000 +-0.495000 +-0.462000 +-0.399000 +-0.372000 +-0.339000 +-0.279000 +-0.228000 +-0.192000 +-0.012000 +0.228000 +0.555000 +0.609000 +0.588000 +0.285000 +0.126000 +0.174000 +0.435000 +0.570000 +0.561000 +0.495000 +0.393000 +0.309000 +0.339000 +0.366000 +0.303000 +0.243000 +0.201000 +0.165000 +0.126000 +0.087000 +0.051000 +0.012000 +-0.012000 +-0.036000 +-0.060000 +-0.078000 +-0.084000 +-0.096000 +-0.105000 +-0.099000 +-0.084000 +-0.072000 +-0.066000 +-0.087000 +-0.105000 +-0.120000 +-0.159000 +-0.249000 +-0.309000 +-0.336000 +-0.327000 +-0.291000 +-0.252000 +-0.201000 +-0.138000 +-0.096000 +-0.051000 +-0.021000 +0.003000 +0.030000 +0.054000 +0.069000 +0.081000 +0.096000 +0.126000 +0.171000 +0.219000 +0.261000 +0.291000 +0.315000 +0.312000 +0.285000 +0.243000 +0.183000 +0.117000 +0.063000 +0.015000 +-0.024000 +-0.051000 +-0.090000 +-0.141000 +-0.192000 +-0.186000 +-0.168000 +-0.183000 +-0.192000 +-0.198000 +-0.129000 +-0.066000 +-0.057000 +-0.057000 +-0.051000 +-0.036000 +-0.030000 +-0.030000 +-0.009000 +0.000000 +0.012000 +0.009000 +0.018000 +0.015000 +0.012000 +0.006000 +0.000000 +-0.006000 +-0.018000 +-0.027000 +-0.033000 +-0.018000 +0.009000 +0.039000 +0.051000 +0.060000 +0.069000 +0.078000 +0.069000 +0.054000 +0.063000 +0.087000 +0.084000 +0.099000 +0.105000 +0.105000 +0.111000 +0.099000 +0.072000 +0.042000 +0.030000 +0.021000 +0.030000 +0.033000 +0.045000 +0.048000 +0.036000 +0.036000 +0.042000 +0.057000 +0.051000 +0.054000 +0.051000 +0.045000 +0.039000 +0.039000 +0.039000 +0.024000 +0.021000 +0.021000 +0.021000 +0.021000 +0.027000 +-0.003000 +-0.171000 +-0.387000 +-0.492000 +-0.525000 +-0.507000 +-0.567000 +-0.579000 +-0.546000 +-0.540000 +-0.534000 +-0.471000 +-0.360000 +-0.195000 +0.012000 +0.183000 +0.288000 +0.327000 +0.288000 +0.156000 +-0.069000 +-0.285000 +-0.027000 +0.342000 +0.516000 +0.558000 +0.507000 +0.420000 +0.258000 +0.120000 +0.120000 +0.210000 +0.387000 +0.348000 +0.228000 +0.150000 +0.120000 +0.108000 +0.084000 +0.054000 +0.018000 +-0.018000 +-0.051000 +-0.060000 +-0.051000 +-0.066000 +-0.069000 +-0.069000 +-0.054000 +-0.045000 +-0.033000 +-0.042000 +-0.027000 +-0.021000 +-0.015000 +-0.012000 +-0.015000 +-0.042000 +-0.075000 +-0.117000 +-0.138000 +-0.135000 +-0.111000 +-0.096000 +-0.087000 +-0.060000 +-0.012000 +0.021000 +0.036000 +0.057000 +0.069000 +0.081000 +0.102000 +0.120000 +0.126000 +0.135000 +0.153000 +0.168000 +0.168000 +0.168000 +0.174000 +0.171000 +0.156000 +0.159000 +0.153000 +0.132000 +0.093000 +0.054000 +0.030000 +0.009000 +-0.027000 +-0.051000 +-0.075000 +-0.126000 +-0.162000 +-0.186000 +-0.207000 +-0.204000 +-0.195000 +-0.198000 +-0.177000 +-0.135000 +-0.093000 +-0.048000 +0.000000 +0.036000 +0.063000 +0.036000 +0.012000 +-0.012000 +-0.045000 +-0.069000 +-0.084000 +-0.054000 +-0.042000 +-0.039000 +-0.045000 +-0.045000 +-0.030000 +-0.018000 +-0.006000 +0.006000 +0.021000 +0.015000 +0.021000 +0.021000 +0.030000 +0.030000 +0.012000 +-0.021000 +-0.075000 +-0.102000 +-0.096000 +-0.090000 +-0.021000 +0.060000 +0.069000 +0.081000 +0.030000 +0.000000 +-0.012000 +0.009000 +0.012000 +0.006000 +-0.003000 +0.000000 +0.000000 +-0.006000 +-0.012000 +-0.006000 +0.000000 +0.006000 +0.012000 +0.006000 +0.012000 +0.009000 +0.006000 +-0.003000 +0.003000 +0.006000 +0.012000 +0.021000 +0.024000 +0.030000 +0.045000 +0.054000 +0.066000 +0.078000 +0.075000 +0.075000 +0.075000 +0.078000 +0.087000 +0.093000 +0.060000 +-0.006000 +-0.111000 +-0.213000 +-0.327000 +-0.402000 +-0.417000 +-0.678000 +-0.954000 +-1.068000 +-0.939000 +-0.594000 +-0.300000 +-0.300000 +-0.201000 +0.135000 +0.642000 +0.867000 +0.900000 +0.831000 +0.666000 +0.519000 +0.450000 +0.444000 +0.408000 +0.363000 +0.333000 +0.279000 +0.210000 +0.141000 +0.090000 +0.045000 +0.006000 +-0.024000 +-0.069000 +-0.099000 +-0.129000 +-0.150000 +-0.159000 +-0.159000 +-0.165000 +-0.162000 +-0.159000 +-0.147000 +-0.135000 +-0.117000 +-0.099000 +-0.102000 +-0.132000 +-0.192000 +-0.210000 +-0.210000 +-0.189000 +-0.174000 +-0.180000 +-0.192000 +-0.174000 +-0.147000 +-0.114000 +-0.081000 +-0.051000 +-0.012000 +0.006000 +0.021000 +0.027000 +0.030000 +0.051000 +0.054000 +0.066000 +0.075000 +0.084000 +0.078000 +0.087000 +0.090000 +0.102000 +0.105000 +0.111000 +0.114000 +0.111000 +0.114000 +0.117000 +0.117000 +0.111000 +0.114000 +0.111000 +0.108000 +0.108000 +0.105000 +0.096000 +0.090000 +0.078000 +0.078000 +0.069000 +0.063000 +0.051000 +0.054000 +0.042000 +0.039000 +0.036000 +0.033000 +0.027000 +0.030000 +0.024000 +0.024000 +0.024000 +0.027000 +0.027000 +0.027000 +0.027000 +0.024000 +0.021000 +0.018000 +0.027000 +0.018000 +0.018000 +0.021000 +0.009000 +0.009000 +0.006000 +0.003000 +0.003000 +0.000000 +-0.003000 +0.000000 +0.003000 +0.003000 +0.012000 +0.015000 +0.015000 +0.012000 +0.006000 +0.000000 +0.000000 +0.003000 +0.000000 +-0.003000 +-0.003000 +-0.006000 +-0.012000 +-0.012000 +-0.018000 +-0.018000 +-0.021000 +-0.030000 +-0.030000 +-0.042000 +-0.048000 +-0.063000 +-0.069000 +-0.087000 +-0.072000 +-0.045000 +-0.009000 +0.021000 +0.039000 +0.039000 +0.021000 +0.018000 +0.015000 +0.006000 +0.009000 +0.015000 +0.018000 +0.030000 +0.048000 +0.060000 +0.072000 +0.078000 +0.078000 +0.063000 +0.048000 +0.018000 +-0.054000 +-0.108000 +-0.114000 +-0.048000 +0.042000 +0.075000 +0.096000 +0.072000 +0.048000 +0.045000 +0.018000 +0.006000 +-0.009000 +-0.024000 +-0.078000 +-0.195000 +-0.363000 +-0.819000 +-1.230000 +-1.425000 +-1.401000 +-0.933000 +-0.690000 +-0.333000 +-0.081000 +-0.054000 +0.402000 +0.672000 +0.813000 +0.897000 +0.897000 +0.891000 +0.723000 +0.537000 +0.402000 +0.315000 +0.204000 +0.138000 +0.060000 +0.003000 +-0.045000 +-0.072000 +-0.108000 +-0.135000 +-0.129000 +-0.117000 +-0.123000 +-0.120000 +-0.105000 +-0.090000 +-0.087000 +-0.078000 +-0.057000 +-0.036000 +-0.009000 +0.006000 +0.024000 +0.027000 +0.024000 +0.030000 +0.042000 +0.042000 +0.054000 +0.051000 +0.051000 +0.057000 +0.060000 +0.066000 +0.063000 +0.057000 +0.057000 +0.051000 +0.045000 +0.027000 +0.012000 +-0.006000 +-0.021000 +-0.018000 +-0.018000 +-0.018000 +-0.012000 +-0.024000 +-0.024000 +-0.024000 +-0.021000 +-0.018000 +-0.021000 +-0.006000 +-0.012000 +-0.009000 +-0.012000 +-0.009000 +-0.015000 +-0.012000 +-0.012000 +-0.003000 +-0.003000 +0.003000 +-0.003000 +-0.006000 +-0.003000 +-0.006000 +-0.009000 +0.000000 +0.000000 +0.006000 +0.012000 +0.024000 +0.024000 +0.030000 +0.030000 +0.030000 +0.036000 +0.045000 +0.051000 +0.057000 +0.069000 +0.072000 +0.078000 +0.087000 +0.096000 +0.108000 +0.111000 +0.105000 +0.105000 +0.108000 +0.114000 +0.126000 +0.123000 +0.117000 +0.105000 +0.096000 +0.084000 +0.069000 +0.066000 +0.069000 +0.087000 +0.087000 +0.087000 +0.087000 +0.084000 +0.063000 +0.057000 +0.051000 +0.033000 +-0.003000 +-0.045000 +-0.075000 +-0.105000 +-0.141000 +-0.165000 +-0.180000 +-0.219000 +-0.249000 +-0.264000 +-0.279000 +-0.270000 +-0.270000 +-0.282000 +-0.282000 +-0.255000 +-0.225000 +-0.189000 +-0.153000 +-0.108000 +-0.081000 +-0.051000 +-0.024000 +0.000000 +0.015000 +0.030000 +0.039000 +0.060000 +0.069000 +0.078000 +0.081000 +0.087000 +0.087000 +0.090000 +0.084000 +0.069000 +0.042000 +0.012000 +-0.003000 +-0.009000 +0.018000 +0.045000 +0.087000 +0.090000 +0.063000 +0.048000 +0.042000 +0.027000 +0.006000 +-0.099000 +-0.336000 +-0.570000 +-0.756000 +-0.849000 +-0.735000 +-0.576000 +-0.609000 +-0.642000 +-0.486000 +-0.246000 +0.135000 +0.537000 +0.750000 +0.555000 +0.759000 +0.870000 +0.732000 +0.582000 +0.498000 +0.447000 +0.405000 +0.342000 +0.303000 +0.258000 +0.177000 +0.084000 +-0.003000 +-0.078000 diff --git a/examples/egm_bipolar_sinus.txt b/examples/egm_bipolar_sinus.txt new file mode 100644 index 00000000..6b6152b3 --- /dev/null +++ b/examples/egm_bipolar_sinus.txt @@ -0,0 +1,2505 @@ +# Simple Text Format +# Sampling Rate (Hz):= 1000.00 +# WOI: [-137, 51] +# Reference: 2000 +# Units:= mV +0.003000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.003000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.006000 +0.003000 +0.000000 +0.000000 +0.000000 +-0.006000 +0.000000 +-0.006000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.006000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.003000 +0.003000 +0.006000 +0.009000 +0.018000 +0.012000 +0.021000 +0.024000 +0.021000 +0.021000 +0.024000 +0.021000 +0.015000 +0.012000 +0.015000 +0.009000 +0.006000 +0.006000 +0.006000 +0.000000 +0.003000 +-0.003000 +-0.006000 +-0.006000 +-0.012000 +-0.015000 +-0.060000 +-0.099000 +-0.090000 +-0.051000 +-0.048000 +-0.039000 +-0.033000 +-0.018000 +-0.018000 +-0.012000 +-0.006000 +0.000000 +-0.003000 +0.003000 +0.006000 +0.006000 +0.015000 +0.015000 +0.015000 +0.015000 +0.021000 +0.018000 +0.021000 +0.018000 +0.030000 +0.027000 +0.015000 +0.012000 +0.015000 +0.012000 +0.012000 +0.012000 +0.015000 +0.012000 +0.015000 +0.006000 +0.009000 +0.003000 +0.006000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.006000 +0.000000 +0.000000 +-0.003000 +-0.006000 +-0.006000 +-0.003000 +-0.009000 +-0.003000 +-0.006000 +-0.009000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.006000 +0.000000 +0.003000 +0.006000 +0.003000 +0.003000 +0.000000 +0.000000 +0.003000 +0.000000 +0.003000 +0.000000 +0.003000 +0.003000 +0.003000 +0.000000 +0.000000 +0.009000 +0.006000 +0.006000 +0.003000 +0.003000 +0.006000 +0.003000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +-0.003000 +0.000000 +-0.003000 +-0.003000 +-0.015000 +-0.018000 +-0.009000 +-0.009000 +-0.009000 +-0.006000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +-0.006000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.009000 +0.009000 +0.003000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.006000 +0.000000 +0.003000 +0.000000 +0.012000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.003000 +0.003000 +0.003000 +0.003000 +0.000000 +0.006000 +0.003000 +0.000000 +0.000000 +0.006000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.003000 +0.000000 +0.000000 +0.003000 +0.003000 +0.000000 +0.000000 +0.000000 +0.006000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.003000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.006000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.003000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +-0.006000 +-0.003000 +0.000000 +-0.003000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.006000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +-0.006000 +-0.003000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.006000 +0.000000 +0.000000 +-0.003000 +0.000000 +-0.003000 +-0.003000 +-0.006000 +0.000000 +0.000000 +-0.003000 +-0.003000 +-0.003000 +0.000000 +0.000000 +0.000000 +-0.003000 +-0.003000 +0.000000 +0.000000 +-0.006000 +0.000000 +-0.003000 +0.000000 +-0.006000 +0.003000 +0.000000 +0.000000 +-0.003000 +0.000000 +-0.003000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +-0.006000 +-0.003000 +-0.006000 +-0.006000 +-0.003000 +-0.003000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.003000 +0.003000 +0.006000 +0.003000 +0.000000 +0.006000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +-0.003000 +-0.003000 +0.000000 +0.003000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.003000 +0.006000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.003000 +0.000000 +0.003000 +0.003000 +0.003000 +0.000000 +0.000000 +0.003000 +0.000000 +-0.003000 +-0.003000 +0.000000 +0.003000 +0.000000 +0.003000 +0.000000 +0.003000 +0.003000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.003000 +0.000000 +0.003000 +0.003000 +-0.006000 +0.000000 +-0.003000 +-0.003000 +0.000000 +-0.006000 +0.000000 +-0.006000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +-0.003000 +-0.003000 +0.000000 +0.003000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +0.003000 +0.003000 +0.003000 +0.000000 +0.000000 +0.006000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.003000 +0.000000 +0.003000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +0.003000 +0.003000 +0.003000 +0.012000 +0.009000 +0.009000 +0.003000 +0.006000 +0.006000 +0.006000 +0.006000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +-0.003000 +-0.003000 +0.000000 +-0.006000 +-0.003000 +0.000000 +-0.006000 +0.000000 +-0.006000 +-0.006000 +-0.009000 +-0.009000 +-0.012000 +-0.009000 +-0.006000 +-0.006000 +-0.003000 +-0.003000 +0.000000 +0.000000 +-0.003000 +0.000000 +-0.006000 +-0.003000 +-0.006000 +-0.003000 +-0.003000 +-0.003000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.006000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.009000 +0.003000 +0.003000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.003000 +-0.003000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +-0.003000 +-0.003000 +0.000000 +0.000000 +0.003000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +-0.003000 +-0.003000 +0.000000 +-0.003000 +-0.006000 +0.000000 +0.000000 +-0.003000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.003000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.006000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.006000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +0.003000 +0.003000 +0.000000 +0.000000 +-0.003000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.006000 +0.000000 +0.000000 +0.003000 +0.000000 +-0.003000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.006000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +-0.003000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +-0.003000 +-0.003000 +-0.003000 +-0.003000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.003000 +0.003000 +0.000000 +0.009000 +0.000000 +0.000000 +0.006000 +0.006000 +0.003000 +0.009000 +0.012000 +0.018000 +0.015000 +0.018000 +0.015000 +0.003000 +0.009000 +0.018000 +0.024000 +0.036000 +0.042000 +0.057000 +0.111000 +0.270000 +0.501000 +0.735000 +0.981000 +1.398000 +1.686000 +0.246000 +-3.195000 +-2.220000 +-1.035000 +-0.642000 +-0.468000 +-0.306000 +-0.255000 +-0.180000 +-0.096000 +-0.039000 +-0.012000 +0.048000 +0.114000 +0.165000 +0.183000 +0.192000 +0.198000 +0.192000 +0.174000 +0.150000 +0.135000 +0.123000 +0.111000 +0.099000 +0.087000 +0.078000 +0.072000 +0.063000 +0.054000 +0.051000 +0.048000 +0.039000 +0.033000 +0.024000 +0.024000 +0.012000 +0.012000 +0.015000 +0.006000 +0.000000 +0.003000 +0.000000 +0.000000 +-0.009000 +-0.009000 +-0.015000 +-0.015000 +-0.018000 +-0.018000 +-0.018000 +-0.018000 +-0.015000 +-0.018000 +-0.012000 +-0.018000 +-0.018000 +-0.018000 +-0.018000 +-0.012000 +-0.021000 +-0.015000 +-0.015000 +-0.009000 +-0.003000 +-0.009000 +-0.012000 +-0.006000 +-0.003000 +-0.006000 +-0.009000 +-0.009000 +-0.003000 +-0.006000 +-0.003000 +-0.003000 +-0.003000 +-0.003000 +-0.003000 +-0.003000 +-0.003000 +0.000000 +0.000000 +0.000000 +-0.006000 +-0.006000 +-0.003000 +-0.009000 +-0.003000 +-0.006000 +-0.003000 +0.000000 +-0.009000 +-0.003000 +0.000000 +-0.003000 +-0.006000 +-0.006000 +0.000000 +-0.003000 +-0.003000 +-0.003000 +-0.003000 +-0.006000 +-0.003000 +-0.003000 +-0.006000 +0.000000 +0.000000 +-0.003000 +-0.006000 +0.000000 +-0.003000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.006000 +0.003000 +0.009000 +0.009000 +0.006000 +0.003000 +0.009000 +0.009000 +0.006000 +0.012000 +0.012000 +0.021000 +0.021000 +0.015000 +0.024000 +0.027000 +0.024000 +0.021000 +0.021000 +0.018000 +0.018000 +0.015000 +0.012000 +0.006000 +0.003000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.006000 +-0.012000 +-0.012000 +-0.009000 +-0.012000 +-0.018000 +-0.018000 +-0.018000 +-0.015000 +-0.015000 +-0.006000 +-0.015000 +-0.006000 +-0.006000 +-0.006000 +0.000000 +-0.006000 +0.000000 +-0.003000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.003000 +0.003000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.006000 +0.000000 +0.003000 +0.000000 +-0.003000 +-0.003000 +0.000000 +-0.003000 +-0.009000 +0.000000 +-0.006000 +0.000000 +-0.006000 +0.000000 +-0.003000 +0.003000 +0.000000 +0.000000 +-0.006000 +0.000000 +-0.003000 +0.000000 +0.003000 +-0.003000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +-0.003000 +-0.006000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.003000 +0.006000 +0.000000 +0.000000 +0.006000 +0.003000 +0.006000 +0.003000 +0.006000 +0.003000 +0.003000 +0.003000 +0.000000 +0.006000 +0.006000 +0.006000 +0.003000 +0.003000 +0.006000 +0.003000 +0.003000 +0.003000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.003000 +0.000000 +0.003000 +0.003000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.006000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +0.003000 +0.003000 +0.003000 +0.000000 +0.003000 +0.000000 +0.003000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.003000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.003000 +0.006000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.009000 +0.000000 +0.003000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.006000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +-0.003000 +-0.003000 +-0.003000 +0.000000 +-0.006000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +0.003000 +0.003000 +0.000000 +0.003000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +-0.003000 +0.000000 +-0.003000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +-0.003000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.006000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +-0.003000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +-0.003000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.006000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.006000 +0.006000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +-0.003000 +-0.003000 +0.003000 +0.000000 +-0.003000 +0.003000 +0.000000 +-0.003000 +0.000000 +-0.003000 +-0.003000 +-0.003000 +-0.003000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.003000 +-0.003000 +0.000000 +-0.003000 +0.000000 +-0.003000 +-0.003000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.003000 +0.000000 +0.003000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +-0.003000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.006000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.003000 +0.009000 +-0.003000 +0.000000 +0.000000 +-0.003000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +-0.003000 +-0.003000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +0.009000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.006000 +0.003000 +0.006000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +0.003000 +0.006000 +0.006000 +0.000000 +0.000000 +0.006000 +0.000000 +0.006000 +0.000000 +0.006000 +0.006000 +0.006000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +-0.003000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +-0.003000 +-0.003000 +-0.006000 +-0.003000 +-0.009000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +-0.003000 +0.000000 +-0.003000 +0.000000 +0.000000 +-0.003000 +-0.003000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.006000 +0.000000 +0.003000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.003000 +0.000000 +0.006000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.003000 +0.003000 +0.003000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +0.003000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +-0.003000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.003000 +0.006000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.003000 +0.000000 +0.000000 +0.003000 +0.000000 +0.003000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +-0.003000 +-0.003000 +0.000000 +-0.003000 +-0.003000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +-0.003000 +-0.006000 +0.003000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +0.003000 +0.000000 +0.003000 +0.000000 +0.000000 +-0.003000 +0.000000 +-0.003000 +0.000000 +-0.003000 +0.000000 +-0.003000 +0.000000 +0.006000 +0.003000 +0.006000 +0.000000 +0.003000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.006000 +0.003000 +0.006000 +0.006000 +0.009000 +0.012000 +0.018000 +0.018000 +0.021000 +0.021000 +0.018000 +0.000000 +0.006000 +0.015000 +0.021000 +0.042000 +0.054000 +0.081000 +0.159000 +0.339000 +0.585000 +0.810000 +1.059000 +1.503000 +1.404000 +-0.819000 +-3.228000 +-1.671000 +-0.891000 +-0.615000 +-0.450000 +-0.279000 +-0.243000 +-0.159000 +-0.072000 +-0.021000 +0.012000 +0.072000 +0.138000 +0.162000 +0.177000 +0.189000 +0.192000 +0.186000 +0.165000 +0.153000 +0.141000 +0.123000 +0.114000 +0.102000 +0.090000 +0.081000 +0.072000 +0.063000 +0.060000 +0.054000 +0.045000 +0.039000 +0.021000 +0.018000 +0.003000 +0.000000 +0.000000 +0.000000 +0.006000 +0.009000 +0.006000 +0.003000 +0.009000 +0.006000 +0.000000 +-0.003000 +-0.003000 +-0.006000 +-0.015000 +-0.009000 +-0.012000 +-0.015000 +-0.024000 +-0.024000 +-0.030000 +-0.030000 +-0.027000 +-0.024000 +-0.018000 +-0.009000 +-0.009000 +-0.012000 +-0.006000 +-0.015000 +-0.015000 +-0.009000 +-0.012000 +-0.003000 +-0.003000 +-0.006000 +-0.003000 +-0.006000 +-0.003000 +-0.009000 +0.000000 +-0.006000 +0.000000 +-0.006000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.006000 +-0.006000 +-0.006000 +-0.009000 +-0.006000 +-0.003000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +-0.003000 +0.000000 +0.000000 +-0.003000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.003000 +0.003000 +0.003000 +0.006000 +0.009000 +0.012000 +0.009000 +0.012000 +0.015000 +0.012000 +0.018000 +0.015000 +0.018000 +0.018000 +0.021000 +0.018000 +0.018000 +0.018000 +0.015000 +0.012000 +0.009000 +0.000000 +0.000000 +0.000000 +-0.003000 +-0.003000 +-0.003000 +-0.012000 +-0.009000 +-0.009000 +-0.009000 +-0.009000 +-0.009000 +-0.012000 +-0.003000 +-0.009000 +-0.012000 +-0.012000 +-0.009000 +-0.009000 +-0.009000 +-0.006000 +-0.003000 +0.000000 +0.000000 +-0.003000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +-0.003000 +0.000000 +-0.006000 +-0.003000 +-0.003000 +-0.003000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.003000 +0.000000 +0.003000 +0.000000 +0.006000 +0.003000 +0.000000 +0.003000 +0.000000 +0.000000 +0.003000 +0.003000 +0.000000 +0.003000 +0.000000 +0.003000 +0.003000 +0.003000 +0.003000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.003000 +0.003000 +0.006000 +0.000000 +0.003000 +0.006000 +0.000000 +0.006000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.006000 +0.003000 +0.003000 +0.000000 +0.003000 +0.003000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.003000 +0.000000 +0.003000 +0.000000 +0.003000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.006000 +0.000000 +0.009000 +0.000000 +0.003000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.003000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.003000 +0.003000 +0.003000 +0.003000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +-0.003000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +-0.006000 +-0.003000 +0.000000 +-0.006000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +-0.003000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.006000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.003000 +0.000000 +0.003000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +-0.006000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +-0.003000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.006000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.006000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.000000 +-0.003000 +0.003000 +-0.003000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.003000 +0.003000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +-0.003000 +0.000000 +-0.003000 +0.000000 +0.000000 +0.003000 +0.000000