def bundle_from_refs(brain,braind, refs, divergence_threshold=0.3, fibre_weight=0.7,far_thresh=25,zhang_thresh=15, end_thresh=10): ''' ''' bundle = set([]) centres = [] indices = [] for ref in refs: refd=tm.downsample(ref,3) brain_rf, ind_fr = rm_far_tracks(refd,braind,dist=far_thresh,down=True) brain_rf=[brain[i] for i in ind_fr] #brain_rf,ind_fr = rm_far_tracks(ref,brain,dist=far_thresh,down=False) heavy_weight_fibres, index, centre = refconc(brain_rf, ref, divergence_threshold, fibre_weight) heavy_weight_fibres_z = [i for i in heavy_weight_fibres if pf.zhang_distances(ref,brain_rf[i],'avg')<zhang_thresh] #heavy_weight_fibres_z_e = [i for i in heavy_weight_fibres_z if tm.max_end_distances(brain_rf[i],ref)>end_thresh] hwfind = set([ind_fr[i] for i in heavy_weight_fibres_z]) bundle = bundle.union(hwfind) bundle_med = [] for i in bundle: minmaxdist = 0. for ref in refs: minmaxdist=min(minmaxdist,tm.max_end_distances(brain[i],ref)) if minmaxdist<=end_thresh: bundle_med.append(i) #centres.append(centre) #indices.append(index) #return list(bundle), centres, indices return bundle_med
def detect_corresponding_tracks(indices, tracks1, tracks2): ''' Detect corresponding tracks from 1 to 2 Parameters ---------- indices : sequence of indices of tracks1 that are to be detected in tracks2 tracks1 : sequence of tracks as arrays, shape (N1,3) .. (Nm,3) tracks2 : sequence of tracks as arrays, shape (M1,3) .. (Mm,3) Returns ------- track2track : array of int showing the correspondance ''' li = len(indices) track2track = np.zeros((li, 3)) cnt = 0 for i in indices: rt = [pf.zhang_distances(tracks1[i], t, 'avg') for t in tracks2] rt = np.array(rt) track2track[cnt - 1] = np.array([cnt, i, rt.argmin()]) cnt += 1 return track2track.astype(int)
def detect_corresponding_tracks(indices,tracks1,tracks2): ''' Detect corresponding tracks from 1 to 2 Parameters ---------- indices : sequence of indices of tracks1 that are to be detected in tracks2 tracks1 : sequence of tracks as arrays, shape (N1,3) .. (Nm,3) tracks2 : sequence of tracks as arrays, shape (M1,3) .. (Mm,3) Returns ------- track2track : array of int showing the correspondance ''' li=len(indices) track2track=np.zeros((li,3)) cnt=0 for i in indices: rt=[pf.zhang_distances(tracks1[i],t,'avg') for t in tracks2] rt=np.array(rt) track2track[cnt-1]=np.array([cnt,i,rt.argmin()]) cnt+=1 return track2track.astype(int)
def bundle_from_refs(brain,braind, refs, divergence_threshold=0.3, fibre_weight=0.7,far_thresh=25,zhang_thresh=15, end_thresh=10): ''' ''' bundle = set([]) # centres = [] # indices = [] for ref in refs: refd=tm.downsample(ref,3) brain_rf, ind_fr = rm_far_tracks(refd,braind,dist=far_thresh,down=True) brain_rf=[brain[i] for i in ind_fr] #brain_rf,ind_fr = rm_far_tracks(ref,brain,dist=far_thresh,down=False) heavy_weight_fibres, index, centre = refconc(brain_rf, ref, divergence_threshold, fibre_weight) heavy_weight_fibres_z = [i for i in heavy_weight_fibres if pf.zhang_distances(ref,brain_rf[i],'avg')<zhang_thresh] #heavy_weight_fibres_z_e = [i for i in heavy_weight_fibres_z if tm.max_end_distances(brain_rf[i],ref)>end_thresh] hwfind = set([ind_fr[i] for i in heavy_weight_fibres_z]) bundle = bundle.union(hwfind) bundle_med = [] for i in bundle: minmaxdist = 0. for ref in refs: minmaxdist=min(minmaxdist,tm.max_end_distances(brain[i],ref)) if minmaxdist<=end_thresh: bundle_med.append(i) #centres.append(centre) #indices.append(index) #return list(bundle), centres, indices return bundle_med
def relabel_by_atlas_value_and_mam(atlas_tracks,atlas,tes,tracks,tracksd,zhang_thr): emi=emi_atlas() brain_relabeled={} for e in range(1,9): #from emi: print emi[e]['bundle_name'] indices=emi[e]['init_ref']+emi[e]['selected_ref']+emi[e]['apr_ref'] tmp=detect_corresponding_tracks(indices,atlas_tracks,tracks) corresponding_indices=tmp[:,2] corresponding_indices=list(set(corresponding_indices)) value_indices=[] for value in emi[e]['value']: value_indices+=track_indices_for_a_value_in_atlas(atlas,value,tes,tracks) value_indices=list(set(value_indices)) print 'len corr_ind',len(corresponding_indices) #check if value_indices do not have anything in common with corresponding_indices and expand if list(set(value_indices).intersection(set(corresponding_indices)))==[]: #value_indices=corresponding_indices print 'len corr_ind',len(corresponding_indices) for ci in corresponding_indices: print 'koukou',ci ref=tracksd[ci] brain_rf, ind_fr = rm_far_tracks(ref,tracksd,dist=10,down=True) value_indices+=ind_fr value_indices=list(set(value_indices)) print 'len vi',len(value_indices) value_indices_new=[] #reduce value_indices which are far from every corresponding fiber for vi in value_indices: dist=[] for ci in corresponding_indices: dist.append(pf.zhang_distances(tracks[vi],tracks[ci],'avg')) for d in dist: if d <= zhang_thr[e-1]: value_indices_new.append(vi) value_indices=list(set(value_indices_new)) #store value indices brain_relabeled[e]={} brain_relabeled[e]['value_indices']=value_indices brain_relabeled[e]['corresponding_indices']=corresponding_indices brain_relabeled[e]['color']=emi[e]['color'] brain_relabeled[e]['bundle_name']=emi[e]['bundle_name'][0] return brain_relabeled
def relabel_by_atlas_value_and_zhang(atlas_tracks,atlas,tes,tracks,tracksd,zhang_thr): emi=emi_atlas() brain_relabeled={} for e in range(1,9): #from emi: print emi[e]['bundle_name'] indices=emi[e]['init_ref']+emi[e]['selected_ref']+emi[e]['apr_ref'] tmp=detect_corresponding_tracks(indices,atlas_tracks,tracks) corresponding_indices=tmp[:,2] corresponding_indices=list(set(corresponding_indices)) value_indices=[] for value in emi[e]['value']: value_indices+=track_indices_for_a_value_in_atlas(atlas,value,tes,tracks) value_indices=list(set(value_indices)) print 'len corr_ind',len(corresponding_indices) #check if value_indices do not have anything in common with corresponding_indices and expand if list(set(value_indices).intersection(set(corresponding_indices)))==[]: #value_indices=corresponding_indices print 'len corr_ind',len(corresponding_indices) for ci in corresponding_indices: print 'koukou',ci ref=tracksd[ci] brain_rf, ind_fr = rm_far_tracks(ref,tracksd,dist=10,down=True) value_indices+=ind_fr value_indices=list(set(value_indices)) print 'len vi',len(value_indices) value_indices_new=[] #reduce value_indices which are far from every corresponding fiber for vi in value_indices: dist=[] for ci in corresponding_indices: dist.append(pf.zhang_distances(tracks[vi],tracks[ci],'avg')) for d in dist: if d <= zhang_thr[e-1]: value_indices_new.append(vi) value_indices=list(set(value_indices_new)) #store value indices brain_relabeled[e]={} brain_relabeled[e]['value_indices']=value_indices brain_relabeled[e]['corresponding_indices']=corresponding_indices brain_relabeled[e]['color']=emi[e]['color'] brain_relabeled[e]['bundle_name']=emi[e]['bundle_name'][0] return brain_relabeled
def test_zhang_distances(): xyz1 = np.array([[0,0,0],[1,0,0],[2,0,0],[3,0,0]]) xyz2 = np.array([[0,1,1],[1,0,1],[2,3,-2]]) # dm=array([[ 2, 2, 17], [ 3, 1, 14], [6, 2, 13], [11, 5, 14]]) # this is the distance matrix between points of xyz1 # and points of xyz2 zd = tm.zhang_distances(xyz1,xyz2) # {'average_mean_closest_distance': 3.9166666666666665, # 'maximum_mean_closest_distance': 5.333333333333333, # 'minimum_mean_closest_distance': 2.5} yield assert_almost_equal, zd[0], 1.76135602742 xyz1=xyz1.astype('float32') xyz2=xyz2.astype('float32') zd2 = pf.zhang_distances(xyz1,xyz2) yield assert_almost_equal, zd2[0], 1.76135602742
def corresponding_tracks(indices,tracks1,tracks2): ''' Detect similar tracks in different brains ''' li=len(indices) track2track=np.zeros((li,3)) cnt=0 for i in indices: rt=[pf.zhang_distances(tracks1[i],t,'avg') for t in tracks2] rt=np.array(rt) track2track[cnt-1]=np.array([cnt,i,rt.argmin()]) cnt+=1 return track2track.astype(int)
def test_zhang_distances(): xyz1 = np.array([[0, 0, 0], [1, 0, 0], [2, 0, 0], [3, 0, 0]]) xyz2 = np.array([[0, 1, 1], [1, 0, 1], [2, 3, -2]]) # dm=array([[ 2, 2, 17], [ 3, 1, 14], [6, 2, 13], [11, 5, 14]]) # this is the distance matrix between points of xyz1 # and points of xyz2 zd = tm.zhang_distances(xyz1, xyz2) # {'average_mean_closest_distance': 3.9166666666666665, # 'maximum_mean_closest_distance': 5.333333333333333, # 'minimum_mean_closest_distance': 2.5} yield assert_almost_equal, zd[0], 1.76135602742 xyz1 = xyz1.astype('float32') xyz2 = xyz2.astype('float32') zd2 = pf.zhang_distances(xyz1, xyz2) yield assert_almost_equal, zd2[0], 1.76135602742
def corresponding_tracks(self,indices,tracks1,tracks2): ''' Detect similar tracks in different brains ''' li=len(indices) track2track=np.zeros((li,3)) cnt=0 for i in indices: rt=[pf.zhang_distances(tracks1[i],t,'avg') for t in tracks2] rt=np.array(rt) track2track[cnt-1]=np.array([cnt,i,rt.argmin()]) cnt+=1 return track2track.astype(int)
def detect_corresponding_tracks_extended(indices, tracks1, indices2, tracks2): """ Detect corresponding tracks from 1 to 2 Parameters: ---------------- indices: sequence of indices of tracks1 that are to be detected in tracks2 tracks1: sequence of tracks as arrays, shape (N1,3) .. (Nm,3) indices2: sequence of indices of tracks2 in the initial brain tracks2: sequence of tracks as arrays, shape (M1,3) .. (Mm,3) Returns: ----------- track2track: array of int showing the correspondance """ li = len(indices) track2track = np.zeros((li, 3)) cnt = 0 for i in indices: rt = [pf.zhang_distances(tracks1[i], t, "avg") for t in tracks2] rt = np.array(rt) track2track[cnt - 1] = np.array([cnt, i, indices2[rt.argmin()]]) cnt += 1 return track2track.astype(int)