def C_analysis_pdf(datafile, iprotocol=0, Nmax=1000000, roi=0):

    data = MultimodalData(datafile)

    if not os.path.isdir(summary_pdf_folder(datafile)):
        os.mkdir(summary_pdf_folder(datafile))

    pdf_filename = os.path.join(
        summary_pdf_folder(datafile),
        '%s-gratings-analysis.pdf' % data.protocols[iprotocol])

    if roi == 0:
        ROIs = np.arange(data.iscell.sum())[:Nmax]
    else:
        ROIs = [roi]

    CELL_RESPS = []
    with PdfPages(pdf_filename) as pdf:

        for roi in ROIs:

            fig, cell_resp = C_ROI_analysis(data,
                                            roiIndex=roi,
                                            iprotocol=iprotocol)
            CELL_RESPS.append(cell_resp)

            pdf.savefig(fig)  # saves the current figure into a pdf page
            plt.close(fig)

        fig = summary_fig(CELL_RESPS)

        pdf.savefig(fig)
        plt.close(fig)

    print('[ok] moving dot analysis saved as: "%s" ' % pdf_filename)
def DS_analysis_pdf(datafile, iprotocol=0, Nmax=1000000):

    data = MultimodalData(datafile)

    pdf_filename = os.path.join(
        summary_pdf_folder(datafile),
        '%s-direction_selectivity.pdf' % data.protocols[iprotocol])

    Nresp, SIs = 0, []
    with PdfPages(pdf_filename) as pdf:

        for roi in np.arange(data.iscell.sum())[:Nmax]:

            print('   - direction-selectivity analysis for ROI #%i / %i' %
                  (roi + 1, data.iscell.sum()))
            fig, SI, responsive = DS_ROI_analysis(data,
                                                  roiIndex=roi,
                                                  iprotocol=iprotocol)
            pdf.savefig()  # saves the current figure into a pdf page
            plt.close()

            if responsive:
                Nresp += 1
                SIs.append(SI)

        summary_fig2(Nresp,
                     data.iscell.sum(),
                     SIs,
                     label='Direct. Select. Index')
        pdf.savefig()  # saves the current figure into a pdf page
        plt.close()

    print('[ok] direction selectivity analysis saved as: "%s" ' % pdf_filename)
예제 #3
0
def population_analysis(FILES,
                        min_time_minutes=2,
                        exclude_subjects=[],
                        ax=None,
                        running_speed_threshold=0.1):

    times, fracs_running, subjects = [], [], []
    if ax is None:
        fig, ax = ge.figure(figsize=(5, 1), top=5)
    else:
        fig = None

    for f in FILES:

        data = MultimodalData(f)
        if (data.nwbfile is not None) and ('Running-Speed'
                                           in data.nwbfile.acquisition):
            speed = data.nwbfile.acquisition['Running-Speed'].data[:]
            max_time = len(
                speed) / data.nwbfile.acquisition['Running-Speed'].rate
            if (max_time > 60 * min_time_minutes) and (
                    data.metadata['subject_ID'] not in exclude_subjects):
                times.append(max_time)
                fracs_running.append(
                    100 * np.sum(speed > running_speed_threshold) / len(speed))
                subjects.append(data.metadata['subject_ID'])

    i = -1
    for c, s in enumerate(np.unique(subjects)):
        s_cond = np.array(subjects) == s
        ax.bar(np.arange(1 + i, i + 1 + np.sum(s_cond)),
               np.array(fracs_running)[s_cond] + 1,
               width=.75,
               color=plt.cm.tab10(c % 10))
        i += np.sum(s_cond) + 1
    ax.bar([i + 2], [np.mean(fracs_running)],
           yerr=[np.std(fracs_running)],
           width=1.5,
           color='grey')
    ge.annotate(ax,
                'frac. running:\n%.1f+/-%.1f %%' %
                (np.mean(fracs_running), np.std(fracs_running)),
                (i + 3, np.mean(fracs_running)),
                xycoords='data')
    ge.set_plot(ax,
                xticks=[],
                xlabel='\nrecording',
                ylabel='       frac. running (%)')
    ymax, i = ax.get_ylim()[1], -1
    for c, s in enumerate(np.unique(subjects)):
        s_cond = np.array(subjects) == s
        ge.annotate(ax,
                    s, (1 + i, ymax),
                    rotation=90,
                    color=plt.cm.tab10(c % 10),
                    xycoords='data',
                    size='x-small')
        i += np.sum(s_cond) + 1
    return fig, ax
예제 #4
0
def analysis_pdf(datafile, iprotocol=0, Nmax=1000000):

    data = MultimodalData(datafile)

    pdf_filename = os.path.join(summary_pdf_folder(datafile), '%s-secondary_RF.pdf' % data.protocols[iprotocol])

    # find center and surround
    icenter = np.argwhere([('center' in p) for p in data.protocols])[0][0]
    isurround = np.argwhere([('surround' in p) for p in data.protocols])[0][0]
    
    curves, results = [], {'Ntot':data.iscell.sum()}
    with PdfPages(pdf_filename) as pdf:

        for roi in np.arange(data.iscell.sum())[:Nmax]:

            print('   - secondary-RF analysis for ROI #%i / %i' % (roi+1, data.iscell.sum()))
            # fig, fig2, radii, max_response_curve, imax_response_curve, full_resp = ROI_analysis(data, roiIndex=roi,
            #                                                                                     iprotocol_center=icenter,
            #                                                                                     iprotocol_surround=isurround)
            FIGS = ROI_analysis(data, roiIndex=roi,
                                iprotocol_center=icenter,
                                iprotocol_surround=isurround)
            for fig in FIGS:
                pdf.savefig(fig)
                plt.close(fig)
            
        #     pdf.savefig(fig2)
        #     plt.close(fig2)

        #     if max_response_curve is not None:
        #         curves.append(max_response_curve)

        #     # initialize if not done
        #     for key in full_resp:
        #         if ('-bins' in key) and (key not in results):
        #             results[key] = full_resp[key]
        #         elif (key not in results):
        #             results[key] = []
                    
        #     significant_cond = (full_resp['significant']==True)
        #     if np.sum(significant_cond)>0:
        #         imax = np.argmax(full_resp['value'][significant_cond])
        #         for key in full_resp:
        #             if ('-bins' not in key):
        #                 results[key].append(full_resp[key][significant_cond][imax])

        # if len(results['value'])>0:
            
        #     fig = SS_summary_fig(results)
        #     pdf.savefig(fig)
        #     plt.close(fig)

        #     fig = summary_fig(radii, curves, data.iscell.sum())
        #     pdf.savefig(fig)
        #     plt.close(fig)

    print('[ok] secondary RF analysis saved as: "%s" ' % pdf_filename)
예제 #5
0
def analysis_pdf(datafile, iprotocol=0, Nmax=1000000):

    data = MultimodalData(datafile)

    pdf_filename = os.path.join(
        summary_pdf_folder(datafile),
        '%s-surround_suppression.pdf' % data.protocols[iprotocol])

    curves, results = [], {'Ntot': data.iscell.sum()}
    with PdfPages(pdf_filename) as pdf:

        for roi in np.arange(data.iscell.sum())[:Nmax]:

            print('   - surround-suppression analysis for ROI #%i / %i' %
                  (roi + 1, data.iscell.sum()))
            fig, fig2, radii, max_response_curve, imax_response_curve, full_resp = ROI_analysis(
                data, roiIndex=roi, iprotocol=iprotocol)
            pdf.savefig(fig)
            pdf.savefig(fig2)
            plt.close(fig)
            plt.close(fig2)

            if max_response_curve is not None:
                curves.append(max_response_curve)

            # initialize if not done
            for key in full_resp:
                if ('-bins' in key) and (key not in results):
                    results[key] = full_resp[key]
                elif (key not in results):
                    results[key] = []

            significant_cond = (full_resp['significant'] == True)
            if np.sum(significant_cond) > 0:
                imax = np.argmax(full_resp['value'][significant_cond])
                for key in full_resp:
                    if ('-bins' not in key):
                        results[key].append(
                            full_resp[key][significant_cond][imax])

        if len(results['value']) > 0:

            fig = SS_summary_fig(results)
            pdf.savefig(fig)
            plt.close(fig)

            fig = summary_fig(radii, curves, data.iscell.sum())
            pdf.savefig(fig)
            plt.close(fig)

    print('[ok] direction selectivity analysis saved as: "%s" ' % pdf_filename)
