Пример #1
0
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)
Пример #2
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
Пример #3
0
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)
Пример #4
0
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)
Пример #5
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
Пример #6
0
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
Пример #7
0
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
Пример #8
0
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)
Пример #9
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()
Пример #10
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()