Пример #1
0
def generate_position_bin_times(self, cycle=None, tbin_type=None, xbins=12, 
        ybins=24, GENERATE=False):
    """ returns total time in cage divided into xbins, ybins
    """
    name = 'bin_times_xbins%d_ybins%d' %(xbins, ybins)
    
    text = my_utils.get_text(cycle, tbin_type)

    varName = 'bin_times_%s_xbins%d_ybins%d' %(text, xbins, ybins)

    dirname = self.experiment.derived_dir + \
                    'position_data/xbins%d_ybins%d/%s/bin_times/' %(
                            xbins, ybins, text)   
    if not os.path.isdir(dirname): os.makedirs(dirname)  

    if GENERATE:
        bin_times = self.get_position_bin_times(cycle, tbin_type, xbins, ybins)  
        np.save(dirname + self.id_string, bin_times)

    else:    
        try:   
            bin_times = self.load(varName)
            # print bin_times
        except IOError: 
            bin_times = self.get_position_bin_times(cycle, tbin_type, xbins, ybins)   
            np.save(dirname + self.id_string, bin_times)

    setattr(self, varName, bin_times)
    
    return bin_times
Пример #2
0
def check_position_bin_times(self, xbins=12, ybins=24, tbin_type=None):
    stop
    text = my_utils.get_text(tbin_type=tbin_type)
    
    if tbin_type.endswith('bins'):

        

        data = self.generate_position_bin_times(tbin_type=tbin_type, xbins=xbins, ybins=ybins) 
        
        if not AS_FLAG:
        
            data_ = self.generate_position_bin_times(
                                cycle='24H', xbins=xbins, ybins=ybins)
            
            # tolerance: /num_seconds, /1000 tolerates the 1000secs~=10mins
            np.testing.assert_array_almost_equal(data.sum(0)/10000., data_/10000., 
                            decimal=0, err_msg='24H != sum over %s' %tbin_type)

        else:
            data_ = self.generate_position_bin_times(
                                cycle='AS24H', xbins=xbins, ybins=ybins)
            # tolerance: /num_seconds, /1000 tolerates the 1000secs~=10mins
            np.testing.assert_array_almost_equal(data.sum(0)/1000., data_/1000., 
                            decimal=0, err_msg='AS24H != sum over %s' %tbin_type)

    else:
        cycles = self.experiment.all_cycles
        data = np.zeros((len(cycles), ybins, xbins))
        c = 0
        for cycle in cycles:
            data[c] = self.generate_position_bin_times(cycle=cycle, xbins=xbins, ybins=ybins)
            c +=1

        h24, IS, dc, lc, as24, asdc, aslc = data
        
        # tolerance: /num_seconds, /1000 tolerates the 1000secs~=10mins
        np.testing.assert_array_almost_equal(h24/10000., (dc+lc)/10000., decimal=0, 
                                                err_msg='24H != DC+LC')
        np.testing.assert_array_almost_equal(h24, IS+as24, decimal=0, 
                                                err_msg='24H != IS+AS')
        np.testing.assert_array_almost_equal(as24/1000., (asdc+aslc)/1000., decimal=0, 
                                                err_msg='AS24 != ASDC+ASLC')
        
    print "%s : POSITION DENSITY CHECKS, %s, xbins:%s, ybins:%d -> OK" %(
            self, text, xbins, ybins)
Пример #3
0
def get_figure_titles(E,
                      labels,
                      level,
                      act=None,
                      cycle=None,
                      tbin_type=None,
                      err_type=None,
                      plot_type=None):

    days_string = E.get_days_to_use_text()
    text = my_utils.get_text(cycle, tbin_type)

    # labels are a bunch of labels
    fig_title = '%s Experiment\n%s, %s, %s\n%s days: %s' % (
        E.short_name,
        plot_type.replace('_', ' ').title(),
        level,
        text,
        E.use_days.replace('_', ' ').upper(),
        days_string,
    )

    if level == 'group':
        subtitles = [
            '%d: %s' % (n, name) for n, name in zip(labels, E.strain_names)
        ]

    elif level == 'mouse':
        strain, mouseNumbers = np.unique(labels[:, 0])[0], labels[:, 1]
        subtitles = ['M%d' % n for n in mouseNumbers]
        fig_title += '\ngroup%d: %s' % (strain, E.strain_names[strain])

    elif level == 'mouseday':
        strain, mouseNumber, days = np.unique(labels[:, 0])[0], np.unique(
            labels[:, 1])[0], labels[:, 2]
        subtitles = ['D%d' % n for n in days]
        fig_title += '\ngroup%d: %s, M%d' % (strain, E.strain_names[strain],
                                             mouseNumber)

    return fig_title, subtitles
