Beispiel #1
0
def gen_trial_matrix2(generator, iwhisker=0, ifeatures=[5, 6]):

    nfeat = len(ifeatures)
    filecount = len(list(generator))
    timecount = 0
    for n in generator:
        table = traj.MeasurementsTable(n)
        data = table.asarray()
        timecount = data[:, 1].max() + 1 + 10  #adding a fudge factor
        break

    im = nan * zeros((nfeat, filecount, timecount))

    for i, n in enumerate(generator):
        try:
            print "[%5d of %5d] %s" % (i, filecount, n)
            table = traj.MeasurementsTable(n)
            data = table.asarray()

            mask = data[:, 0] == iwhisker
            # select whisker
            t = data[mask, 1].astype(uint)
            # get times
            for j, ifeat in enumerate(ifeatures):
                im[j, i, t] = data[mask, ifeat]
                # get feature
        except:
            pass

    return im
Beispiel #2
0
 def load(vidname):
     import reader, trace, traj
     vname, wname, mname = fnames(vidname)
     v = reader.Reader(vname, adjuststipple=0)
     w = trace.Load_Whiskers(wname)
     try:
         m = traj.MeasurementsTable(mname)
     except:
         traceback.print_exc(file=sys.stdout)
         sys.stdout.flush()
         m = None
     return v, w, m
Beispiel #3
0
def gen_trial_matrix_all_whiskers(n_whiskers=3, ifeatures=[5, 6]):
    a = annotate_trials(r"F:\CuratedSessions",
                        filename=r"F:\CuratedSessions\all.trialtypes.pickle")
    out = a.by_type_session()
    n_trials = len(a.data)
    n_trial_type = len(out.keys())
    n_sessions = len(out.values()[0].keys())

    def get_n_timepoints():
        table = traj.MeasurementsTable(
            list(seq2measurements([a.data.keys()[0]]))[0])  # -_-;
        data = table.asarray()
        return data[:, 1].max() + 10  # add a fudge factor

    # each row: trial type id, session id, whisker id
    index = zeros((n_trials * n_whiskers, 3), dtype=uint8)
    im = nan * zeros(
        (len(ifeatures), n_trials * n_whiskers, get_n_timepoints()))

    session_index = {}
    for i, k in enumerate(out.values()[0].iterkeys()):
        session_index[k] = i

    row = 0
    for kTrialType, vTrialType in out.iteritems():
        for kSession, vSession in vTrialType.iteritems():
            for filename in seq2measurements(vSession):
                print "[%5d of %5d] %s" % (row, im.shape[1], filename)
                try:
                    data = traj.MeasurementsTable(filename).asarray()
                    for iWhisker in xrange(n_whiskers):
                        index[row, :] = [
                            int(kTrialType), session_index[kSession], iWhisker
                        ]
                        mask = data[:, 0] == iWhisker
                        for i, ifeat in enumerate(ifeatures):
                            im[i, row, data[mask,
                                            1].astype(uint32)] = data[mask,
                                                                      ifeat]
                        row += 1
                except IOError:
                    pass

    return index, im
Beispiel #4
0
def build_histograms(fname, min_ms, max_ms, norm=True, dth_deg=2.5):
    # Tried memoizing here. AFAICT, no speed up.
    table = traj.MeasurementsTable(fname)

    data = table.asarray()
    out = {}

    nframes = data[:, 1].max()
    dt = frame_delta_ms(nframes)

    wmask = (data[:, 0] == 0)  # select whisker 0
    tmask = (data[:,1]*dt >=min_ms) \
          * (data[:,1]*dt <=max_ms) # select epoch

    # angle of most posterior whisker
    mask = wmask * tmask
    nn, xx = histogram(awrap(data[mask, 5]),
                       arange(-180.0, 180.0, dth_deg),
                       density=norm)
    out['angle'] = (xx[1:], nn)

    # avg angle change between whiskers in the same frame
    nwhiskers = int(data[:, 0].max()) + 1
    nframes = int(data[:, 1].max()) + 1
    angles = nan * zeros((nframes, nwhiskers))
    for i in xrange(nwhiskers):
        mask = (data[:, 0] == i) * tmask
        angles[data[mask, 1].astype(int), i] = awrap(data[mask, 5])
    dth = diff(angles, axis=1).mean(axis=1)
    nn, xx = histogram(dth, arange(-180.0, 180.0, dth_deg), density=norm)
    out['spread'] = (xx[1:], nn)

    #all angles
    mask = tmask * (data[:, 0] >= 0) * (
        data[:, 0] <= 2)  # actually only accept most posterior 3
    nn, xx = histogram(awrap(data[mask, 5]), arange(-180.0, 180.0, dth_deg))
    out['all'] = (xx[1:], nn)
    return out