예제 #6
0
def analysis_pdf(datafile, Tzoom=120, NzoomPlot=3):

    pdf_filename = os.path.join(summary_pdf_folder(datafile), 'behavior.pdf')

    data = MultimodalData(datafile)

    with PdfPages(pdf_filename) as pdf:

        print('* plotting behavioral data as "behavior.pdf" [...]')

        print('   - raw behavior plot ')
        fig, ax = plt.subplots(1, figsize=(11.4, 3.5))
        fig.subplots_adjust(top=0.8, bottom=0.05)

        subsampling = max(
            [int((data.tlim[1] - data.tlim[0]) / data.CaImaging_dt / 1000), 1])
        data.plot_raw_data(
            data.tlim,
            settings=raw_data_plot_settings(
                data,
                subsampling_factor=int((data.tlim[1] - data.tlim[0]) / 60. +
                                       1)),
            ax=ax)

        axT = add_inset_with_time_sample(data.tlim, data.tlim, plt)
        pdf.savefig()  # saves the current figure into a pdf page
        plt.close()

        # plot raw data sample
        for t0 in np.linspace(Tzoom, data.tlim[1], NzoomPlot):

            TLIM = [np.max([10, t0 - Tzoom]), t0]
            print('   - plotting raw data sample at times ', TLIM)

            fig, ax = plt.subplots(1, figsize=(11.4, 5))
            fig.subplots_adjust(top=0.8, bottom=0.05)
            data.plot_raw_data(TLIM,
                               settings=raw_data_plot_settings(
                                   data, subsampling_factor=1),
                               ax=ax)
            axT = add_inset_with_time_sample(TLIM, data.tlim, plt)
            pdf.savefig()  # saves the current figure into a pdf page
            plt.close()

        print('   - behavior analysis ')
        fig = analysis_fig(data)
        pdf.savefig()  # saves the current figure into a pdf page
        plt.close()

    print('[ok] behavioral data saved as: "%s" ' % pdf_filename)
예제 #7
0
def analysis_pdf(datafile,
                 NzoomPlot=5,
                 Nroi=10):

    pdf_filename = os.path.join(summary_pdf_folder(datafile), 'raw.pdf')

    data = MultimodalData(datafile)

    if data.metadata['CaImaging']:
        Tzoom=60
    else:
        Tzoom=20

    with PdfPages(pdf_filename) as pdf:
        
        print('* plotting raw data as "raw.pdf" [...]')
        
        fig, ax = plt.subplots(1, figsize=(11.4, 5))
        fig.subplots_adjust(top=0.8, bottom=0.05)
        
        print('   - plotting full data view')
        if data.metadata['CaImaging']:
            subsampling = max([int((data.tlim[1]-data.tlim[0])/data.CaImaging_dt/1000), 1])
        else:
            subsampling = 1
            
        data.plot_raw_data(data.tlim,
                           settings=raw_data_plot_settings(data,
                                                           Nroi=Nroi,
                                                           subsampling_factor=int((data.tlim[1]-data.tlim[0])/60.+1)),
                           ax=ax)
        axT = add_inset_with_time_sample(data.tlim, data.tlim, plt)
        pdf.savefig()  # saves the current figure into a pdf page
        plt.close()

        # plot raw data sample
        for t0 in np.linspace(Tzoom, data.tlim[1], NzoomPlot):
            
            TLIM = [np.max([10,t0-Tzoom]),t0]
            print('   - plotting raw data sample at times ', TLIM)
            
            fig, ax = plt.subplots(1, figsize=(11.4, 5))
            fig.subplots_adjust(top=0.8, bottom=0.05)
            data.plot_raw_data(TLIM, settings=raw_data_plot_settings(data, Nroi=Nroi), ax=ax)
            axT = add_inset_with_time_sample(TLIM, data.tlim, plt)
            pdf.savefig()  # saves the current figure into a pdf page
            plt.close()
                
    print('[ok] raw data plot saved as: "%s" ' % pdf_filename)
예제 #8
0
def analysis_pdf(datafile, Nmax=1000000):

    pdf_filename = os.path.join(summary_pdf_folder(datafile), 'rois.pdf')

    data = MultimodalData(datafile)
    data.correctedFluo, data.F0 = data.build_dFoF(
        return_corrected_F_and_F0=True)

    with PdfPages(pdf_filename) as pdf:

        print('* plotting ROI analysis as "rois.pdf" [...]')
        print('   - plotting imaging FOV')
        fig, AX = plt.subplots(1, 5, figsize=(11.4, 2.5))
        plt.subplots_adjust(left=0.03, right=0.97)
        data.show_CaImaging_FOV(key='meanImg', NL=1, cmap='viridis', ax=AX[0])
        data.show_CaImaging_FOV(key='meanImg', NL=2, cmap='viridis', ax=AX[1])
        data.show_CaImaging_FOV(key='meanImgE', NL=2, cmap='viridis', ax=AX[2])
        data.show_CaImaging_FOV(key='max_proj', NL=2, cmap='viridis', ax=AX[3])
        try:
            data.show_CaImaging_FOV(key='meanImg_chan2',
                                    NL=2,
                                    cmap='viridis',
                                    ax=AX[4])
        except KeyError:
            AX[4].annotate('no red channel', (0.5, 0.5),
                           xycoords='axes fraction',
                           fontsize=9,
                           va='center',
                           ha='center')
            AX[4].axis('off')
        pdf.savefig()  # saves the current figure into a pdf page
        plt.close()
        for i in np.arange(data.nROIs)[:Nmax]:
            print('   - plotting analysis of ROI #%i' % (i + 1))
            try:
                fig = raw_fluo_fig(data, roiIndex=i)
                pdf.savefig(fig)  # saves the current figure into a pdf page
                plt.close(fig)
                fig = analysis_fig(data, roiIndex=i)
                pdf.savefig(fig)  # saves the current figure into a pdf page
                plt.close(fig)
            except BaseException as be:
                print(be)
                print('  /!\ Pb with ROI #%i /!\ ' % (i + 1))

    print('[ok] roi analysis saved as: "%s" ' % pdf_filename)
def analysis_pdf(datafile,
                 iprotocol=0,
                 response_significance_threshold=0.01,
                 roi=0,
                 Nmax=1000000):

    data = MultimodalData(datafile)

    pdf_filename = os.path.join(
        summary_pdf_folder(datafile),
        '%s-moving-dots_selectivity.pdf' % data.protocols[iprotocol])

    if roi == 0:
        ROIs = np.arange(data.iscell.sum())[:Nmax]
    else:
        ROIs = [roi]

    CELL_RESPS = []
    with PdfPages(pdf_filename) as pdf:

        for roi in ROIs:

            fig, cell_resp = ROI_analysis(
                data,
                roiIndex=roi,
                iprotocol=iprotocol,
                response_significance_threshold=response_significance_threshold
            )
            CELL_RESPS.append(cell_resp)

            pdf.savefig(fig)  # saves the current figure into a pdf page
            plt.close(fig)

        fig = summary_fig(CELL_RESPS)

        pdf.savefig(fig)
        plt.close(fig)
        np.save(
            os.path.join(summary_pdf_folder(datafile),
                         'summary-moving-dot.npy'), CELL_RESPS)

    print('[ok] moving dot analysis saved as: "%s" ' % pdf_filename)
