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]
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
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)
_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])