Beispiel #5
0
def proc(root):
    import fnmatch
    import os

    def gen_names(root):
        for r, dirnames, filenames in os.walk(root):
            for filename in fnmatch.filter(filenames, '*.measurements'):
                yield os.path.join(r, filename)

    filecount = len(list(gen_names(root)))

    count = 0.0
    recall = 0.0
    precision = 0.0

    training_max = 0.0
    training_min = 1.0
    training_mean = 0.0
    for i, n in enumerate(gen_names(root)):
        if 1:  #i < 5:
            try:
                print "[%5d of %5d] %s" % (i, filecount, n)
                table = traj.MeasurementsTable(n)
                recall += heuristic_recall(table)
                precision += heuristic_precision(table)
                t = training_set_fraction(table)
                training_max = max(training_max, t)
                training_min = min(training_min, t)
                training_mean += t
                count += 1.0
            except:
                pass
    recall /= count
    precision /= count
    training_mean /= count
    return locals()
Beispiel #6
0
    wrowcmp = lambda a, b: wcmp(a[1], b[1])
    for fid, wv in wvd.iteritems():
        #print fid
        seq = wid_sequence_from_frame(wv)  #ordered wid's
        labels, p, vp = model.viterbi_by_lookup(fid, seq)
        tids = map(statemap.get, labels)
        logp[fid] = p
        vlogp[fid] = vp

        for tid, wid in zip(tids, seq):
            if not tid is None:
                traj.setdefault(tid, {})[fid] = wid

    return traj, logp, vlogp


if __name__ == '__main__':
    import sys, traj, trace
    name, whisker_src, measurements_src, dest = sys.argv
    wvd = trace.Load_Whiskers(whisker_src)
    table = traj.MeasurementsTable(measurements_src)

    data = table.asarray()
    traj = table.get_trajectories()
    model = LeftRightModel()
    model.train(wvd, traj, data=data)
    traj_hmm, logp, vlogp = apply_model(wvd, model)
    table.commit_trajectories(traj)

    table.save(dest)
Beispiel #7
0
def itertrials(meta):
    for fname in gen_measurements(meta):
        table = traj.MeasurementsTable(fname)
        yield fname, table.asarray()
Beispiel #8
0
def countof_frames(fname):
    v = traj.MeasurementsTable(fname).asarray()[:, 1].max()
    print fname, v
    return int(v)
Beispiel #9
0
                1]  #know the order b.c. already sorted by file extenstion
            tfile = args[0]
        w = trace.Load_Whiskers(src)
        data = numpy.array(list(summary.features(w, options.face)))
        if tfile:
            t, tid = load_trajectories(tfile)
            summary.commit_traj_to_data_table(t, data)

    elif all(
            map(
                lambda f: os.path.splitext(f)[-1] in
                ['.trajectories', '.measurements'], args)):
        sources = dict(map(lambda f: (os.path.splitext(f)[-1], f), args))

        try:
            data = traj.MeasurementsTable(sources['.measurements']).asarray()
        except KeyError:
            raise UserException, "A .measurements file must be provided as one of the source files."

        try:
            t, tid = load_trajectories(sources['.trajectories'])
            summary.commit_traj_to_data_table(t, data)
        except KeyError:
            pass
    else:
        raise parser.error(
            "An unexpected combination of source file types was provided.")

    table = traj.MeasurementsTable(data).update_velocities()
    if os.path.splitext(dst)[-1] == '.mat':
        table.save_to_matlab_file(dst)
Beispiel #10
0
 def get_n_timepoints():
     table = traj.MeasurementsTable(
         list(seq2measurements([a.data.keys()[0]]))[0])  # -_-;
     data = table.asarray()
     return data[:, 1].max() + 10  # add a fudge factor