Пример #4
0
    def generate_position_density(self,
                                  cycle='24H',
                                  tbin_type=None,
                                  level='mouseday',
                                  xbins=12,
                                  ybins=24,
                                  days=None,
                                  err_type='sd',
                                  GENERATE=False,
                                  VERBOSE=False):
        """ returns position density data 
        """
        cstart = time.clock()

        if days is None:
            days_to_use = self.daysToUse
            num_md = self.num_mousedays
        else:
            days_to_use = days
            num_md, _ = self.count_mousedays(days=days_to_use)

        if tbin_type is not None:
            num_tbins = my_utils.get_CT_bins(
                tbin_type=tbin_type.strip('AS')).shape[0]
            md_data = np.zeros((num_md, num_tbins, ybins, xbins))
        else:
            md_data = np.zeros((num_md, ybins, xbins))

        text = my_utils.get_text(cycle, tbin_type)

        print "Exp: %s, %s, tbin_type: %s, level:%s, xbins=%d, ybins=%d, err_type: %s, %s days" % (
            self.short_name, self.generate_position_density.__name__, text,
            level, xbins, ybins, err_type, days_to_use)

        md_labels = np.zeros((num_md, 3), dtype=int)
        cnt = 0
        for group in self.groups:
            for mouse in group.individuals:
                for MD in mouse.mouse_days:
                    if MD.dayNumber in days_to_use:

                        if MD.ignored:
                            md_data[cnt] = np.nan

                        else:
                            bin_times = MD.generate_position_bin_times(
                                cycle, tbin_type, xbins, ybins, GENERATE)
                            if tbin_type is not None:
                                b = 0
                                for btimes in bin_times:
                                    if btimes.sum() >= 0:
                                        md_data[cnt, b] = btimes / btimes.sum()
                                    b += 1
                            else:
                                if bin_times.sum() >= 0:
                                    md_data[cnt] = bin_times / bin_times.sum()

                        md_labels[
                            cnt] = MD.groupNumber, MD.mouseNumber, MD.dayNumber

                        # if GENERATE and not VERBOSE:
                        #     my_utils.print_progress(cnt, self.num_md_ok)

                        cnt += 1

        cstop = time.clock()

        if GENERATE:
            if not VERBOSE:
                print

            dirname = self.derived_dir + \
                        'position_data/xbins%d_ybins%d/%s/bin_times/' %(xbins, ybins, text)   # copied from: MD.generate_position_bin_times
            print "binary output saved to: %s" % dirname
            print "..took %1.2f minutes" % ((cstop - cstart) / 60.)

        E = self
        data, labels = my_utils.get_2d_averages_errors(E, md_data, md_labels,
                                                       tbin_type, level,
                                                       err_type)

        return data, labels
