def get_spikes(session,area,unit,trial): if dowarn(): print 'NOTE UNIT IS 1 INDEXED FOR MATLAB COMPATIBILITY CONVENTIONS' if dowarn(): print 'NOTE TRIAL IS 1 INDEXED FOR MATLAB COMPATIBILITY CONVENTIONS' if dowarn(): print 'NOTE EVENT IS 1 INDEXED FOR MATLAB COMPATIBILITY CONVENTIONS' assert trial>0 ByTrialSpikesMS = cgid.data_loader.metaloadvariable(session,area,ByTrialSpikesMS) return ByTrialSpikesMS[unit-1,trial-1]
def get_trial_event(session, area, trial, event): if dowarn(): print("TRIAL IS 1 INDEXED FOR MATLAB COMPATIBILITY") if dowarn(): print("EVENT IS 1 INDEXED FOR MATLAB COMPATIBILITY") assert trial > 0 debug(trial, event) return metaloadvariable(session, area, "eventsByTrial")[trial - 1, event - 1]
def get_spikes_event(session,area,unit,trial,event,start,stop): if dowarn(): print 'NOTE UNIT IS 1 INDEXED FOR MATLAB COMPATIBILITY CONVENTIONS' if dowarn(): print 'NOTE TRIAL IS 1 INDEXED FOR MATLAB COMPATIBILITY CONVENTIONS' if dowarn(): print 'NOTE EVENT IS 1 INDEXED FOR MATLAB COMPATIBILITY CONVENTIONS' assert trial>0 ByTrialSpikesMS = cgid.data_loader.metaloadvariable(session,area,'ByTrialSpikesMS') spikems = ByTrialSpikesMS[unit-1,trial-1] te = cgid.data_loader.get_trial_event(session,area,trial,event) start += te stop += te if len(spikems)==0: return np.array(spikems) spikems = spikems[spikems>=start] spikems = spikems[spikems<stop] return np.unique(np.array(spikems)-start)
def get_available_channels(session, area): """ Gets the list of channels that are available for a sessiona and area """ if dowarn(): print("CHANNEL IS 1 INDEXED FOR MATLAB COMPATIBILITY") return find(metaloadvariable(session, area, "availableChannels")[:, 0]) + 1
def get_good_channels(session, area, keepBad=False, rule="liberal"): if dowarn(): print("CHANNEL IS 1 INDEXED FOR MATLAB COMPATIBILITY") warn("CALLING SEMANTICS CHANGE") good = get_available_channels(session, area) if not keepBad: for bad in get_bad_channels(session, area, rule=rule): good = np.delete(good, find(good == bad)) return good
def get_spikes_session(session,area,unit,Fs=1000): ''' spikeTimes: 1xNUNITS cell array of spike times in seconds. These are raw spike times for the whole session and have not been segmented into individual trials. ''' if dowarn(): print 'NOTE UNIT IS 1 INDEXED FOR MATLAB COMPATIBILITY CONVENTIONS' spikeTimes = cgid.data_loader.metaloadvariable(session,area,'spikeTimes') return int32(spikeTimes[0,unit-1][:,0]*Fs)
def get_valid_trials(session, area=None): if dowarn(): print("TRIAL IS 1 INDEXED FOR MATLAB COMPATIBILITY") if area is None: trials = set(find(metaloadvariable(session, "M1", "eventsByTrial")[:, 0]) + 1) trials &= set(find(metaloadvariable(session, "PMv", "eventsByTrial")[:, 0]) + 1) trials &= set(find(metaloadvariable(session, "PMd", "eventsByTrial")[:, 0]) + 1) return np.array(list(trials)) else: return np.array(find(1 == metaloadvariable(session, area, "eventsByTrial")[:, 0]))
def metaloaddata(session, area): """ Loads a matfile from the provided path, caching it in the global dict "matfilecache" using path as the lookup key. Parameters ---------- path : string unique absolute path to matfile to be loaded """ global cgid_matfilecache path = archive_name(session, area) if path in cgid_matfilecache: return cgid_matfilecache[path] print("caching", path) if dowarn(): print("loading data...") data = loadmat(path) cgid_matfilecache[path] = data if dowarn(): print("loaded") return data
def get_data(session, area, trial, event, start, stop, lowf, highf, params): """ Need to abstract loading on neural data from the CGID arrays -- this is getting too complicated. Interface request: session area trial reference event start time offset stop time offset filter start frequency filter stop frequency filter parameter codes returns: times: len nt trial times in ms for the data relative to reference marker xys: nelectrode-x-2 x,y positions of electrodes in array map space data: a nt-x-nelectrode filtered neural data snippit To do this, we will need to -- identify and locate relevant data archive -- import data archive -- locate relevant trial, possibly in the raw LFP if we need to use padding -- perform requested filtering on all channels -- generate time and space bases -- extract and pack data Note: trial, event, start, stop are using the matlab convention, 1-index Extracting the cortical locations of the electrodes is very very very tricky. We will use the same coordinate system as in the videos, where Y is the distance from ventral to dorsal along central sulcus from M1 array in mm. and X is the distance from caudal to rostral from M1 implant in mm """ """ #Test code session = 'RUS120521' area = 'PMv' trial = 10 event = 6 start = -1000 stop = 0 lowf = 15 highf = 30 params = 0 times,xys,data = get_data(session,area,trial,event,start,stop,lowf,highf,params) """ if dowarn(): print("TRIAL IS 1 INDEXED FOR MATLAB COMPATIBILITY") print("loading data..."), availableChannels = metaloadvariable(session, area, "availableChannels") eventsByTrial = metaloadvariable(session, area, "eventsByTrial") print("done") trialEvents = eventsByTrial[trial - 1] trialStart = trialEvents[3] eventCode = trialEvents[event - 1] dataStart = eventCode + trialStart + start dataStop = eventCode + trialStart + stop # extracting and filtering the data is the easy part times = arange(start, stop) data = [] for ch in get_good_channels(session, area): clipped = get_analytic_lfp(session, area, ch, trial, (event, start, stop), lowf, highf, Fs=1000) data.append(clipped) # compile the list of spatial locations box, positions = getElectrodePositions(session, area) xys = arr([positions[ch] for ch in sorted(list(positions.keys()))]) return times, xys, np.array(data).T, squeeze(availableChannels)