def files_by_dist(files,dists,cid,endf): #all_files,dists=get_cell_traces(cid,abfpath) afd=[(file,dist) for file,dist in zip(files,dists)] #afd.sort(key=lambda tup: tup[1]) fig=plt.figure(figsize=(20,20),frameon=False) for filepath,distance in afd: raw,block,segments,header=load_abf(filepath) #TODO fp segment dict like I had with queue/threading if len(segments)==1: continue for segment in segments: #for ass in segment.analogsignals: ass=segment.analogsignals[0] xs=np.linspace(0,.1,len(ass.times.base))+distance #center by distance #ys=(ass.base-np.min(ass.base))/(np.max(ass.base)-np.min(ass.base))-segment.index*1.5 #move down by segment number ys=(ass.base-np.mean(ass.base))/2.5+segment.index #move down by segment number plt.plot(xs[:len(xs)//14]*1000,ys[:len(ys)//14],'k-',label='%s'%distance) plt.ylim(-.2,5) plt.yticks(np.arange(0,5,1)) plt.xlabel('Distance from cell body in $\mu$m. Normalized trial length') plt.ylabel('Amplitude and run number') plt.title('Example traces as a function of distance from cell %s'%cid) #fig.frameon(False) #fig.patch.set_visible(False) ax=fig.axes[0] ax.spines['left'].set_edgecolor((1,1,1,1)) format_axes(ax) #embed() fig.savefig('/tmp/fd_%s_%s.png'%(cid,endf[-4:]),bbox_inches='tight',pad_inches=0)
def plot_count_spikes( filepath, signal_map): #FIXME integrate this with count_spikes properly """ useful for manual review """ raw, block, segments, header = load_abf(filepath) if list(raw.read_header()['nADCSamplingSeq'][:2]) != [1, 2]: #FIXME print('Not a ledstim file') return None, None nseg = len(segments) gains = header['fTelegraphAdditGain'] #TODO zero = transform_maker(0, 20 * gains[0]) #cell one = transform_maker(0, 5) #led plt.figure() counts = [] for seg, n in zip(segments, range(nseg)): if len(seg.analogsignals) != 2: print('No led channel found.') continue plt.subplot(nseg, 1, n + 1) nas = seg.size()['analogsignals'] signal = zero(seg.analogsignals[0]) led = one(seg.analogsignals[1]) led_on_index, base, maxV, minV = detect_led( led) #FIXME move this to count_spikes if not len(led_on_index): print('No led detected maxV: %s minV: %s' % (maxV, minV)) continue sig_on = signal.base[led_on_index] sig_mean = np.mean(sig_on) sig_std = np.std(sig_on) #plt.plot(sig_std+sig_mean) sm_arr = base * sig_mean std_arr = base * sig_std thresh = 3.3 s_list = detect_spikes(sig_on, thresh, 5) counts.append(len(s_list)) [plt.plot(s, sig_on[s], 'ro') for s in s_list] #plot all the spikes plt.plot(sig_on, 'k-') plt.plot(sm_arr, 'b-') plt.fill_between(np.arange(len(sm_arr)), sm_arr - std_arr * thresh, sm_arr + std_arr * thresh, color=(.8, .8, 1)) plt.xlim((0, len(sig_on))) plt.title('%s spikes %s' % (len(s_list), block.file_origin)) #plt.title(block.file_origin) #plt.title('%s Segment %s'%(block.file_origin,n)) return np.mean(counts), np.var(counts), counts
def plot_abf(filepath,signal_map): #FIXME need better abstraction for the sigmap raw,block,segments=load_abf(filepath) nseg=len(segments) plt.figure() for seg,n in zip(segments,range(nseg)): plt.title(block.file_origin) #plt.title('%s Segment %s'%(block.file_origin,n)) nas=seg.size()['analogsignals'] for anasig,i in zip(seg.analogsignals,range(nas)): plt.subplot(nas,1,i+1) stp=signal_map[i](anasig) plot_signal(stp)
def plot_abf(filepath, signal_map): #FIXME need better abstraction for the sigmap raw, block, segments = load_abf(filepath) nseg = len(segments) plt.figure() for seg, n in zip(segments, range(nseg)): plt.title(block.file_origin) #plt.title('%s Segment %s'%(block.file_origin,n)) nas = seg.size()['analogsignals'] for anasig, i in zip(seg.analogsignals, range(nas)): plt.subplot(nas, 1, i + 1) stp = signal_map[i](anasig) plot_signal(stp)
def plot_count_spikes(filepath,signal_map): #FIXME integrate this with count_spikes properly """ useful for manual review """ raw,block,segments,header=load_abf(filepath) if list(raw.read_header()['nADCSamplingSeq'][:2]) != [1,2]: #FIXME print('Not a ledstim file') return None,None nseg=len(segments) gains=header['fTelegraphAdditGain'] #TODO zero=transform_maker(0,20*gains[0]) #cell one=transform_maker(0,5) #led plt.figure() counts=[] for seg,n in zip(segments,range(nseg)): if len(seg.analogsignals) != 2: print('No led channel found.') continue plt.subplot(nseg,1,n+1) nas=seg.size()['analogsignals'] signal=zero(seg.analogsignals[0]) led=one(seg.analogsignals[1]) led_on_index,base,maxV,minV=detect_led(led) #FIXME move this to count_spikes if not len(led_on_index): print('No led detected maxV: %s minV: %s'%(maxV,minV)) continue sig_on=signal.base[led_on_index] sig_mean=np.mean(sig_on) sig_std=np.std(sig_on) #plt.plot(sig_std+sig_mean) sm_arr=base*sig_mean std_arr=base*sig_std thresh=3.3 s_list=detect_spikes(sig_on,thresh,5) counts.append(len(s_list)) [plt.plot(s,sig_on[s],'ro') for s in s_list] #plot all the spikes plt.plot(sig_on,'k-') plt.plot(sm_arr,'b-') plt.fill_between(np.arange(len(sm_arr)),sm_arr-std_arr*thresh,sm_arr+std_arr*thresh,color=(.8,.8,1)) plt.xlim((0,len(sig_on))) plt.title('%s spikes %s'%(len(s_list),block.file_origin)) #plt.title(block.file_origin) #plt.title('%s Segment %s'%(block.file_origin,n)) return np.mean(counts),np.var(counts),counts
def count_spikes(filepath, signal_map): #TODO raw, block, segments, header = load_abf(filepath) nseg = len(segments) gains = header['fTelegraphAdditGain'] #TODO zero = transform_maker(0, 20 * gains[0]) #cell one = transform_maker(0, 5) #led counts = [] for seg, n in zip(segments, range(nseg)): nas = seg.size()['analogsignals'] signal = zero(seg.analogsignals[0]) led = one(seg.analogsignals[1]) led_on_index = np.where(led.base < led.base[0] - .05)[0] base = np.ones_like(led_on_index) sig_on = signal.base[led_on_index] thresh = 3.3 #print(filepath) s_list = detect_spikes(sig_on, thresh, 5) counts.append(len(s_list)) return np.mean(counts), np.var(counts), counts
def count_spikes(filepath,signal_map): #TODO raw,block,segments,header=load_abf(filepath) nseg=len(segments) gains=header['fTelegraphAdditGain'] #TODO zero=transform_maker(0,20*gains[0]) #cell one=transform_maker(0,5) #led counts=[] for seg,n in zip(segments,range(nseg)): nas=seg.size()['analogsignals'] signal=zero(seg.analogsignals[0]) led=one(seg.analogsignals[1]) led_on_index=np.where(led.base < led.base[0]-.05)[0] base=np.ones_like(led_on_index) sig_on=signal.base[led_on_index] thresh=3.3 #print(filepath) s_list=detect_spikes(sig_on,thresh,5) counts.append(len(s_list)) return np.mean(counts),np.var(counts),counts
def files_by_dist(files, dists, cid, endf): #all_files,dists=get_cell_traces(cid,abfpath) afd = [(file, dist) for file, dist in zip(files, dists)] #afd.sort(key=lambda tup: tup[1]) fig = plt.figure(figsize=(20, 20), frameon=False) for filepath, distance in afd: raw, block, segments, header = load_abf( filepath) #TODO fp segment dict like I had with queue/threading if len(segments) == 1: continue for segment in segments: #for ass in segment.analogsignals: ass = segment.analogsignals[0] xs = np.linspace(0, .1, len( ass.times.base)) + distance #center by distance #ys=(ass.base-np.min(ass.base))/(np.max(ass.base)-np.min(ass.base))-segment.index*1.5 #move down by segment number ys = (ass.base - np.mean( ass.base)) / 2.5 + segment.index #move down by segment number plt.plot(xs[:len(xs) // 14] * 1000, ys[:len(ys) // 14], 'k-', label='%s' % distance) plt.ylim(-.2, 5) plt.yticks(np.arange(0, 5, 1)) plt.xlabel('Distance from cell body in $\mu$m. Normalized trial length') plt.ylabel('Amplitude and run number') plt.title('Example traces as a function of distance from cell %s' % cid) #fig.frameon(False) #fig.patch.set_visible(False) ax = fig.axes[0] ax.spines['left'].set_edgecolor((1, 1, 1, 1)) format_axes(ax) #embed() fig.savefig('/tmp/fd_%s_%s.png' % (cid, endf[-4:]), bbox_inches='tight', pad_inches=0)
def dothing(args): fp1, fp2, d1, d2 = args fn = fp1.split('/')[-1] figure = plt.figure(figsize=(20, 20)) spike_counts = [] spike_dist = None base_counts = [] base_dist = None for filepath, distance in zip((fp1, fp2), (d1, d2)): raw, block, segments, header = load_abf(filepath) if list(raw.read_header()['nADCSamplingSeq'][:2]) != [1, 2 ]: #FIXME print('Not a ledstim file') return None, None #print(header['nADCSamplingSeq']) #gain debugging #print(header['nTelegraphEnable']) #print(header['fTelegraphAdditGain']) #gains=header['fTelegraphAdditGain'] #TODO #print(fn,gains) #TODO cell.headstage number?! #headstage_number=1 #FIXME #gain=gains[headstage_number] #FIXME the problem I think is still in AxonIO #zero=transform_maker(0,20*gain) #FIXME where does the first 20 come from !? #one=transform_maker(0,5) #led #one=transform_maker(0,10) #led no idea why the gain is different for these nseg = len(segments) for seg, n in zip(segments, range(nseg)): title_base = '' if nseg == 1: plt.subplot(6, 1, 6) base_fp = filepath else: dist_fp = filepath plt.subplot(6, 1, n + 1) signal = seg.analogsignals[0].base units_sig = seg.analogsignals[0].units sig_times = seg.analogsignals[0].times.base units_sig_times = seg.analogsignals[0].times.units led = seg.analogsignals[1].base led_on_index, base, maxV, minV = detect_led( led) #FIXME move this to count_spikes if not len(led_on_index): print('No led detected maxV: %s minV: %s' % (maxV, minV)) continue sig_on = signal[led_on_index] sig_on_times = sig_times[ led_on_index] #FIXME may not be synch? sig_mean = np.mean(sig_on) sig_std = np.std(sig_on) #plt.plot(sig_std+sig_mean) sm_arr = base * sig_mean sm_arr_times = sig_on_times #[led_on_index] std_arr = base * sig_std #do spike detection if spikes: spike_indexes, threshold = detect_spikes( sig_on, std_thrs, std_max, threshold_func(filepath)) spike_times = sig_on_times[spike_indexes] if spike_func(filepath): sc = spike_func(filepath)[seg.index] else: sc = len(spike_indexes) if nseg == 1: base_counts.append(sc) base_dist = distance else: spike_counts.append(sc) spike_dist = distance #TODO find a way to associate the spikecount with the DataFile plt.plot(spike_times, sig_on[spike_indexes], 'ro') title_base += '%s spikes ' % (sc) if do_plot: title_base += '%s $\mu$m from cell %s $\\verb|%s|$ ' % ( int(distance * 1000), cell_id, block.file_origin[:-4]) #title_base+='gain = %s *20'%gain plt.title(title_base) plt.xlabel(units_sig_times) plt.ylabel(units_sig) #plt.xlabel(led.times.units) #plt.ylabel(led.units) #plt.plot(led.times.base[led_on_index],led.base[led_on_index]) lrf = (sig_on_times[0], sig_on_times[-1]) plt.plot(sig_on_times[::10], sig_on[::10], 'k-', linewidth=1) plt.plot(lrf, [sig_mean] * 2, 'b-', label='sig mean') plt.plot(lrf, [threshold] * 2, 'm-', label='threshold') plt.plot(lrf, [sig_mean + sig_std * std_max] * 2, 'y-', label='max thresh') if threshold_func(filepath): plt.plot(lrf, [threshold_func(filepath)] * 2, 'g-', label='manual thresh') plt.fill_between(np.arange(len(sm_arr)), sm_arr - std_arr * std_thrs, sm_arr + std_arr * std_thrs, color=(.8, .8, 1)) plt.xlim((sig_on_times[0], sig_on_times[-1])) plt.legend(loc='upper right', fontsize='xx-small', frameon=False) spike_count_callback(base_counts, spike_counts, base_dist, spike_dist, dist_fp, base_fp) spath = '/tmp/' + str(cell_id) + '_' + fn[:-4] + '.png' if do_plot: print(spath) plt.savefig(spath, bbox_inches='tight', pad_inches=0) #plt.show() figure.clf() #might reduce mem footprint plt.close() gc.collect()
def dothing(args): fp1,fp2,d1,d2=args fn=fp1.split('/')[-1] figure=plt.figure(figsize=(20,20)) spike_counts=[] spike_dist=None base_counts=[] base_dist=None for filepath,distance in zip((fp1,fp2),(d1,d2)): raw,block,segments,header=load_abf(filepath) if list(raw.read_header()['nADCSamplingSeq'][:2]) != [1,2]: #FIXME print('Not a ledstim file') return None,None #print(header['nADCSamplingSeq']) #gain debugging #print(header['nTelegraphEnable']) #print(header['fTelegraphAdditGain']) #gains=header['fTelegraphAdditGain'] #TODO #print(fn,gains) #TODO cell.headstage number?! #headstage_number=1 #FIXME #gain=gains[headstage_number] #FIXME the problem I think is still in AxonIO #zero=transform_maker(0,20*gain) #FIXME where does the first 20 come from !? #one=transform_maker(0,5) #led #one=transform_maker(0,10) #led no idea why the gain is different for these nseg=len(segments) for seg,n in zip(segments,range(nseg)): title_base='' if nseg == 1: plt.subplot(6,1,6) base_fp=filepath else: dist_fp=filepath plt.subplot(6,1,n+1) signal=seg.analogsignals[0].base units_sig=seg.analogsignals[0].units sig_times=seg.analogsignals[0].times.base units_sig_times=seg.analogsignals[0].times.units led=seg.analogsignals[1].base led_on_index,base,maxV,minV=detect_led(led) #FIXME move this to count_spikes if not len(led_on_index): print('No led detected maxV: %s minV: %s'%(maxV,minV)) continue sig_on=signal[led_on_index] sig_on_times=sig_times[led_on_index] #FIXME may not be synch? sig_mean=np.mean(sig_on) sig_std=np.std(sig_on) #plt.plot(sig_std+sig_mean) sm_arr=base*sig_mean sm_arr_times=sig_on_times #[led_on_index] std_arr=base*sig_std #do spike detection if spikes: spike_indexes,threshold=detect_spikes(sig_on,std_thrs,std_max,threshold_func(filepath)) spike_times=sig_on_times[spike_indexes] if spike_func(filepath): sc=spike_func(filepath)[seg.index] else: sc=len(spike_indexes) if nseg == 1: base_counts.append(sc) base_dist=distance else: spike_counts.append(sc) spike_dist=distance #TODO find a way to associate the spikecount with the DataFile plt.plot(spike_times,sig_on[spike_indexes],'ro') title_base+='%s spikes '%(sc) if do_plot: title_base+='%s $\mu$m from cell %s $\\verb|%s|$ '%(int(distance*1000),cell_id,block.file_origin[:-4]) #title_base+='gain = %s *20'%gain plt.title(title_base) plt.xlabel(units_sig_times) plt.ylabel(units_sig) #plt.xlabel(led.times.units) #plt.ylabel(led.units) #plt.plot(led.times.base[led_on_index],led.base[led_on_index]) lrf=(sig_on_times[0],sig_on_times[-1]) plt.plot(sig_on_times[::10],sig_on[::10],'k-',linewidth=1) plt.plot(lrf,[sig_mean]*2,'b-', label = 'sig mean' ) plt.plot(lrf,[threshold]*2,'m-', label = 'threshold' ) plt.plot(lrf,[sig_mean+sig_std*std_max]*2,'y-', label = 'max thresh' ) if threshold_func(filepath): plt.plot(lrf,[threshold_func(filepath)]*2,'g-', label = 'manual thresh' ) plt.fill_between(np.arange(len(sm_arr)),sm_arr-std_arr*std_thrs,sm_arr+std_arr*std_thrs,color=(.8,.8,1)) plt.xlim((sig_on_times[0],sig_on_times[-1])) plt.legend(loc='upper right',fontsize='xx-small',frameon=False) spike_count_callback(base_counts,spike_counts,base_dist,spike_dist,dist_fp,base_fp) spath='/tmp/'+str(cell_id)+'_'+fn[:-4]+'.png' if do_plot: print(spath) plt.savefig(spath,bbox_inches='tight',pad_inches=0) #plt.show() figure.clf() #might reduce mem footprint plt.close() gc.collect()