예제 #10
0
def analysis_pdf(datafile, iprotocol=0, Nmax=1000000):

    data = MultimodalData(datafile, with_visual_stim=True)

    pdf_filename = os.path.join(
        summary_pdf_folder(datafile),
        '%s-RF_mapping.pdf' % data.protocols[iprotocol])

    curves, results = [], {'Ntot': data.iscell.sum()}
    with PdfPages(pdf_filename) as pdf:

        for roi in np.arange(data.iscell.sum())[:Nmax]:

            print('   - RF mapping analysis for ROI #%i / %i' %
                  (roi + 1, data.iscell.sum()))
            fig = ROI_analysis(data, roiIndex=roi, iprotocol=iprotocol)
            pdf.savefig(fig)
            plt.close(fig)

    print('[ok] RF mapping analysis saved as: "%s" ' % pdf_filename)
def analysis_pdf(datafile, iprotocol=0, Nmax=1000000):

    data = MultimodalData(datafile)

    pdf_filename = os.path.join(
        summary_pdf_folder(datafile),
        '%s-contrast_curves.pdf' % data.protocols[iprotocol])

    if data.metadata['CaImaging']:

        results = {'Ntot': data.iscell.sum()}

        with PdfPages(pdf_filename) as pdf:

            CURVES = []
            for roi in np.arange(data.iscell.sum())[:Nmax]:
                print('   - contrast-curves analysis for ROI #%i / %i' %
                      (roi + 1, data.iscell.sum()))
                fig, contrasts, max_response_curve = ROI_analysis(
                    data, roiIndex=roi, iprotocol=iprotocol)
                pdf.savefig(fig)
                plt.close(fig)
                if np.max(max_response_curve) > 0:
                    CURVES.append(max_response_curve)
            #
            fig = summary_fig(contrasts, CURVES, data.iscell.sum())
            pdf.savefig(fig)
            plt.close(fig)

    elif data.metadata['Electrophy']:
        with PdfPages(pdf_filename) as pdf:
            fig, fig2 = Ephys_analysis(data, iprotocol=iprotocol)
            pdf.savefig(fig)
            plt.close(fig)
            pdf.savefig(fig2)
            plt.close(fig2)

    print('[ok] contrast-curves analysis saved as: "%s" ' % pdf_filename)
def analysis_pdf(datafile,
                 iprotocol=-1,
                 Nmax=2,
                 verbose=False):

    data = MultimodalData(datafile)

    if iprotocol<0:
        iprotocol = np.argwhere([('gaussian-blobs' in p) for p in data.protocols])[0][0]
        print('gaussian-blob analysis for protocol #', iprotocol)
    
    pdf_filename = os.path.join(summary_pdf_folder(datafile), '%s-flashes.pdf' % data.protocols[iprotocol])
    
    
    if data.metadata['CaImaging']:

        # results = {'Ntot':data.iscell.sum()}
    
        with PdfPages(pdf_filename) as pdf:
            
            fig = Ophys_analysis(data,
                                 Nmax=Nmax,
                                 verbose=verbose)
            
            pdf.savefig(fig)
            plt.close(fig)

            
    elif data.metadata['Electrophy']:
        with PdfPages(pdf_filename) as pdf:
            fig, fig2 = Ephys_analysis(data, iprotocol=iprotocol)
            pdf.savefig(fig)
            plt.close(fig)
            pdf.savefig(fig2)
            plt.close(fig2)
            

    print('[ok] gaussian-blobs analysis saved as: "%s" ' % pdf_filename)
