def get_brain_regions(xyz, channels_positions=SITES_COORDINATES, brain_atlas=brat, display=False): """ :param xyz: numpy array of 3D coordinates corresponding to a picked track or a trajectory the deepest point is considered the tip. :param channels: :param DISPLAY: :return: """ """ this is the depth along the probe (from the first point which is the deepest labeled point) Due to the blockiness, depths may not be unique along the track so it has to be prepared """ d = atlas.cart2sph(xyz[:, 0] - xyz[0, 0], xyz[:, 1] - xyz[0, 1], xyz[:, 2] - xyz[0, 2])[0] ind_depths = np.argsort(d) d = np.sort(d) iid = np.where(np.diff(d) >= 0)[0] ind_depths = ind_depths[iid] d = d[iid] """ Interpolate channel positions along the probe depth and get brain locations """ xyz_channels = np.zeros((channels_positions.shape[0], 3)) for m in np.arange(3): xyz_channels[:, m] = np.interp(channels_positions[:, 1] / 1e6, d[ind_depths], xyz[ind_depths, m]) brain_regions = brain_atlas.regions.get(brat.get_labels(xyz_channels)) """ Get the best linear fit probe trajectory using points cloud """ track = atlas.Trajectory.fit(xyz) return brain_regions, track
def get_brain_regions(xyz, channels_positions=None, brain_atlas=None): """ :param xyz: numpy array of 3D coordinates corresponding to a picked track or a trajectory the deepest point is assumed to be the tip. :param channels_positions: :param brain_atlas: :return: brain_regions (associated to each channel), insertion (object atlas.Insertion, defining 2 points of entries (tip and end of probe)) """ """ this is the depth along the probe (from the first point which is the deepest labeled point) Due to the blockiness, depths may not be unique along the track so it has to be prepared """ brain_atlas = brain_atlas or atlas.AllenAtlas(25) if channels_positions is None: geometry = trace_header(version=1) channels_positions = np.c_[geometry['x'], geometry['y']] xyz = xyz[np.argsort(xyz[:, 2]), :] d = atlas.cart2sph(xyz[:, 0] - xyz[0, 0], xyz[:, 1] - xyz[0, 1], xyz[:, 2] - xyz[0, 2])[0] indsort = np.argsort(d) xyz = xyz[indsort, :] d = d[indsort] iduplicates = np.where(np.diff(d) == 0)[0] xyz = np.delete(xyz, iduplicates, axis=0) d = np.delete(d, iduplicates, axis=0) assert np.all(np.diff(d) > 0), "Depths should be strictly increasing" # Get the probe insertion from the coordinates insertion = atlas.Insertion.from_track(xyz, brain_atlas) # Interpolate channel positions along the probe depth and get brain locations TIP_SIZE_UM = 200 xyz_channels = interpolate_along_track( xyz, (channels_positions[:, 1] + TIP_SIZE_UM) / 1e6) # get the brain regions brain_regions = brain_atlas.regions.get( brain_atlas.get_labels(xyz_channels)) brain_regions['xyz'] = xyz_channels brain_regions['lateral'] = channels_positions[:, 0] brain_regions['axial'] = channels_positions[:, 1] assert np.unique([len(brain_regions[k]) for k in brain_regions]).size == 1 return brain_regions, insertion
def test_sph2cart_and_back(self): dv = np.array([0, -1, 1, 0, 0, 0, 0, 0, 0]) # z ml = np.array([0, 0, 0, 0, -1, 1, 0, 0, 0]) # x ap = np.array([0, 0, 0, 0, 0, 0, 0, -1, 1]) # y phi = np.array([0., 0., 0., 0., 180., 0., 0., -90., 90.]) theta = np.array([0., 180., 0., 0., 90., 90., 0., 90., 90.]) r = np.array([0., 1, 1, 0., 1, 1, 0., 1, 1]) r_, t_, p_ = cart2sph(ml, ap, dv) assert np.all(np.isclose(r, r_)) assert np.all(np.isclose(phi, p_)) assert np.all(np.isclose(theta, t_)) x_, y_, z_ = sph2cart(r, theta, phi) assert np.all(np.isclose(ml, x_)) assert np.all(np.isclose(ap, y_)) assert np.all(np.isclose(dv, z_))