Beispiel #1
0
def __csd_correlation(v, m):
    '''compute correlation coefficient between CSD estimate and CSD
    for a given source diameter'''
    if m == 'delta':
        icsd_input[m].update({'diam': v * pq.m})
        _icsd = icsd.DeltaiCSD(**icsd_input[m])
        corrcoef = pl.corrcoef(
            CSD_filtered.flatten(),
            pl.array(_icsd.filter_csd(_icsd.get_csd()) / pq.m).flatten())
    elif m == 'step':
        icsd_input[m].update({'diam': v * pq.m})
        _icsd = icsd.StepiCSD(**icsd_input[m])
        corrcoef = pl.corrcoef(
            CSD_filtered.flatten(),
            pl.array(_icsd.filter_csd(_icsd.get_csd()) / pq.m).flatten())
    elif m == 'spline':
        icsd_input[m].update({'diam': v * pq.m})
        _icsd = icsd.SplineiCSD(**icsd_input[m])
        corrcoef = pl.corrcoef(
            CSD76ptF.flatten(),
            pl.array(_icsd.filter_csd(_icsd.get_csd()) / pq.m).flatten())
    else:
        raise Exception, 'm = %s should be either [delta, step, spline]' % m

    return corrcoef[0, -1]
Beispiel #2
0
def __csd_error(v, m):
    '''using squared difference summed'''
    if m == 'delta':
        icsd_input[m].update({'diam': v * pq.m})
        _icsd = icsd.DeltaiCSD(**icsd_input[m])
        error = (
            (pl.array(_icsd.filter_csd(_icsd.get_csd()) /
                      (100E-6 * pq.m)).reshape(CSD_filtered.size) * 1E-9 -
             CSD_filtered.reshape(CSD_filtered.size))**2).sum()
    elif m == 'step':
        icsd_input[m].update({'diam': v * pq.m})
        _icsd = icsd.StepiCSD(**icsd_input[m])
        error = ((pl.array(_icsd.filter_csd(_icsd.get_csd())).reshape(
            CSD_filtered.size) * 1E-9 -
                  CSD_filtered.reshape(CSD_filtered.size))**2).sum()
    elif m == 'spline':
        icsd_input[m].update({'diam': v * pq.m})
        _icsd = icsd.SplineiCSD(**icsd_input[m])
        error = ((pl.array(_icsd.filter_csd(_icsd.get_csd())).reshape(
            CSD76ptF.size) * 1E-9 - CSD76ptF.reshape(CSD76ptF.size))**2).sum()
    else:
        raise Exception, 'm = %s should be either [delta, step, spline]' % m

    return error
Beispiel #3
0
    def test_SplineiCSD_01(self):
        '''test using standard SI units, deep electrode coordinates'''
        # set some parameters for ground truth csd and csd estimates., e.g.,
        # we will use same source diameter as in ground truth

        # contact point coordinates
        z_j = np.arange(10, 31) * 1E-4 * pq.m

        # source coordinates
        z_i = z_j

        # current source density magnitude
        C_i = np.zeros(z_i.size) * pq.A / pq.m**3
        C_i[7:12:2] += np.array([-.5, 1., -.5]) * pq.A / pq.m**3

        # source radius (delta, step)
        R_i = np.ones(z_i.size) * 1E-3 * pq.m

        # source height (cylinder)
        h_i = np.ones(z_i.size) * 1E-4 * pq.m

        # conductivity, use same conductivity for top layer (z_j < 0)
        sigma = 0.3 * pq.S / pq.m
        sigma_top = sigma

        # construct interpolators, spline method assume underlying source
        # pattern generating LFPs that are cubic spline interpolates between
        # contacts so we generate CSD data relying on the same assumption
        f_C = interp1d(z_i, C_i, kind='cubic')
        f_R = interp1d(z_i, R_i)
        num_steps = 201
        z_i_i = np.linspace(float(z_i[0]), float(
            z_i[-1]), num_steps) * z_i.units
        C_i_i = f_C(np.asarray(z_i_i)) * C_i.units
        R_i_i = f_R(z_i_i) * R_i.units

        h_i_i = np.ones(z_i_i.size) * np.diff(z_i_i).min()

        # flag for debug plots
        plot = False

        # get LFP and CSD at contacts
        phi_j, C_i = get_lfp_of_cylinders(z_j, z_i_i, C_i_i, R_i_i, h_i_i,
                                          sigma, plot)

        spline_input = {
            'lfp': phi_j,
            'coord_electrode': z_j,
            'diam': R_i * 2,
            'sigma': sigma,
            'sigma_top': sigma,
            'num_steps': num_steps,
            'tol': 1E-12,          # Tolerance in numerical integration
            'f_type': 'gaussian',
            'f_order': (3, 1),
        }
        spline_icsd = icsd.SplineiCSD(**spline_input)
        csd = spline_icsd.get_csd()

        self.assertEqual(C_i.units, csd.units)
        nt.assert_array_almost_equal(C_i, csd, decimal=3)
Beispiel #4
0
        _icsd = icsd.StepiCSD(**icsd_input[m])
        icsd_output.update(
            {'icsd_step': _icsd.filter_csd(_icsd.get_csd()) * 1E-9})

        my_errors['step'], my_diams['step'], diam_best['step'] = \
            minimize_icsd_error_brute(m)
        icsd_input[m].update({'diam': diam_best['step'] * pq.m})

        print 'best diameter step: %.5e' % diam_best['step']

        _icsd = icsd.StepiCSD(**icsd_input[m])
        icsd_output.update(
            {'icsd_step': _icsd.filter_csd(_icsd.get_csd()) * 1E-9})

    elif m == 'spline':
        _icsd = icsd.SplineiCSD(**icsd_input[m])
        icsd_output.update(
            {'icsd_spline': _icsd.filter_csd(_icsd.get_csd()) * 1E-9})

        my_errors['spline'], my_diams['spline'], diam_best['spline'] = \
            minimize_icsd_error_brute(m)
        icsd_input[m].update({'diam': diam_best['spline'] * pq.m})

        print 'best diameter spline: %.5e' % diam_best['spline']

        _icsd = icsd.SplineiCSD(**icsd_input[m])
        icsd_output.update(
            {'icsd_spline': _icsd.filter_csd(_icsd.get_csd()) * 1E-9})

    elif m == 'std':
        _icsd = icsd.StandardCSD(**icsd_input[m])