예제 #13
0
def make_sumary_pdf(filename,
                    Nmax=1000000,
                    include=['exp', 'rois', 'raw', 'protocols'],
                    T_raw_data=60,
                    N_raw_data=5,
                    ROI_raw_data=20,
                    Tbar_raw_data=5):

    data = MultimodalData(filename)
    data.roiIndices = np.sort(
        np.random.choice(np.arange(data.iscell.sum()),
                         size=min([data.iscell.sum(), ROI_raw_data]),
                         replace=False))

    folder = filename.replace('.nwb', '')
    if not os.path.isdir(folder):
        os.mkdir(folder)

    if 'exp' in include:
        with PdfPages(os.path.join(folder, 'exp.pdf')) as pdf:

            print('writing experimental metadata ')
            fig = metadata_fig(data)
            pdf.savefig()  # saves the current figure into a pdf page
            plt.close()

            print('plotting behavior analysis ')
            fig = behavior_analysis_fig(data)
            pdf.savefig()  # saves the current figure into a pdf page
            plt.close()

    if 'exp' in include:
        with PdfPages(os.path.join(folder, 'rois.pdf')) as pdf:

            print('plotting imaging FOV ')
            fig, AX = plt.subplots(1, 4, figsize=(11.4, 2))
            data.show_CaImaging_FOV(key='meanImg',
                                    NL=1,
                                    cmap='viridis',
                                    ax=AX[0])
            data.show_CaImaging_FOV(key='meanImg',
                                    NL=2,
                                    cmap='viridis',
                                    ax=AX[1])
            data.show_CaImaging_FOV(key='meanImgE',
                                    NL=2,
                                    cmap='viridis',
                                    ax=AX[2])
            data.show_CaImaging_FOV(key='max_proj',
                                    NL=2,
                                    cmap='viridis',
                                    ax=AX[3])
            pdf.savefig()  # saves the current figure into a pdf page
            plt.close()

    if 'raw' in include:

        with PdfPages(os.path.join(folder, 'raw.pdf')) as pdf:

            print('plotting full data view [...]')
            fig, ax = plt.subplots(1, figsize=(11.4, 5))
            fig.subplots_adjust(top=0.8, bottom=0.05)
            data.plot(data.tlim,
                      settings=raw_data_plot_settings(data,
                                                      subsampling_factor=1000),
                      ax=ax,
                      Tbar=Tbar_raw_data)
            pdf.savefig()  # saves the current figure into a pdf page
            plt.close()

            # # plot raw data sample
            # for t0 in np.linspace(T_raw_data, data.tlim[1], N_raw_data):
            #     TLIM = [np.max([10,t0-T_raw_data]),t0]
            #     print('plotting raw data sample at times ', TLIM)
            #     fig, ax = plt.subplots(1, figsize=(11.4, 5))
            #     fig.subplots_adjust(top=0.8, bottom=0.05)
            #     data.plot(TLIM, settings=raw_data_plot_settings(data),
            #               ax=ax, Tbar=Tbar_raw_data)
            #     # inset with time sample
            #     axT = plt.axes([0.6, 0.9, 0.3, 0.05])
            #     axT.axis('off')
            #     axT.plot(data.tlim, [0,0], 'k-', lw=2)
            #     axT.plot(TLIM, [0,0], '-', color=plt.cm.tab10(3), lw=5)
            #     axT.annotate('0 ', (0,0), xycoords='data', ha='right', fontsize=9)
            #     axT.annotate(' %.1fmin' % (data.tlim[1]/60.), (data.tlim[1],0), xycoords='data', fontsize=9)
            #     pdf.savefig()  # saves the current figure into a pdf page
            #     plt.close()

    print('looping over protocols for analysis [...]')

    if 'protocols' in include:
        # looping over protocols
        for p, protocol in enumerate(data.protocols):

            print('plotting protocol "%s" [...]' % protocol)

            with PdfPages(os.path.join(folder, '%s.pdf' % protocol)) as pdf:

                # finding protocol type
                protocol_type = (data.metadata['Protocol-%i-Stimulus' %
                                               (p + 1)] if
                                 (len(data.protocols) > 1) else
                                 data.metadata['Stimulus'])
                print(protocol_type)
                # then protocol-dependent analysis

                if protocol_type == 'full-field-grating':
                    from analysis.orientation_direction_selectivity import orientation_selectivity_analysis
                    Nresp, SIs = 0, []
                    for i in range(data.iscell.sum())[:Nmax]:
                        fig, SI, responsive = orientation_selectivity_analysis(
                            data, roiIndex=i, verbose=False)
                        pdf.savefig(
                        )  # saves the current figure into a pdf page
                        plt.close()
                        if responsive:
                            Nresp += 1
                            SIs.append(SI)
                    # summary figure for this protocol
                    fig, AX = summary_fig(Nresp, data.iscell.sum(),
                                          np.array(SIs))
                    pdf.savefig()  # saves the current figure into a pdf page
                    plt.close()

                elif protocol_type == 'drifting-full-field-grating':
                    from analysis.orientation_direction_selectivity import direction_selectivity_analysis
                    Nresp, SIs = 0, []
                    for i in range(data.iscell.sum())[:Nmax]:
                        fig, SI, responsive = direction_selectivity_analysis(
                            data, roiIndex=i, verbose=False)
                        pdf.savefig(
                        )  # saves the current figure into a pdf page
                        plt.close()
                        if responsive:
                            Nresp += 1
                            SIs.append(SI)
                    fig, AX = summary_fig(Nresp,
                                          data.iscell.sum(),
                                          np.array(SIs),
                                          label='Direction Select. Index')
                    pdf.savefig()  # saves the current figure into a pdf page
                    plt.close()

                elif protocol_type in [
                        'center-grating', 'drifting-center-grating'
                ]:
                    from surround_suppression import orientation_size_selectivity_analysis
                    Nresp, SIs = 0, []
                    for i in range(data.iscell.sum())[:Nmax]:
                        fig, responsive = orientation_size_selectivity_analysis(
                            data, roiIndex=i, verbose=False)
                        pdf.savefig(
                        )  # saves the current figure into a pdf page
                        plt.close()
                        if responsive:
                            Nresp += 1
                            SIs.append(0)  # TO BE FILLED
                    fig, AX = summary_fig(Nresp,
                                          data.iscell.sum(),
                                          np.array(SIs),
                                          label='none')
                    pdf.savefig()  # saves the current figure into a pdf page
                    plt.close()

                elif 'noise' in protocol_type:
                    from receptive_field_mapping import RF_analysis
                    Nresp, SIs = 0, []
                    for i in range(data.iscell.sum())[:Nmax]:
                        fig, SI, responsive = RF_analysis(data,
                                                          roiIndex=i,
                                                          verbose=False)
                        pdf.savefig(
                        )  # saves the current figure into a pdf page
                        plt.close()
                        if responsive:
                            Nresp += 1
                            SIs.append(0)  # TO BE FILLED
                    fig, AX = summary_fig(Nresp,
                                          data.iscell.sum(),
                                          np.array(SIs),
                                          label='none')
                    pdf.savefig()  # saves the current figure into a pdf page
                    plt.close()

                elif 'spatial-location' in protocol_type:
                    from surround_suppression import orientation_size_selectivity_analysis
                    Nresp, SIs = 0, []
                    for i in range(data.iscell.sum())[:Nmax]:
                        fig, responsive = orientation_size_selectivity_analysis(
                            data, roiIndex=i, verbose=False)
                        pdf.savefig(
                        )  # saves the current figure into a pdf page
                        plt.close()
                        if responsive:
                            Nresp += 1
                            SIs.append(0)  # TO BE FILLED
                    fig, AX = summary_fig(Nresp,
                                          data.iscell.sum(),
                                          np.array(SIs),
                                          label='none')
                    pdf.savefig()  # saves the current figure into a pdf page
                    plt.close()

    print('[ok] pdfs succesfully saved in "%s" !' % folder)
예제 #14
0
              labels=labels,
              autopct='%1.1f%%',
              shadow=True,
              startangle=90)
    AX[1].axis(
        'equal')  # Equal aspect ratio ensures that pie is drawn as a circle.
    AX[3].hist(quantity)
    AX[3].set_xlabel(label, fontsize=9)
    AX[3].set_ylabel('count', fontsize=9)
    for ax in [AX[0], AX[2]]:
        ax.axis('off')
    return fig, AX


if __name__ == '__main__':

    # filename = '/home/yann/DATA/Wild_Type/2021_03_11-17-13-03.nwb'
    filename = sys.argv[-1]

    # pdf_dir = os.path.join(os.path.dirname(filename), 'summary', os.path.basename(filename))

    data = MultimodalData(filename)

    # fig1 = metadata_fig(data)
    # fig2 = behavior_analysis_fig(data)
    # fig3 = roi_analysis_fig(data, roiIndex=0)
    # plt.show()

    # make_sumary_pdf(filename, include=['raw', 'protocols'])
    make_sumary_pdf(filename, include=['protocols'])