Пример #5
0
def write_to_csv(experiment,
                 cycle='24H',
                 tbin_type=None,
                 AS_FLAG=False,
                 level='group',
                 xbins=12,
                 ybins=24,
                 err_type='sd',
                 plot_type='position_density'):

    E = experiment
    use_days = E.use_days + '_days'

    text = my_utils.get_text(cycle, tbin_type, AS_FLAG)

    print "%s, %s, %s, xbins:%d, ybins:%d, %s" % (
        write_to_csv.__name__, text, level, xbins, ybins, use_days)

    suffix = '%s/csv_files/xbins%d_ybins%d/%s/%s/%s_days/' % (
        plot_type, xbins, ybins, level, text, E.use_days)

    dirname = os.path.join(E.figures_dir, suffix)
    if not os.path.isdir(dirname): os.makedirs(dirname)
    fname = dirname + '%s_%s_%s_xbins%d_ybins%d.csv' % (plot_type, text, level,
                                                        xbins, ybins)

    # load data
    data, labels = E.generate_position_density(cycle=cycle,
                                               tbin_type=tbin_type,
                                               AS_FLAG=AS_FLAG,
                                               level=level,
                                               xbins=xbins,
                                               ybins=ybins,
                                               err_type=err_type)

    if tbin_type is not None:
        arr = my_utils.get_CT_bins(bin_type=tbin_type) / 3600 - 7
        tbins = [
            'bin%d: CT%d-%d' % (b, row[0], row[1]) for b, row in enumerate(arr)
        ]
        new_data = data[:, :, :, :,
                        0].reshape(data.shape[0], data.shape[1],
                                   -1)  # (num_mousedays, 4x2 raveled)
    else:
        new_data = data[:, :, :, 0].reshape(data.shape[0],
                                            -1)  # (num_mousedays, 4x2 raveled)

    # headers
    # string = ', BIN_SHIFTED: %dm' %(E.binTimeShift/60) if E.BIN_SHIFT else ''
    headers = [['Experiment: %s' % E.short_name],
               ['%s, xbins=%d, ybins=%d' % (plot_type, xbins, ybins)],
               ['%s, %s' % (level, text)], ['%s days' % E.use_days],
               ['days: %s' % E.daysToUse]]

    if level == 'group':
        sub_header = ['use_days', 'group']
        if tbin_type is not None:
            if (xbins, ybins) == (2, 4):
                sub_header += [
                    'tbins', 'Niche', 'TopLeft', '[]', '[]', '[]', '[]',
                    'Feeder', 'Lick'
                ]
            else:
                sub_header += ['tbins']
        else:
            sub_header += [
                'Niche', 'TopLeft', '[]', '[]', '[]', '[]', 'Feeder', 'Lick'
            ]

        with open(fname, 'wb') as csv_file:
            writer = csv.writer(csv_file, delimiter=",")
            for h in headers:
                writer.writerow(h)
            writer.writerow('\n')
            writer.writerow(sub_header)
            writer.writerow('\n')

            if tbin_type is not None:
                new_data_ = new_data.swapaxes(
                    0, 1)  # tbin, days, (raveled xbins, ybins)
                for b in xrange(len(new_data_)):
                    bin_data = new_data_[b]
                    c = 0
                    for row in bin_data:
                        row_text = [
                            use_days + ', %s' % text, labels[c], tbins[b]
                        ]
                        writer.writerow(
                            np.hstack([row_text, ['%1.5f' % r for r in row]]))
                        c += 1
                    writer.writerow('\n')

            else:
                c = 0
                for row in new_data:
                    row_text = [use_days + ', %s' % text, labels[c]]
                    writer.writerow(
                        np.hstack([row_text, ['%1.5f' % r for r in row]]))
                    c += 1
                writer.writerow('\n')

    elif level == 'mouse':
        sub_header = ['use_days', 'group', 'mouse']
        if tbin_type is not None:
            if (xbins, ybins) == (2, 4):
                sub_header += [
                    'tbins', 'Niche', 'TopRight', '[]', '[]', '[]', '[]',
                    'Feeder', 'Lick'
                ]
            else:
                sub_header += ['tbins']
        else:
            sub_header += [
                'Niche', 'TopLeft', '[]', '[]', '[]', '[]', 'Feeder', 'Lick'
            ]

        with open(fname, 'wb') as csv_file:
            writer = csv.writer(csv_file, delimiter=",")
            for h in headers:
                writer.writerow(h)
            writer.writerow('\n')
            writer.writerow(sub_header)
            writer.writerow('\n')

            for group_num in range(E.num_strains):
                idx_group = labels[:, 0] == group_num
                group_data = new_data[idx_group]
                group_labels = labels[idx_group]

                if tbin_type is not None:
                    group_data_ = group_data.swapaxes(
                        0, 1)  # tbin, days, (raveled xbins, ybins)
                    for b in xrange(len(group_data_)):
                        bin_data = group_data_[b]
                        c = 0
                        for row in bin_data:
                            row_text = [
                                use_days + ', %s' % text, group_labels[c, 0],
                                group_labels[c, 1], tbins[b]
                            ]
                            writer.writerow(
                                np.hstack(
                                    [row_text, ['%1.5f' % r for r in row]]))
                            c += 1
                        # stop
                        writer.writerow('\n')
                        writer.writerow(['', '', '', 'Mean:'] + [
                            '%1.5f' % r for r in np.nanmean(bin_data, axis=0)
                        ])
                        writer.writerow(
                            ['', '', '', 'sd:'] +
                            ['%1.5f' % r for r in np.nanstd(bin_data, axis=0)])
                        sem = np.nanstd(
                            bin_data, axis=0) / np.sqrt(bin_data.shape[0] - 1)
                        writer.writerow(['', '', '', 'sem:'] +
                                        ['%1.5f' % r for r in sem])
                        writer.writerow('\n')

                else:
                    c = 0
                    for row in group_data:

                        row_text = [
                            use_days + ', %s' % text, group_labels[c, 0],
                            group_labels[c, 1]
                        ]
                        writer.writerow(
                            np.hstack([row_text, ['%1.5f' % r for r in row]]))
                        c += 1

                    writer.writerow('\n')
                    writer.writerow(
                        ['', '', 'Mean:'] +
                        ['%1.5f' % r for r in np.nanmean(group_data, axis=0)])
                    writer.writerow(
                        ['', '', 'sd:'] +
                        ['%1.5f' % r for r in np.nanstd(group_data, axis=0)])
                    sem = np.nanstd(group_data,
                                    axis=0) / np.sqrt(group_data.shape[0] - 1)
                    writer.writerow(['', '', 'sem:'] +
                                    ['%1.5f' % r for r in sem])
                    writer.writerow('\n')

    elif level == 'mouseday':
        sub_header = ['', 'group', 'mouse', 'mouseday']
        if tbin_type is not None:
            if (xbins, ybins) == (2, 4):
                sub_header += [
                    'tbins', 'Niche', 'TopLeft', '[]', '[]', '[]', '[]',
                    'Feeder', 'Lick'
                ]
            else:
                sub_header += ['tbins']
        else:
            sub_header += [
                'Niche', 'TopLeft', '[]', '[]', '[]', '[]', 'Feeder', 'Lick'
            ]

        with open(fname, 'wb') as csv_file:
            writer = csv.writer(csv_file, delimiter=",")
            for h in headers:
                writer.writerow(h)
            writer.writerow('\n')
            writer.writerow(sub_header)
            writer.writerow('\n')

            for group_num in range(E.num_strains):
                idx_group = labels[:, 0] == group_num
                group_data = new_data[idx_group]
                group_labels = labels[idx_group]

                m_labels = np.unique(group_labels[:, 1])

                for mouse in m_labels:
                    idx_mouse = group_labels[:, 1] == mouse
                    m_data = group_data[idx_mouse]
                    m_labels = group_labels[idx_mouse]

                    if tbin_type is not None:

                        m_data_ = m_data.swapaxes(
                            0, 1)  # tbin, days, (raveled xbins, ybins)
                        for b in xrange(len(m_data_)):
                            bin_data = m_data_[b]
                            c = 0
                            for row in bin_data:
                                row_text = [
                                    use_days + ', %s' % text, m_labels[c, 0],
                                    m_labels[c, 1], m_labels[c, 2], tbins[b]
                                ]
                                writer.writerow(
                                    np.hstack(
                                        [row_text,
                                         ['%1.5f' % r for r in row]]))
                                c += 1
                            # stop
                            writer.writerow('\n')
                            writer.writerow(['', '', '', '', 'Mean:'] + [
                                '%1.5f' % r
                                for r in np.nanmean(bin_data, axis=0)
                            ])
                            writer.writerow(['', '', '', '', 'sd:'] + [
                                '%1.5f' % r
                                for r in np.nanstd(bin_data, axis=0)
                            ])
                            sem = np.nanstd(
                                bin_data,
                                axis=0) / np.sqrt(bin_data.shape[0] - 1)
                            writer.writerow(['', '', '', '', 'sem:'] +
                                            ['%1.5f' % r for r in sem])
                            writer.writerow('\n')

                    else:
                        c = 0
                        for row in m_data:
                            row_text = [
                                use_days + ', %s' % text, m_labels[c, 0],
                                m_labels[c, 1], m_labels[c, 2]
                            ]
                            writer.writerow(
                                np.hstack(
                                    [row_text, ['%1.5f' % r for r in row]]))
                            c += 1

                        writer.writerow('\n')
                        writer.writerow(
                            ['', '', '', 'Mean:'] +
                            ['%1.5f' % r for r in np.nanmean(m_data, axis=0)])
                        writer.writerow(
                            ['', '', '', 'sd:'] +
                            ['%1.5f' % r for r in np.nanstd(m_data, axis=0)])
                        sem = np.nanstd(m_data,
                                        axis=0) / np.sqrt(m_data.shape[0] - 1)
                        writer.writerow(['', '', '', 'sem:'] +
                                        ['%1.5f' % r for r in sem])
                        writer.writerow('\n')

    print "csv files saved to:\n%s" % fname
