#import matplotlib.pyplot as plt #plt.ion() import numpy as np import ctadpole import random n=1382 m=200 per = 0.5 # desired percentage of total connections id_chosen = 4 # desired type of cells for which decrease probability of connections from these type of cells def build_probability_matrix(): path='/home/andrea/Desktop/computer_right/Evenbody CONNECTOME 22January2013 with SYN_PROBABILITY/connectomes/' # path of the sample connetomes all_cellists=[] # vector containig the cellists of the different sampled connectomes for connectome_id in range(1,m+1): print connectome_id # load sample connectome i cellist=ctadpole.load_cells(path+'DendriteGrad'+str(connectome_id)+'.txt',path+'inc_connectGrad'+str(connectome_id)+'.txt', properties_file_path=None) idx=[x.type_id for x in cellist] idx=np.array(idx) vec_idx=[] for i in xrange(7): v=np.where(idx==i) vec_idx.append(v[0].tolist()) vec_idx=np.concatenate((vec_idx)).tolist() # create new cellist with ordered positions new_cellist=[cellist[ind] for ind in vec_idx] for i in xrange(n): new_cellist[i].id=i all_cellists.append(new_cellist) # ===== BUILD THE PROBABILITY MATRIX BETWEEN EACH CELL TYPE AND MEAN VALUES ===== P=np.zeros((n,n)) pos=np.zeros((n,1)) dendrite_bounds=np.zeros((n,2)) count=1 for x in all_cellists: print count A=np.zeros((n,n)) for i in xrange(n): inc_conn=[y.id for y in x[i].incoming_connections] # calculate unique vector of incoming connections inc_conn=list(set(inc_conn)) # avoid multiple connections from single cell A[i,inc_conn]=+1 P[i,inc_conn]=P[i,inc_conn]+1 # mean values update pos[i]+=x[i].pos dendrite_bounds[i,0]+=x[i].dendrite_bounds[0] dendrite_bounds[i,1]+=x[i].dendrite_bounds[1] np.savetxt("many connectomes axon growth/A_connectome"+str(count)+".txt",A.transpose()) count=count+1 P=P/m pos=pos/m dendrite_bounds=dendrite_bounds/m np.savetxt("P_1000.txt",P) np.savetxt("pos_1000.txt",pos) np.savetxt("dendrite_bounds_1000.txt",dendrite_bounds) # ==== divide the cellist between left and right sides ==== def sort_cellist(cellist): left_cellist=[] right_cellist=[] for x in cellist: if x.body_side==1: left_cellist.append(x) else: right_cellist.append(x) newout_cellist=np.concatenate([left_cellist,right_cellist]).tolist() return newout_cellist def build_new_connectome(num): pos=np.loadtxt("pos.txt") dendrite_bounds=np.loadtxt("dendrite_bounds.txt") P=np.loadtxt("P_1000.txt") A=np.zeros(P.shape) path='../PyNN_Tadpole_Simulation (copy)/txt files/'; sample_cellist=ctadpole.load_cells(path+'DendriteGrad1.txt',path+'inc_connectGrad1.txt', properties_file_path=None) idx=np.array([x.type_id for x in sample_cellist]) new_cellist=[] vec_idx=[np.where(idx==i)[0].tolist() for i in xrange(7)] vec_idx=np.concatenate((vec_idx)).tolist() new_cellist=[sample_cellist[ind] for ind in vec_idx] for i in xrange(n): new_cellist[i].id=i out_cellist=[] for i in xrange(n): out_cellist.append(ctadpole.Cell(new_cellist[i].id, new_cellist[i].type_id, new_cellist[i].relative_id, pos[i], dendrite_bounds=(dendrite_bounds[i,0],dendrite_bounds[i,1]), body_side=new_cellist[i].body_side)) out_cellist[-1].properties_dict = new_cellist[i].properties_dict out_cellist[-1].primary_axon_points = new_cellist[i].primary_axon_points out_cellist[-1].secondary_axon_points = new_cellist[i].secondary_axon_points #out_cellist[-1].incoming_connections = new_cellist[i].incoming_connections np.random.seed(int(random.getrandbits(32))) count=0 ''' A=np.loadtxt("A_connectome.txt") for i in xrange(n): for j in xrange(n): if A[i,j]==1: out_cellist[i].incoming_connections.append(out_cellist[j]) ''' for i in xrange(n): for j in xrange(n): if out_cellist[j].type_id==4 and pos[i]<pos[j]: P[i,j]=0 for i in xrange(n): for j in xrange(n): if np.random.binomial(1,P[i,j]): A[i,j]=1 out_cellist[i].incoming_connections.append(out_cellist[j]) number_types=[] ids=[cell.type_id for cell in out_cellist] for i in xrange(7): number_types.append(len([x for x in ids if x==i])) print number_types conn={i: len([j for j in out_cellist[i].incoming_connections]) for i in xrange(n)} totnum_conn=np.sum(conn[x] for x in xrange(n)) sample_conn={i: len([j for j in new_cellist[i].incoming_connections]) for i in xrange(n)} sample_totnum_conn=np.sum(sample_conn[x] for x in xrange(n)) num_incconn_type=[] id_start=0; id_stop=number_types[0] for k in xrange(7): num_incconn_type.append(np.sum([len([x for x in out_cellist[i].incoming_connections]) for i in range(id_start,id_stop)])) if k!=6: id_start=id_stop+1; id_stop=id_stop+number_types[k+1] sample_num_incconn_type=[] id_start=0; id_stop=number_types[0] for k in xrange(7): sample_num_incconn_type.append(np.sum([len([x for x in new_cellist[i].incoming_connections]) for i in range(id_start,id_stop)])) if k!=6: id_start=id_stop+1; id_stop=id_stop+number_types[k+1] # ==== PROBABILITY OF CONNECTIONS BETWEEN DIFFERENT TYPES OF CELLS IN Q_conn_tot ==== P = P.transpose() # get the probability of i connects to j - i is now presinaptic, j postsynaptic id_start=0; id_stop=number_types[0] Q_conn_tot = np.zeros((7,7)) for k in xrange(7): id2_start=0; id2_stop=number_types[0] for l in xrange(7): Q_conn_tot[k,l] = np.sum(P[id_start:id_stop,id2_start:id2_stop]) if l!=6: id2_start=id2_stop+1; id2_stop=id2_stop+number_types[l+1] if k!=6: id_start=id_stop+1; id_stop=id_stop+number_types[k+1] np.savetxt("Q_con",Q_conn_tot) # ==== SORT CELLISTS WITH LEFT-RIGHT POSITIONS ==== out_cellist=sort_cellist(out_cellist) for i in xrange(n): out_cellist[i].id=i #new_cellist=sort_cellist(new_cellist) #for i in xrange(n): # new_cellist[i].id=i path='../PyNN_Tadpole_Simulation (copy)/connectome files/' ctadpole.save_cells(out_cellist, path+'cell_file'+str(num)+'.txt', path+'connectome'+str(num)+'.txt') np.save(path+"figures/A"+str(num)+".npy",A) import main pop=main.main_full(str(num)) return pop def load_cells(cell_file_path, connectome_file_path, properties_file_path=None): cell_file = open(cell_file_path, "rt") type_counts = {} cell_list = [] for l in cell_file.readlines(): toks = l.split() id = int(float(toks[0])) - 1 type_id = int(float(toks[1])) - 1 if type_id not in type_counts: type_counts[type_id] = 0 else: type_counts[type_id] += 1 relative_id = type_counts[type_id] pos = float(toks[2]) dendrite_bounds = (float(toks[4]), float(toks[3])) # Don't set body_side yet until we know how many cells there are cell_list.append(Cell(id, type_id, relative_id, pos, dendrite_bounds)) cell_file.close() for c in cell_list: c.body_side = 1 if c.id < len(cell_list)/2 else 2 connectome_file = open(connectome_file_path) connectome_file.readline() # Skip first line line = 1 for l in connectome_file.readlines(): cell = get_cell(cell_list, line-1) if cell is None: raise Exception("%s:%d: no cell with ID %d." % (connectome_file_path, line, line)) cols = [int(s) for s in l.split()] for i in range((cols[0] - 1) / 2): inc_id = cols[1 + i*2] - 1 inc_type = cols[2 + i*2] - 1 inc_cell = get_cell(cell_list, inc_id) if inc_cell is None: raise Exception("%s:%d: can't find cell ID %d." % (connectome_file_path, line, inc_id+1)) if inc_cell.type_id != inc_type: raise Exception("%s:%d: connectome and cell list specify different cell types (%d <> %d)." % (connectome_file_path, line, inc_cell.type_id, inc_type)) cell_list[line-1].incoming_connections.append(inc_cell) line += 1 connectome_file.close() if properties_file_path is not None: js_file = open(properties_file_path) js_root = json.load(js_file) for js in js_root["properties"]: cell = cell_list[js["id"]-1] cell.properties_dict = {k: js[k] for k in js.keys() if k not in ["id", "type"]} js_file.close() return cell_list