예제 #15
0
def make_summary_pdf(filename,
                     Nmax=1000000,
                     include=['exp', 'raw', 'behavior', 'rois', 'protocols'],
                     verbose=True):

    data = MultimodalData(filename)

    folder = summary_pdf_folder(filename)

    if 'exp' in include:

        with PdfPages(os.path.join(folder, 'exp.pdf')) as pdf:

            print('* writing experimental metadata as "exp.pdf" [...] ')

            print('   - notes')
            fig = metadata_fig(data)
            pdf.savefig()  # saves the current figure into a pdf page
            plt.close()
        print('[ok] notes saved as: "%s" ' % os.path.join(folder, 'exp.pdf'))

    if 'behavior' in include:

        process_script = os.path.join(
            str(pathlib.Path(__file__).resolve().parents[0]), 'behavior.py')
        p = subprocess.Popen('%s %s %s' %
                             (python_path, process_script, filename),
                             shell=True)

    if 'raw' in include:

        process_script = os.path.join(
            str(pathlib.Path(__file__).resolve().parents[0]), 'raw_data.py')
        p = subprocess.Popen('%s %s %s' %
                             (python_path, process_script, filename),
                             shell=True)

    if 'rois' in include:

        process_script = os.path.join(
            str(pathlib.Path(__file__).resolve().parents[0]), 'rois.py')
        p = subprocess.Popen('%s %s %s --Nmax %i' %
                             (python_path, process_script, filename, Nmax),
                             shell=True)

    if 'protocols' in include:

        print(data.metadata['protocol'])
        print('* looping over protocols for analysis [...]')

        # --- analysis of multi-protocols ---
        if data.metadata['protocol'] == 'NDNF-protocol':
            process_script = os.path.join(
                str(pathlib.Path(__file__).resolve().parents[0]),
                'protocol_scripts', 'ndnf_protocol.py')
            p = subprocess.Popen('%s %s %s --Nmax %i' %
                                 (python_path, process_script, filename, Nmax),
                                 shell=True)

        elif data.metadata['protocol'] == 'mismatch-negativity':
            process_script = os.path.join(
                str(pathlib.Path(__file__).resolve().parents[0]),
                'protocol_scripts', 'mismatch_negativity.py')
            p = subprocess.Popen('%s %s %s --Nmax %i' %
                                 (python_path, process_script, filename, Nmax),
                                 shell=True)

        elif ('surround-suppression'
              in data.metadata['protocol']) or ('size-tuning'
                                                in data.metadata['protocol']):
            process_script = os.path.join(
                str(pathlib.Path(__file__).resolve().parents[0]),
                'protocol_scripts', 'surround_suppression.py')
            p = subprocess.Popen('%s %s %s --Nmax %i' %
                                 (python_path, process_script, filename, Nmax),
                                 shell=True)

        elif ('spatial-location'
              in data.metadata['protocol']) or ('spatial-mapping'
                                                in data.metadata['protocol']):
            process_script = os.path.join(
                str(pathlib.Path(__file__).resolve().parents[0]),
                'protocol_scripts', 'spatial_selectivity.py')
            p = subprocess.Popen('%s %s %s --Nmax %i' %
                                 (python_path, process_script, filename, Nmax),
                                 shell=True)

        elif 'contrast-curve' in data.metadata['protocol']:
            process_script = os.path.join(
                str(pathlib.Path(__file__).resolve().parents[0]),
                'protocol_scripts', 'contrast_curves.py')
            p = subprocess.Popen('%s %s %s --Nmax %i' %
                                 (python_path, process_script, filename, Nmax),
                                 shell=True)

        elif ('secondary' in data.metadata['protocol']):
            process_script = os.path.join(
                str(pathlib.Path(__file__).resolve().parents[0]),
                'protocol_scripts', 'secondary_RF.py')
            p = subprocess.Popen('%s %s %s --Nmax %i' %
                                 (python_path, process_script, filename, Nmax),
                                 shell=True)

        elif ('motion-contour-interaction' in data.metadata['protocol']):
            process_script = os.path.join(
                str(pathlib.Path(__file__).resolve().parents[0]),
                'protocol_scripts', 'motion_contour_interaction.py')
            p = subprocess.Popen('%s %s %s' %
                                 (python_path, process_script, filename),
                                 shell=True)

        else:
            # --- looping over protocols individually ---
            for ip, protocol in enumerate(data.protocols):

                print('* * analyzing protocol #%i: "%s" [...]' %
                      (ip + 1, protocol))

                protocol_type = (data.metadata['Protocol-%i-Stimulus' %
                                               (ip + 1)] if
                                 (len(data.protocols) > 1) else
                                 data.metadata['Stimulus'])

                # orientation selectivity analyis
                if protocol in ['Pakan-et-al-static']:
                    process_script = os.path.join(
                        str(pathlib.Path(__file__).resolve().parents[0]),
                        'protocol_scripts',
                        'orientation_direction_selectivity.py')
                    p = subprocess.Popen(
                        '%s %s %s orientation --iprotocol %i --Nmax %i' %
                        (python_path, process_script, filename, ip, Nmax),
                        shell=True)

                if protocol in ['Pakan-et-al-drifting']:
                    process_script = os.path.join(
                        str(pathlib.Path(__file__).resolve().parents[0]),
                        'protocol_scripts',
                        'orientation_direction_selectivity.py')
                    p = subprocess.Popen(
                        '%s %s %s direction --iprotocol %i --Nmax %i' %
                        (python_path, process_script, filename, ip, Nmax),
                        shell=True)

                if 'dg-' in protocol:
                    process_script = os.path.join(
                        str(pathlib.Path(__file__).resolve().parents[0]),
                        'protocol_scripts',
                        'orientation_direction_selectivity.py')
                    p = subprocess.Popen(
                        '%s %s %s gratings --iprotocol %i --Nmax %i' %
                        (python_path, process_script, filename, ip, Nmax),
                        shell=True)

                if 'looming-' in protocol:
                    process_script = os.path.join(
                        str(pathlib.Path(__file__).resolve().parents[0]),
                        'protocol_scripts', 'looming_stim.py')
                    p = subprocess.Popen(
                        '%s %s %s --iprotocol %i --Nmax %i' %
                        (python_path, process_script, filename, ip, Nmax),
                        shell=True)

                if 'gaussian-blobs' in protocol:
                    process_script = os.path.join(
                        str(pathlib.Path(__file__).resolve().parents[0]),
                        'protocol_scripts', 'gaussian_blobs.py')
                    p = subprocess.Popen(
                        '%s %s %s --iprotocol %i' %
                        (python_path, process_script, filename, ip),
                        shell=True)

                if 'noise' in protocol:
                    process_script = os.path.join(
                        str(pathlib.Path(__file__).resolve().parents[0]),
                        'protocol_scripts', 'receptive_field_mapping.py')
                    p = subprocess.Popen(
                        '%s %s %s --iprotocol %i' %
                        (python_path, process_script, filename, ip),
                        shell=True)

                if ('dot-stim' in protocol) or ('moving-dot' in protocol):
                    process_script = os.path.join(
                        str(pathlib.Path(__file__).resolve().parents[0]),
                        'protocol_scripts', 'moving_dot_selectivity.py')
                    p = subprocess.Popen(
                        '%s %s %s --iprotocol %i' %
                        (python_path, process_script, filename, ip),
                        shell=True)

    print('subprocesses to analyze "%s" were launched !' % filename)