Пример #6
0
def plot_position_density(experiment,
                          cycle='24H',
                          tbin_type=None,
                          level='mouseday',
                          xbins=12,
                          ybins=24,
                          err_type='sd',
                          plot_type='position_density',
                          ADD_SOURCE=True):

    E = experiment

    text = my_utils.get_text(cycle, tbin_type)

    print "%s, %s, %s, xbins:%d, ybins:%d, %s" % (
        plot_position_density.__name__, text, level, xbins, ybins, E.use_days)

    dirname_out = E.figures_dir + '%s/xbins%d_ybins%d/%s/%s/%s_days/' % (
        plot_type, xbins, ybins, level, text, E.use_days)
    if not os.path.isdir(dirname_out): os.makedirs(dirname_out)

    # load data
    data, labels = E.generate_position_density(cycle=cycle,
                                               tbin_type=tbin_type,
                                               level=level,
                                               xbins=xbins,
                                               ybins=ybins,
                                               err_type=err_type)

    if level == 'group':
        fname = dirname_out + '%s_%s_%dgroups_xbins%d_ybins%d' % (
            plot_type, text, E.num_strains, xbins, ybins)

        draw_position_density(E,
                              data,
                              labels,
                              cycle,
                              tbin_type,
                              level,
                              err_type,
                              xbins,
                              ybins,
                              fname,
                              plot_type=plot_type,
                              ADD_SOURCE=ADD_SOURCE)

    elif level == 'mouse':
        for strain in xrange(E.num_strains):
            idx = labels[:, 0] == strain
            m_data, m_labels = data[idx], labels[idx]
            fname = dirname_out + '%s_%s_group%d_xbins%d_ybins%d' % (
                plot_type, text, strain, xbins, ybins)

            draw_position_density(E,
                                  m_data,
                                  m_labels,
                                  cycle,
                                  tbin_type,
                                  level,
                                  err_type,
                                  xbins,
                                  ybins,
                                  fname,
                                  plot_type=plot_type,
                                  ADD_SOURCE=ADD_SOURCE)

    elif level == 'mouseday':
        # nest
        rects_HB = np.array([None] * len(data))
        obs_rects = np.array([None] * len(data))

        condition = (xbins, ybins) == (2, 4)
        if condition:
            rects_HB, obs_rects = E.generate_homebase_data()

        for strain in range(E.num_strains):
            idx_m = labels[:, 0] == strain
            mouseNumbers = np.unique(labels[idx_m, 1])
            for c in xrange(len(mouseNumbers)):
                idx_md = labels[:, 1] == mouseNumbers[c]
                md_data, md_labels = data[idx_md], labels[idx_md]

                fname = dirname_out + '%s_%s_group%d_M%d_xbins%d_ybins%d' % (
                    plot_type, text, strain, mouseNumbers[c], xbins, ybins)

                rect_HB, obs_rect = None, None
                if condition:
                    idx_start, idx_end = my_utils.find_nonzero_runs(idx_md)[0]
                    rect_HB = rects_HB[idx_start:idx_end]
                    obs_rect = obs_rects[idx_start:idx_end]

                draw_position_density(E,
                                      md_data,
                                      md_labels,
                                      cycle,
                                      tbin_type,
                                      level,
                                      err_type,
                                      xbins,
                                      ybins,
                                      fname,
                                      rect_HB=rect_HB,
                                      obs_rect=obs_rect,
                                      plot_type=plot_type,
                                      ADD_SOURCE=ADD_SOURCE)