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
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)
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
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
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
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)