예제 #16
0
    def __init__(
            self,
            parent=None,
            dt_sampling=10,  # ms
            fig_name=os.path.join(os.path.expanduser('~'), 'Desktop',
                                  'fig.svg'),
            title='Figures'):

        super(FiguresWindow, self).__init__(parent=parent.app,
                                            title=title,
                                            i=-10,
                                            size=(800, 800))

        self.modalities = []
        for key1, key2 in zip([
                'Photodiode-Signal', 'Electrophysiological-Signal',
                'Running-Speed', 'Pupil', 'CaImaging-TimeSeries',
                'CaImaging-TimeSeries', 'Photodiode-Signal'
        ], [
                'Photodiode', 'Electrophy', 'Locomotion', 'Pupil',
                'CaImagingSum', 'CaImaging', 'VisualStim'
        ]):
            if key1 in parent.nwbfile.acquisition:
                self.modalities.append(key2)

        self.parent = parent
        self.get_varied_parameters()
        self.fig_name = fig_name

        self.data = MultimodalData(self.parent.datafile)

        self.EPISODES = None
        self.xlim, self.ylim = [-10, 10], [-10, 10]

        mainLayout, Layouts = QtWidgets.QVBoxLayout(self.cwidget), []

        # -- protocol
        Layouts.append(QtWidgets.QHBoxLayout())
        # Layouts[-1].addWidget(QtWidgets.QLabel('-- Protocol:   ', self))
        self.pbox = QtWidgets.QComboBox(self)
        self.pbox.setFixedWidth(400)
        self.pbox.addItem(' [PROTOCOL] ')
        self.pbox.addItems(self.parent.protocols)
        Layouts[-1].addWidget(self.pbox)

        # -- quantity and subquantity
        Layouts.append(QtWidgets.QHBoxLayout())
        Layouts[-1].addWidget(QtWidgets.QLabel('-- Quantity:   ', self))
        self.qbox = QtWidgets.QComboBox(self)
        self.qbox.addItem('')
        if 'ophys' in self.parent.nwbfile.processing:
            self.qbox.addItem('CaImaging')
        for key in parent.nwbfile.acquisition:
            if len(parent.nwbfile.acquisition[key].data.shape) == 1:
                self.qbox.addItem(key)  # only for scalar variables
        self.qbox.setFixedWidth(400)
        Layouts[-1].addWidget(self.qbox)
        Layouts[-1].addWidget(
            QtWidgets.QLabel('       -- Sub-quantity:   ', self))
        self.sqbox = QtWidgets.QLineEdit(self)
        self.sqbox.setText(35 * ' ' + 'e.g. "dF/F", "Neuropil", "pLFP", ...')
        self.sqbox.setMinimumWidth(400)
        Layouts[-1].addWidget(self.sqbox)

        # -- roi
        if 'ophys' in self.parent.nwbfile.processing:
            Layouts[-1].addWidget(QtWidgets.QLabel('    -- ROI:   ', self))
            self.roiPick = QtGui.QLineEdit()
            self.roiPick.setText(
                '    [select ROI]  e.g.: "1",  "10-20", "3, 45, 7", ... ')
            self.roiPick.setMinimumWidth(400)
            self.roiPick.returnPressed.connect(self.select_ROI)
            Layouts[-1].addWidget(self.roiPick)

        ### PLOT RAW DATA
        Layouts.append(QtWidgets.QHBoxLayout())
        self.rawPlotBtn = QtWidgets.QPushButton(' plot raw data ', self)
        self.rawPlotBtn.setFixedWidth(200)
        self.rawPlotBtn.clicked.connect(self.plot_raw_data)
        Layouts[-1].addWidget(self.rawPlotBtn)
        for mod in self.modalities:
            Layouts[-1].addWidget(QtWidgets.QLabel(' ' + mod + ':', self))
            setattr(self, mod + 'Plot', QtWidgets.QDoubleSpinBox(self))
            getattr(self, mod + 'Plot').setValue(1)
            getattr(self, mod + 'Plot').setSuffix(' (%-fig)')
            Layouts[-1].addWidget(getattr(self, mod + 'Plot'))

        ### PLOT FIELD OF VIEW
        if 'ophys' in self.parent.nwbfile.processing:
            Layouts.append(QtWidgets.QHBoxLayout())
            self.fovPlotBtn = QtWidgets.QPushButton(
                'plot imaging field of view ', self)
            self.fovPlotBtn.setFixedWidth(250)
            self.fovPlotBtn.clicked.connect(self.plot_FOV)
            Layouts[-1].addWidget(self.fovPlotBtn)
            Layouts[-1].addWidget(
                QtWidgets.QLabel(10 * ' ' + 'FOV type:', self))  # SEPARATOR
            self.fovType = QtWidgets.QComboBox(self)
            self.fovType.addItems(['meanImg', 'meanImgE', 'max_proj'])
            Layouts[-1].addWidget(self.fovType)
            Layouts[-1].addWidget(QtWidgets.QLabel(10 * ' ' + 'NL:',
                                                   self))  # SEPARATOR
            self.fovNL = QtWidgets.QSpinBox(self)
            self.fovNL.setValue(1)
            Layouts[-1].addWidget(self.fovNL)
            Layouts[-1].addWidget(
                QtWidgets.QLabel(10 * ' ' + 'colormap:', self))  # SEPARATOR
            self.fovMap = QtWidgets.QComboBox(self)
            self.fovMap.addItems(
                ['viridis', 'grey', 'white_to_green', 'black_to_green'])
            Layouts[-1].addWidget(self.fovMap)
            Layouts[-1].addWidget(QtWidgets.QLabel('  label:',
                                                   self))  # SEPARATOR
            self.fovLabel = QtGui.QLineEdit()
            Layouts[-1].addWidget(self.fovLabel)

        ### PLOT CORRELATIONS
        Layouts.append(QtWidgets.QHBoxLayout())
        Layouts[-1].addWidget(QtWidgets.QLabel(50 * '<->', self))  # SEPARATOR
        Layouts[-1].addWidget(QtWidgets.QLabel('  -* CORRELATIONS *-', self))

        Layouts.append(QtWidgets.QHBoxLayout())
        Layouts[-1].addWidget(QtWidgets.QLabel(50 * '<->', self))  # SEPARATOR

        # varied keys
        Layouts.append(QtWidgets.QHBoxLayout())
        Layouts[-1].addWidget(
            QtWidgets.QLabel('  -* STIMULI PARAMETERS *-', self))
        for key in self.varied_parameters:
            Layouts.append(QtWidgets.QHBoxLayout())
            Layouts[-1].addWidget(QtWidgets.QLabel('--- %s ' % key, self))
            setattr(self, '%s_plot' % key, QtWidgets.QComboBox(self))
            getattr(self, '%s_plot' % key).addItems([
                'merged', 'single-value', 'column-panels', 'row-panels',
                'color-coded', 'x-axis', 'N/A'
            ])
            Layouts[-1].addWidget(getattr(self, '%s_plot' % key))
            setattr(self, '%s_values' % key, QtWidgets.QComboBox(self))
            getattr(
                self, '%s_values' %
                key).addItems(['full', 'custom'] +
                              [str(s) for s in self.varied_parameters[key]])
            Layouts[-1].addWidget(getattr(self, '%s_values' % key))
            Layouts[-1].addWidget(QtWidgets.QLabel(10 * ' ', self))
            Layouts[-1].addWidget(QtWidgets.QLabel(' custom values : ', self))
            setattr(self, '%s_customvalues' % key, QtWidgets.QLineEdit(self))
            getattr(self, '%s_customvalues' % key).setMaximumWidth(150)
            Layouts[-1].addWidget(getattr(self, '%s_customvalues' % key))
            Layouts[-1].addWidget(QtWidgets.QLabel(30 * ' ', self))

        Layouts.append(QtWidgets.QHBoxLayout())
        Layouts[-1].addWidget(QtWidgets.QLabel(50 * '<->', self))  # SEPARATOR

        # figure props type
        Layouts.append(QtWidgets.QHBoxLayout())
        Layouts[-1].addWidget(
            QtWidgets.QLabel('       -* RESPONSES *-        ', self))
        self.responseType = QtWidgets.QComboBox(self)
        self.responseType.addItems(
            ['stim-evoked-traces', 'mean-stim-evoked', 'integral-stim-evoked'])
        Layouts[-1].addWidget(self.responseType)
        Layouts[-1].addWidget(QtWidgets.QLabel('       color:  ', self))
        self.color = QtGui.QLineEdit()
        Layouts[-1].addWidget(self.color)
        Layouts[-1].addWidget(QtWidgets.QLabel('       label:  ', self))
        self.label = QtGui.QLineEdit()
        Layouts[-1].addWidget(self.label)
        Layouts[-1].addWidget(QtWidgets.QLabel('    n-label:  ', self))
        self.nlabel = QtGui.QLineEdit()
        self.nlabel.setText('1')
        Layouts[-1].addWidget(self.nlabel)
        Layouts.append(QtWidgets.QHBoxLayout())
        Layouts[-1].addWidget(
            QtWidgets.QLabel(' pre-stimulus window (s):', self))
        self.preWindow = QtGui.QLineEdit()
        self.preWindow.setText('[-1,0]')
        Layouts[-1].addWidget(self.preWindow)
        Layouts[-1].addWidget(
            QtWidgets.QLabel(' post-stimulus window (s):', self))
        self.postWindow = QtGui.QLineEdit()
        self.postWindow.setText('[1,4]')
        Layouts[-1].addWidget(self.postWindow)
        Layouts.append(QtWidgets.QHBoxLayout())
        self.baseline = QtGui.QCheckBox("baseline substraction")
        Layouts[-1].addWidget(self.baseline)
        Layouts[-1].addWidget(QtWidgets.QLabel(10 * '  ', self))
        self.withStatTest = QtGui.QCheckBox("with stat. test")
        Layouts[-1].addWidget(self.withStatTest)

        Layouts.append(QtWidgets.QHBoxLayout())
        self.compute = QtWidgets.QPushButton('compute episodes', self)
        self.compute.setFixedWidth(200)
        self.compute.clicked.connect(self.compute_episodes)
        Layouts[-1].addWidget(self.compute)

        self.plotBtn = QtWidgets.QPushButton(' -* PLOT *- ', self)
        self.plotBtn.setFixedWidth(200)
        self.plotBtn.clicked.connect(self.plot)
        Layouts[-1].addWidget(self.plotBtn)

        Layouts.append(QtWidgets.QHBoxLayout())
        Layouts[-1].addWidget(QtWidgets.QLabel(50 * '<->', self))  # SEPARATOR

        Layouts.append(QtWidgets.QHBoxLayout())
        Layouts[-1].addWidget(
            QtWidgets.QLabel('       -* Figure Properties *-        ', self))
        self.fig_presets = QtWidgets.QComboBox(self)
        self.fig_presets.setFixedWidth(400)
        self.fig_presets.addItems(
            ['', 'raw-traces-preset', 'IO-curves-preset'])
        Layouts[-1].addWidget(self.fig_presets)

        Layouts[-1].addWidget(QtWidgets.QLabel('Panel size:  ', self))
        self.panelsize = QtGui.QLineEdit()
        self.panelsize.setText('(1,1)')
        Layouts[-1].addWidget(self.panelsize)

        #
        self.samplingBox = QtWidgets.QDoubleSpinBox(self)
        self.samplingBox.setValue(dt_sampling)
        self.samplingBox.setMaximum(500)
        self.samplingBox.setMinimum(0.1)
        self.samplingBox.setSuffix(' (ms) sampling')
        Layouts[-1].addWidget(self.samplingBox)

        # plot type
        Layouts.append(QtWidgets.QHBoxLayout())
        Layouts[-1].addWidget(QtWidgets.QLabel('Plot type: ', self))
        self.plotbox = QtWidgets.QComboBox(self)
        self.plotbox.addItems(['2d-plot', 'polar-plot', 'bar-plot'])
        Layouts[-1].addWidget(self.plotbox)
        Layouts[-1].addWidget(QtWidgets.QLabel(10 * '  ', self))
        self.plotbox2 = QtWidgets.QComboBox(self)
        self.plotbox2.addItems(['line', 'dot'])
        Layouts[-1].addWidget(self.plotbox2)
        Layouts[-1].addWidget(QtWidgets.QLabel(10 * '  ', self))
        self.withSTDbox = QtGui.QCheckBox("with s.d.")
        Layouts[-1].addWidget(self.withSTDbox)
        Layouts[-1].addWidget(QtWidgets.QLabel(10 * '  ', self))
        self.stim = QtGui.QCheckBox("with stim. ")
        Layouts[-1].addWidget(self.stim)
        Layouts[-1].addWidget(QtWidgets.QLabel(10 * '  ', self))
        self.screen = QtGui.QCheckBox("with screen inset ")
        Layouts[-1].addWidget(self.screen)
        Layouts[-1].addWidget(QtWidgets.QLabel(10 * '  ', self))
        self.annot = QtGui.QCheckBox("with annot. ")
        Layouts[-1].addWidget(self.annot)
        Layouts[-1].addWidget(QtWidgets.QLabel(10 * '  ', self))
        self.axis = QtGui.QCheckBox("with axis")
        Layouts[-1].addWidget(self.axis)
        Layouts[-1].addWidget(QtWidgets.QLabel(10 * '  ', self))
        self.grid = QtGui.QCheckBox("with grid")
        Layouts[-1].addWidget(self.grid)

        # X-scales
        Layouts.append(QtWidgets.QHBoxLayout())
        Layouts[-1].addWidget(QtWidgets.QLabel('X-SCALE      ---     ', self))
        Layouts[-1].addWidget(QtWidgets.QLabel('x-min:', self))
        self.xmin = QtGui.QLineEdit()
        self.xmin.setText('')
        Layouts[-1].addWidget(self.xmin)
        Layouts[-1].addWidget(QtWidgets.QLabel('x-max:', self))
        self.xmax = QtGui.QLineEdit()
        self.xmax.setText('')
        Layouts[-1].addWidget(self.xmax)
        Layouts[-1].addWidget(QtWidgets.QLabel('x-bar:', self))
        self.xbar = QtGui.QLineEdit()
        self.xbar.setText('')
        Layouts[-1].addWidget(self.xbar)
        Layouts[-1].addWidget(QtWidgets.QLabel('x-barlabel:', self))
        self.xbarlabel = QtGui.QLineEdit()
        self.xbarlabel.setText('')
        Layouts[-1].addWidget(self.xbarlabel)

        # Y-scales
        Layouts.append(QtWidgets.QHBoxLayout())
        Layouts[-1].addWidget(QtWidgets.QLabel('Y-SCALE      ---     ', self))
        Layouts[-1].addWidget(QtWidgets.QLabel('y-min:', self))
        self.ymin = QtGui.QLineEdit()
        self.ymin.setText('')
        Layouts[-1].addWidget(self.ymin)
        Layouts[-1].addWidget(QtWidgets.QLabel('y-max:', self))
        self.ymax = QtGui.QLineEdit()
        self.ymax.setText('')
        Layouts[-1].addWidget(self.ymax)
        Layouts[-1].addWidget(QtWidgets.QLabel('y-bar:', self))
        self.ybar = QtGui.QLineEdit()
        self.ybar.setText('')
        Layouts[-1].addWidget(self.ybar)
        Layouts[-1].addWidget(QtWidgets.QLabel('y-barlabel:', self))
        self.ybarlabel = QtGui.QLineEdit()
        self.ybarlabel.setText('')
        Layouts[-1].addWidget(self.ybarlabel)

        # curve
        Layouts.append(QtWidgets.QHBoxLayout())
        # self.Layout12.addWidget(self.baselineCB)

        Layouts.append(QtWidgets.QHBoxLayout())
        Layouts[-1].addWidget(QtWidgets.QLabel(50 * '<->', self))  # SEPARATOR

        # BUTTONS
        Layouts.append(QtWidgets.QHBoxLayout())
        self.setBtn = QtWidgets.QPushButton('extract settings', self)
        self.setBtn.setFixedWidth(200)
        self.setBtn.clicked.connect(self.set_settings)
        Layouts[-1].addWidget(self.setBtn)
        self.rstBtn = QtWidgets.QPushButton('reset settings', self)
        self.rstBtn.setFixedWidth(200)
        self.rstBtn.clicked.connect(self.reset_settings)
        Layouts[-1].addWidget(self.rstBtn)

        Layouts.append(QtWidgets.QHBoxLayout())
        self.newFig = QtWidgets.QPushButton('save as new figure', self)
        self.newFig.setFixedWidth(200)
        self.newFig.clicked.connect(self.new_fig)
        Layouts[-1].addWidget(self.newFig)

        self.append2Fig = QtWidgets.QPushButton('append to figure', self)
        self.append2Fig.setFixedWidth(200)
        self.append2Fig.clicked.connect(self.append)
        Layouts[-1].addWidget(self.append2Fig)

        self.exportBtn = QtWidgets.QPushButton('export to png', self)
        self.exportBtn.setFixedWidth(200)
        self.exportBtn.clicked.connect(self.export)
        Layouts[-1].addWidget(self.exportBtn)

        self.locBtn = QtWidgets.QComboBox(self)
        self.locBtn.addItems(['Desktop', 'summary'])
        self.locBtn.setFixedWidth(200)
        Layouts[-1].addWidget(self.locBtn)

        self.nameBtn = QtWidgets.QLineEdit(self)
        self.nameBtn.setText('fig')
        self.nameBtn.setFixedWidth(200)
        Layouts[-1].addWidget(self.nameBtn)

        self.dpi = QtWidgets.QSpinBox(self)
        self.dpi.setValue(300)
        self.dpi.setRange(50, 600)
        self.dpi.setSuffix(' (dpi)')
        self.dpi.setFixedWidth(80)
        Layouts[-1].addWidget(self.dpi)

        for l in Layouts:
            mainLayout.addLayout(l)
