def get_saccades(flydra_db_directory, db_group, interval): with safe_flydra_db_open(flydra_db_directory) as db: saccades = db.get_table_for_group(db_group, 'saccades') logger.info('Found %d saccades for group %r.' % (len(saccades), db_group)) if len(saccades) == 0: raise Exception('No saccades found for group %r.' % db_group) # make sure we use array saccades = np.array(saccades) for s in saccades: check_saccade_is_well_formed(s) saccades = add_position_information(saccades) # XXX: using default arena size def test(saccade): return (saccade['distance_from_wall'] >= interval[0] and saccade['distance_from_wall'] <= interval[1]) include = map(test, saccades) select = saccades[np.array(include)] logger.info(' of which %d saccades are in interval %g <= d <= %g.' % (len(select), interval[0], interval[1])) if len(select) == 0: raise Exception('No saccades in interval %g <= d <= %g' % interval ) return select
def detect_angvel(argv): pdb.set_trace() np.seterr(all='raise') parser = LenientOptionParser(usage=usage) parser.add_option("--db", help="FlydraDB directory.") parser.add_option( "--version", default='smooth', type='string', help="[=%default] Which version of the 'rows' table to use.") parser.add_option("--saccades_table_version", default='angvel', type='string', help='[=%default] Version of output saccades tables.') parser.add_option("--nocache", help="Ignores already computed results.", default=False, action="store_true") parser.add_option("--out", help="Output directory for graphic representation.") parser.add_option("--fps", help="Recording framerate") fps = parser.parse_args(args='--fps', type='float') # detection parameters dt = 1.0 / 60 # XXX: read from file warnings.warn('Using fixed dt = %s.' % dt) parser.add_option("--deltaT_inner_sec", default=4 * dt, type='float', help="Inner interval [= %default]") parser.add_option("--deltaT_outer_sec", default=10 * dt, type='float', help="Outer interval [= %default]") parser.add_option("--min_amplitude_deg", default=25, type='float', help="Minimum saccade amplitude (deg) [= %default]") parser.add_option("--min_linear_velocity", default=0.1, type='float', help="Minimum linear velocity when" " saccading (m/s) [= %default]") parser.add_option("--max_linear_acceleration", default=20, type='float', help="Maximum linear acceleration when saccading " "(m/s^2) [= %default]") parser.add_option("--max_angular_velocity", default=8000, type='float', help="Maximum angular velocity when saccading" " (deg/s) [= %default]") parser.add_option("--max_orientation_dispersion_deg", default=15, type='float', help="Maximum dispersion (deg) [= %default]") parser.add_option("--minimum_interval_sec", default=10 * dt, type='float', help="Minimum interval between saccades. [= %default]") (options, args) = parser.parse_args(argv) if not options.db: raise Exception('No flydra DB directory specified.') if args: raise Exception('Spurious arguments') # Create processed string processed = get_computed_string('angvel_saccade_detector', __version__) rows_table_name = NamingConventions.ROWS_TABLE rows_table_version = options.version saccades_table_name = NamingConventions.SACCADES_TABLE # annotations_table_name = 'annotated' saccades_table_version = options.saccades_table_version with safe_flydra_db_open(options.db) as db: samples = db.list_samples() for i, sample in enumerate(samples): already_has = db.has_table(sample, saccades_table_name, saccades_table_version) if options.nocache and already_has: msg = ('Sample %r already has table %s:%s; skipping.' % (sample, saccades_table_name, saccades_table_version)) logger.info(msg) continue if not db.has_table(sample, rows_table_name, rows_table_version): msg = ('Sample %r does not have table %s:%s.' % (sample, rows_table_name, rows_table_version)) raise Exception(msg) with db.safe_get_table(sample, rows_table_name, rows_table_version) as rows: rows = np.array(rows[:]) params = {} # saccades, annotated data = angvel_saccade_detect(rows, **params) saccades = data['saccades'] for saccade in saccades: check_saccade_is_well_formed(saccade) DT = rows['timestamp'][-1] - rows['timestamp'][0] logger.info( "%4d/%d %s: %6d saccades for %6d rows (%6g saccades/s)" % (i, len(samples), sample, len(saccades), len(rows), DT / len(saccades))) if True: db.set_table(sample=sample, table=saccades_table_name, data=saccades, version=saccades_table_version) db.set_attr( sample, 'saccades_%s_processed' % saccades_table_version, processed) if options.out is not None: outdir = os.path.join(options.out, 'angvel_sac_detect') if not os.path.exists(outdir): os.makedirs(outdir) resources = os.path.join(outdir, 'images') filename = os.path.join(outdir, '%s.html' % sample) r = Report() chunks = enumerate_chunks(len(rows), max_chunk_size=300) for i, select in enumerate(chunks): rows_i = rows[select] ri = plot_angvel_saccade_detect_results(rows_i) ri.nid = 'chunk_%s' % i r.add_child(ri) logger.info('Writing to %r.' % filename) r.to_html(filename, resources_dir=resources)
def detect_angvel(argv): np.seterr(all='raise') parser = LenientOptionParser(usage=usage) parser.add_option("--db", help="FlydraDB directory.") parser.add_option("--version", default='smooth', type='string', help="[=%default] Which version of the 'rows' table to use.") parser.add_option("--saccades_table_version", default='angvel', type='string', help='[=%default] Version of output saccades tables.') parser.add_option("--nocache", help="Ignores already computed results.", default=False, action="store_true") parser.add_option("--out", help="Output directory for graphic representation.") # detection parameters dt = 1.0 / 60 # XXX: read from file warnings.warn('Using fixed dt = %s.' % dt) parser.add_option("--deltaT_inner_sec", default=4 * dt, type='float', help="Inner interval [= %default]") parser.add_option("--deltaT_outer_sec", default=10 * dt, type='float', help="Outer interval [= %default]") parser.add_option("--min_amplitude_deg", default=25, type='float', help="Minimum saccade amplitude (deg) [= %default]") parser.add_option("--min_linear_velocity", default=0.1, type='float', help="Minimum linear velocity when" " saccading (m/s) [= %default]") parser.add_option("--max_linear_acceleration", default=20, type='float', help="Maximum linear acceleration when saccading " "(m/s^2) [= %default]") parser.add_option("--max_angular_velocity", default=8000, type='float', help="Maximum angular velocity when saccading" " (deg/s) [= %default]") parser.add_option("--max_orientation_dispersion_deg", default=15, type='float', help="Maximum dispersion (deg) [= %default]") parser.add_option("--minimum_interval_sec", default=10 * dt, type='float', help="Minimum interval between saccades. [= %default]") (options, args) = parser.parse_args(argv) if not options.db: raise Exception('No flydra DB directory specified.') if args: raise Exception('Spurious arguments') # Create processed string processed = get_computed_string('angvel_saccade_detector', __version__) rows_table_name = NamingConventions.ROWS_TABLE rows_table_version = options.version saccades_table_name = NamingConventions.SACCADES_TABLE # annotations_table_name = 'annotated' saccades_table_version = options.saccades_table_version with safe_flydra_db_open(options.db) as db: samples = db.list_samples() for i, sample in enumerate(samples): already_has = db.has_table(sample, saccades_table_name, saccades_table_version) if options.nocache and already_has: msg = ('Sample %r already has table %s:%s; skipping.' % (sample, saccades_table_name, saccades_table_version)) logger.info(msg) continue if not db.has_table(sample, rows_table_name, rows_table_version): msg = ('Sample %r does not have table %s:%s.' % (sample, rows_table_name, rows_table_version)) raise Exception(msg) with db.safe_get_table(sample, rows_table_name, rows_table_version) as rows: rows = np.array(rows[:]) params = {} # saccades, annotated data = angvel_saccade_detect(rows, **params) saccades = data['saccades'] for saccade in saccades: check_saccade_is_well_formed(saccade) DT = rows['timestamp'][-1] - rows['timestamp'][0] logger.info("%4d/%d %s: %6d saccades for %6d rows (%6g saccades/s)" % (i, len(samples), sample, len(saccades), len(rows), DT / len(saccades))) if True: db.set_table(sample=sample, table=saccades_table_name, data=saccades, version=saccades_table_version) db.set_attr(sample, 'saccades_%s_processed' % saccades_table_version, processed) if options.out is not None: outdir = os.path.join(options.out, 'angvel_sac_detect') if not os.path.exists(outdir): os.makedirs(outdir) resources = os.path.join(outdir, 'images') filename = os.path.join(outdir, '%s.html' % sample) r = Report() chunks = enumerate_chunks(len(rows), max_chunk_size=300) for i, select in enumerate(chunks): rows_i = rows[select] ri = plot_angvel_saccade_detect_results(rows_i) ri.nid = 'chunk_%s' % i r.add_child(ri) logger.info('Writing to %r.' % filename) r.to_html(filename, resources_dir=resources)