Beispiel #11
0
def gen_trial_matrix_summary(trialtypes=None, sessions=None):
    a = annotate_trials(r"F:\CuratedSessions",
                        filename=r"F:\CuratedSessions\all.trialtypes.pickle")
    out = a.by_type_session()

    if trialtypes is None:
        trialtypes = out.keys()
    if sessions is None:
        sessions = out.values()[0].keys()

    def gen_trials():
        for t in trialtypes:
            for s in sessions:
                for e in out.get(str(t), {}).get(s, []):
                    yield e

    def count_trials():
        return len(list(gen_trials()))

    def get_n_timepoints():
        table = traj.MeasurementsTable(
            list(seq2measurements([a.data.keys()[0]]))[0])  # -_-;
        data = table.asarray()
        return data[:, 1].max() + 10  # add a fudge factor

    ntrials = count_trials()
    ntime = get_n_timepoints()
    nfeat = 4  # average angle, angle spread, projected mean follicle position,
    # projected follicle position spread
    index = zeros((ntrials, 2), dtype=uint8)
    im = nan * zeros((nfeat, ntrials, ntime))

    session_index = {}
    for i, k in enumerate(out.values()[0].iterkeys()):
        session_index[k] = i

    def gen_trial_index():
        for t in trialtypes:
            for s in sessions:
                for e in out.get(str(t), {}).get(s, []):
                    yield int(t), session_index[s]

    row = 0
    for i, (filename, code) in enumerate(
            zip(seq2measurements(gen_trials()), gen_trial_index())):
        print "[%5d of %5d] %s" % (i, ntrials, filename)
        try:
            data = traj.MeasurementsTable(filename).asarray()
            index[row, :] = code
            nwhiskers = max(data[:, 0].astype(int)) + 1
            count = zeros((nwhiskers, ntime))
            working = zeros((nwhiskers, ntime))
            mask = data[:, 0] >= 0
            count[data[mask, 0].astype(int),
                  data[mask, 1].astype(int)] = 1  # [whisker,time] = 1
            #angles
            for iwhisker in xrange(nwhiskers):
                mask = data[:, 0] == iwhisker
                working[iwhisker, data[mask, 1].astype(int)] = data[mask, 5]
            #mean angle
            im[0, row, :] = working.sum(0) / count.sum(0)
            #angle spread
            im[1, row, :] = working.ptp(0)

            #follicle position
            #For leo's data, just use the xposition (column 7)
            for iwhisker in xrange(nwhiskers):
                mask = data[:, 0] == iwhisker
                working[iwhisker, data[mask, 1].astype(int)] = data[mask, 7]
            #mean follicle
            im[2, row, :] = working.sum(0) / count.sum(0)
            #angle follcile
            im[3, row, :] = working.ptp(0)
            row += 1

        except IOError:
            pass
    return index, im
Beispiel #12
0
import matplotlib.pyplot as plt
import numpy as np, os.path, pandas

# Data location
session = '0509A_cropped_truncated_4'
side = 'top'
#~ session = '0527_cropped_truncated_5'; side = 'left'
whisk_rootdir = os.path.expanduser('~/mnt/bruno-nix/whisker_video/processed')
whisk_file = os.path.join(whisk_rootdir, session, session + '.whiskers')
measure_file = os.path.join(whisk_rootdir, session, session + '.measurements')

# Load the traces
frame2segment_id2whisker_seg = trace.Load_Whiskers(whisk_file)

# Load the correspondence between traces and identified whiskers
tmt = traj.MeasurementsTable(measure_file)
whisker_id2frame2segment_id = tmt.get_trajectories()

# Identify any missing frames
frames_l = frame2segment_id2whisker_seg.keys()
sorted_frames = np.sort(frames_l)

# Iterate over frames
rec_l = []

# Iterate over whiskers
# It looks like it numbers them from Bottom to Top for side == 'left'
# whiski colors them R, G, B
for wid, frame2segment_id in whisker_id2frame2segment_id.items():
    # Iterate over frames
    for frame, segment_id in frame2segment_id.items():
Beispiel #13
0
def save_measurements( name, *args ):
  whiskers, trajectories, facehint = args[0:3]
  traj.MeasurementsTable( {'whiskers':whiskers, 'facehint':facehint} ).commit_trajectories(trajectories).save(name)
Beispiel #14
0
def load_measurements( name ):
  try:
    return [traj.MeasurementsTable(name).get_trajectories(),0]
  except IOError:
    print "Couldn't open file. Creating: ", name
    return {},0
Beispiel #15
0
warnings.simplefilter("default", UserWarning)

if __name__ == '__main__':
    parser = optparse.OptionParser(usage="Usage: %prog source destination")
    options, args = parser.parse_args()
    if len(args) != 2:
        parser.error(
            "Expected source and destination file names but recieved %d arguments."
            % len(args))
    src, dst = args

    if not os.path.exists(os.path.split(
            dst)[0]):  # check path, do this before doing long calculation
        raise IOError, "Could not find destination file %s" % dst

    #
    # Get data from source
    #
    ext = os.path.splitext(src)[1]
    if ext == '.whiskers':
        w = trace.Load_Whiskers(src)
        data = array(list(summary.features(w)))
    elif ext == '.measurements':
        data = traj.MeasurementsTable(src).asarray()
    else:
        raise IOError, "Source file extension not recognized.  Got: %s" % ext

    traj = summary._simpletraj(data)

    save_trajectories(dst, traj)