def analysis_pdf(datafile, Nmax=1000000):

    data = MultimodalData(datafile)

    stim_duration = data.metadata['Protocol-1-presentation-duration']
    interval_post = [1. / 2. * stim_duration, stim_duration]
    interval_pre = [interval_post[0] - interval_post[1], 0]

    try:
        # find the protocol with the many-standards
        iprotocol_MS = np.argwhere([('many-standards' in p)
                                    for p in data.protocols])[0][0]
        # find the protocol with the oddball-1
        iprotocol_O1 = np.argwhere([('oddball-1' in p)
                                    for p in data.protocols])[0][0]
        # find the protocol with the oddball-2
        iprotocol_O2 = np.argwhere([('oddball-2' in p)
                                    for p in data.protocols])[0][0]

        # mismatch negativity angles
        MM_angles = [
            data.metadata['Protocol-%i-angle-redundant (deg)' %
                          (1 + iprotocol_O1)],
            data.metadata['Protocol-%i-angle-deviant (deg)' %
                          (1 + iprotocol_O1)]
        ]
        #
        DATA = {'stim_duration': stim_duration}
        DATA[str(int(MM_angles[0]))] = {
            'iprotocol_control': iprotocol_MS,
            'control': [],
            'redundant': [],
            'deviant': [],
            'responsive': []
        }
        DATA[str(int(MM_angles[1]))] = {
            'iprotocol_control': iprotocol_MS,
            'control': [],
            'redundant': [],
            'deviant': [],
            'responsive': []
        }
        DATA[str(
            int(data.metadata[
                'Protocol-%i-angle-redundant (deg)' %
                (1 + iprotocol_O1)]))]['iprotocol_redundant'] = iprotocol_O1
        DATA[str(
            int(data.metadata[
                'Protocol-%i-angle-deviant (deg)' %
                (1 + iprotocol_O1)]))]['iprotocol_deviant'] = iprotocol_O1
        DATA[str(
            int(data.metadata[
                'Protocol-%i-angle-redundant (deg)' %
                (1 + iprotocol_O2)]))]['iprotocol_redundant'] = iprotocol_O2
        DATA[str(
            int(data.metadata[
                'Protocol-%i-angle-deviant (deg)' %
                (1 + iprotocol_O2)]))]['iprotocol_deviant'] = iprotocol_O2

        # find the angle for the redundant and deviant conditions
        print(data.metadata['Protocol-3-angle-redundant (deg)'],
              data.metadata['Protocol-3-angle-deviant (deg)'])

        Nresp, Nresp_selective, SIs = 0, 0, []

        pdf_OS = PdfPages(
            os.path.join(
                summary_pdf_folder(datafile),
                '%s-orientation_selectivity.pdf' %
                data.protocols[iprotocol_MS]))
        pdf_MSO = PdfPages(
            os.path.join(
                summary_pdf_folder(datafile),
                '%s-mismatch_selective_only.pdf' %
                data.protocols[iprotocol_MS]))
        pdf_MA = PdfPages(
            os.path.join(summary_pdf_folder(datafile),
                         '%s-mismatch_all.pdf' % data.protocols[iprotocol_MS]))

        for roi in np.arange(data.iscell.sum())[:Nmax]:

            print('   - MMN analysis for ROI #%i / %i' %
                  (roi + 1, data.iscell.sum()))
            ## ORIENTATION SELECTIVITY ANALYSIS
            fig, SI, responsive, responsive_angles = ODS.OS_ROI_analysis(
                data,
                roiIndex=roi,
                iprotocol=iprotocol_MS,
                stat_test_props=dict(interval_pre=interval_pre,
                                     interval_post=interval_post,
                                     test='wilcoxon',
                                     positive=True),
                with_responsive_angles=True)
            pdf_OS.savefig()  # saves the current figure into a pdf page
            plt.close()

            if responsive:
                Nresp += 1
                SIs.append(SI)

            EPISODES = EpisodeResponse(
                data,
                protocol_id=None,  # means all
                quantity='CaImaging',
                subquantity='dF/F',
                roiIndex=roi)

            fig, AX = ge.figure(axes=(2, 1), wspace=3., right=10.)
            responsive_for_at_least_one = False
            ge.annotate(fig, 'ROI #%i' % (roi + 1), (0.02, 0.98), va='top')

            for angle, ax in zip(MM_angles, AX):

                DATA[str(int(angle))]['responsive'].append(
                    False)  # False by default

                ge.title(ax, '$\\theta$=%.1f$^{o}$' % angle)
                for ik, key, color in zip(range(3),
                                          ['control', 'redundant', 'deviant'],
                                          ['k', ge.blue, ge.red]):
                    cond = data.get_stimulus_conditions([
                        np.array(DATA[str(int(angle))]['iprotocol_%s' % key]),
                        np.array([float(angle)])
                    ], ['protocol_id', 'angle'], None)[0]
                    ge.plot(EPISODES.t,
                            EPISODES.resp[cond, :].mean(axis=0),
                            sy=EPISODES.resp[cond, :].std(axis=0),
                            color=color,
                            ax=ax,
                            no_set=True)
                    ge.annotate(ax,
                                ik * '\n' + '%s, n=%i' % (key, np.sum(cond)),
                                (0.98, 1.),
                                color=color,
                                va='top',
                                size='small')

                    # storing for population analysis:
                    DATA[str(int(angle))][key].append(
                        EPISODES.resp[cond, :].mean(axis=0))
                    if angle in responsive_angles:
                        responsive_for_at_least_one = True
                        DATA[str(int(
                            angle))]['responsive'][-1] = True  # shift to True

                ge.set_plot(ax, xlabel='time (s)', ylabel='dF/F')

            pdf_MA.savefig()
            if responsive_for_at_least_one:
                pdf_MSO.savefig()
            plt.close()

        for angle in MM_angles:
            fig, AX = modulation_summary_panel(EPISODES.t,
                                               DATA[str(int(angle))],
                                               title='$\\theta$=%.1f$^{o}$' %
                                               angle)
            pdf_MA.savefig()
            plt.close()
            fig, AX = modulation_summary_panel(EPISODES.t,
                                               DATA[str(int(angle))],
                                               title='$\\theta$=%.1f$^{o}$' %
                                               angle,
                                               responsive_only=True)
            pdf_MSO.savefig()
            plt.close()

        # orientation selectivity summary
        ODS.summary_fig(Nresp,
                        data.iscell.sum(),
                        SIs,
                        label='Orient. Select. Index')
        pdf_OS.savefig()  # saves the current figure into a pdf page
        plt.close()

        # modulation summary

        for pdf in [pdf_OS, pdf_MSO, pdf_MA]:
            pdf.close()

        print('[ok] mismatch negativity analysis saved in: "%s" ' %
              summary_pdf_folder(datafile))

    except BaseException as be:
        print('\n', be)
        print('---------------------------------------')
        print(' /!\ Pb with mismatch negativity analysis /!\  ')