예제 #1
0
def suppression_stats(cell, bandIndex=0):
    cellInfo = get_cell_info(cell)
    loader = dataloader.DataLoader(cell['subject'])
    try:
        eventData = loader.get_session_events(cellInfo['ephysDirs'][bandIndex])
        spikeData = loader.get_session_spikes(cellInfo['ephysDirs'][bandIndex],
                                              cellInfo['tetrode'],
                                              cluster=cellInfo['cluster'])
        bandBData = loader.get_session_behavior(
            cellInfo['behavDirs'][bandIndex])
    except IOError:
        print "File does not exist"
        return None, None
    eventOnsetTimes = loader.get_event_onset_times(eventData)
    spikeTimeStamps = spikeData.timestamps
    timeRange = [0.0, 1.0]
    bandEachTrial = bandBData['currentBand']
    ampEachTrial = bandBData['currentAmp']
    charFreq = np.unique(bandBData['charFreq'])[0]
    numBands = np.unique(bandEachTrial)
    numAmps = np.unique(ampEachTrial)

    spikeArray, errorArray, baselineSpikeRate = band_select(
        spikeTimeStamps, eventOnsetTimes, ampEachTrial, bandEachTrial,
        timeRange)
    print spikeArray
    suppressionStats = compute_suppression_stats(spikeArray, numBands)
    return suppressionStats
예제 #2
0
def band_SNR_laser_psychometric(animal, sessions, trialTypes='laserSide', paradigm='2afc', xlabel=True, ylabel=True):
    loader = dataloader.DataLoader(animal)
    validPerSNR = None
    rightPerSNR = None
    for ind, session in enumerate(sessions):
        behavFile = loadbehavior.path_to_behavior_data(animal,paradigm,session)
        behavData = loader.get_session_behavior(behavFile)
        ax = plt.gca()
        ax.cla()
        possibleSNRs = np.unique(behavData['currentSNR'])
        laserTrialTypes = np.unique(behavData[trialTypes])
        trialsEachCond = behavioranalysis.find_trials_each_combination(behavData['currentSNR'], possibleSNRs, 
                                                                        behavData[trialTypes], laserTrialTypes)
        valid = behavData['valid'].astype(bool)
        rightChoice = behavData['choice']==behavData.labels['choice']['right']
        if validPerSNR is None:
            validPerSNR = np.zeros((len(laserTrialTypes),len(possibleSNRs)))
            rightPerSNR = np.zeros((len(laserTrialTypes),len(possibleSNRs)))
        for las in range(len(laserTrialTypes)):
            trialsThisLaser = trialsEachCond[:,:,las]
            for inds in range(len(possibleSNRs)):
                trialsThisSNR = trialsThisLaser[:,inds]
                validThisSNR = np.sum(trialsThisSNR.astype(int)[valid])
                rightThisSNR = np.sum(trialsThisSNR.astype(int)[rightChoice])
                validPerSNR[las,inds] += validThisSNR
                rightPerSNR[las,inds] += rightThisSNR
    return validPerSNR, rightPerSNR, possibleSNRs, laserTrialTypes
예제 #3
0
def laser_response(cell, timeRange=[0.0, 0.1], baseRange=[0.5, 0.6]):
    cellInfo = get_cell_info(cell)
    loader = dataloader.DataLoader(cell['subject'])
    if len(cellInfo['laserIndex']) > 0:
        eventData = loader.get_session_events(
            cellInfo['ephysDirs'][cellInfo['laserIndex'][-1]])
        spikeData = loader.get_session_spikes(
            cellInfo['ephysDirs'][cellInfo['laserIndex'][-1]],
            cellInfo['tetrode'],
            cluster=cellInfo['cluster'])
        eventOnsetTimes = loader.get_event_onset_times(eventData)
        spikeTimestamps = spikeData.timestamps
        spikeTimesFromEventOnset, trialIndexForEachSpike, indexLimitsEachTrial = spikesanalysis.eventlocked_spiketimes(
            spikeTimestamps, eventOnsetTimes,
            [min(timeRange), max(baseRange)])
        zStatsEachRange, pValueEachRange, maxZvalue = spikesanalysis.response_score(
            spikeTimesFromEventOnset, indexLimitsEachTrial, baseRange,
            timeRange)
        baseSpikeCountMat = spikesanalysis.spiketimes_to_spikecounts(
            spikeTimesFromEventOnset, indexLimitsEachTrial, baseRange)
        baselineSpikeRate = np.mean(baseSpikeCountMat) / (baseRange[1] -
                                                          baseRange[0])
        laserSpikeCountMat = spikesanalysis.spiketimes_to_spikecounts(
            spikeTimesFromEventOnset, indexLimitsEachTrial, timeRange)
        laserSpikeRate = np.mean(laserSpikeCountMat) / (timeRange[1] -
                                                        timeRange[0])
        laserResponse = (laserSpikeRate > baselineSpikeRate
                         and pValueEachRange[0] < 0.00001)
    else:
        laserResponse = False

    return laserResponse
예제 #4
0
def highest_significant_sync(cell):
    try:
        sessiontypeIndex = cell['sessiontype'].index(defaultAMtype)
    except ValueError:  #The cell does not have this session type
        return None
    #Initialize a data loader for this animal
    loader = dataloader.DataLoader(cell['subject'])
    #Get the behavior data
    behavData = loader.get_session_behavior(cell['behavior'][sessiontypeIndex])
    freqEachTrial = behavData['currentFreq']
    possibleFreq = np.unique(freqEachTrial)
    ephysDir = cell['ephys'][sessiontypeIndex]
    clusterSpikeData = loader.get_session_spikes(ephysDir,
                                                 int(cell['tetrode']),
                                                 cluster=int(cell['cluster']))
    clusterSpikeTimes = clusterSpikeData.timestamps
    #Get the events for this session and calculate onset times
    eventData = loader.get_session_events(ephysDir)
    eventOnsetTimes = loader.get_event_onset_times(eventData,
                                                   minEventOnsetDiff=None)
    timeRange = [0, 0.5]
    trialsEachCond = behavioranalysis.find_trials_each_type(
        freqEachTrial, possibleFreq)
    vs_array, pval_array, ral_array = AM_vector_strength(
        clusterSpikeTimes, eventOnsetTimes, behavData, timeRange)
    if np.any(pval_array < 0.05):
        highestSync = np.max(possibleFreq[pval_array < 0.05])
    else:
        highestSync = 0
    return highestSync
def best_band_index(cell):
    cellInfo = get_cell_info(cell)
    loader = dataloader.DataLoader(cell['subject'])
    bandIndex = cellInfo['bandIndex']
    if len(bandIndex)==0:
        bandIndex = cellInfo['laserBandIndex']
    charFreqs = []
    if len(bandIndex)==0:
        print "No bandwidth session"
        return None, None, None
    for ind in bandIndex:
        bandBData = loader.get_session_behavior(cellInfo['behavDirs'][ind]) 
        charFreq = np.unique(bandBData['charFreq'])[0]
        charFreqs.append(charFreq)
    tuningIndex = cellInfo['tuningIndex'][0]
    tuningBData = loader.get_session_behavior(cellInfo['behavDirs'][tuningIndex])
    eventData = loader.get_session_events(cellInfo['ephysDirs'][tuningIndex])
    spikeData = loader.get_session_spikes(cellInfo['ephysDirs'][tuningIndex], cellInfo['tetrode'], cluster=cellInfo['cluster'])
    eventOnsetTimes = loader.get_event_onset_times(eventData)
    spikeTimeStamps = spikeData.timestamps
    freqEachTrial = tuningBData['currentFreq']
    bandAtBest = []
    for charFreq in charFreqs:
        atBestFreq, bestFreq = at_best_freq(spikeTimeStamps, eventOnsetTimes, charFreq, freqEachTrial)
        bandAtBest.append(atBestFreq)
    if True in bandAtBest:
        bestIndex = bandAtBest.index(True)
        bandIndex = bandIndex[bestIndex]
        atBestFreq = True
    else:
        bandIndex = None
    return bandIndex, atBestFreq, bestFreq
예제 #6
0
def compare_laser_spikeshapes(cell):
    try:
        sessiontypeIndex = cell['sessiontype'].index('LaserPulse')
    except ValueError:  #The cell does not have this session type
        return numpy.nan, numpy.nan

    loader = dataloader.DataLoader(cell['subject'])
    clusterSpikeData = loader.get_session_spikes(
        cell['ephys'][sessiontypeIndex],
        cluster=int(cell['cluster']),
        tetrode=int(cell['tetrode']))
    eventData = loader.get_session_events(cell['ephys'][sessiontypeIndex])
    eventOnsetTimes = loader.get_event_onset_times(eventData)

    spontRange = [-0.1, -0]
    evokedRange = [0, 0.1]

    samples = clusterSpikeData.samples
    timestamps = clusterSpikeData.timestamps

    spontWaveform, spontStd = average_waveform_in_timerange(
        samples, timestamps, eventOnsetTimes, spontRange)
    evokedWaveform, evokedStd = average_waveform_in_timerange(
        samples, timestamps, eventOnsetTimes, evokedRange)

    return spontWaveform, evokedWaveform, spontStd, evokedStd
def plot_bandwidth_report_if_best(cell):
    cellInfo = get_cell_info(cell)
    loader = dataloader.DataLoader(cell['subject'])
    bandIndex = cellInfo['bandIndex']
    charFreqs = []
    
    for ind in bandIndex:
        bandBData = loader.get_session_behavior(cellInfo['behavDirs'][ind]) 
        charFreq = np.unique(bandBData['charFreq'])[0]
        charFreqs.append(charFreq)
    tuningIndex = cellInfo['tuningIndex'][0]
    tuningBData = loader.get_session_behavior(cellInfo['behavDirs'][tuningIndex])
    eventData = loader.get_session_events(cellInfo['ephysDirs'][tuningIndex])
    spikeData = loader.get_session_spikes(cellInfo['ephysDirs'][tuningIndex], cellInfo['tetrode'], cluster=cellInfo['cluster'])
    eventOnsetTimes = loader.get_event_onset_times(eventData)
    spikeTimeStamps = spikeData.timestamps
    freqEachTrial = tuningBData['currentFreq']
    bandAtBest = []
    for charFreq in charFreqs:
        atBestFreq = at_best_freq(spikeTimeStamps, eventOnsetTimes, charFreq, freqEachTrial)
        bandAtBest.append(atBestFreq)
    #plot reports for cells at best frequency
    if True in bandAtBest:
        bestIndex = bandAtBest.index(True)
        bandIndex = bandIndex[bestIndex]
        plot_bandwidth_report(cell, bandIndex)
예제 #8
0
def tuning_curve_response(cell):
    '''
    Calculate max Z-score during the response period for each freq-inten combo in a TC
    '''

    try:
        sessiontypeIndex = cell['sessiontype'].index(defaultTCtype)
    except ValueError: #The cell does not have this session type
        return None

    #Initialize a data loader for this animal
    loader = dataloader.DataLoader(cell['subject'])

    #Get the behavior data
    behavData = loader.get_session_behavior(cell['behavior'][sessiontypeIndex])
    intensityEachTrial = behavData['currentIntensity']
    freqEachTrial = behavData['currentFreq']

    possibleFreq = np.unique(freqEachTrial)
    possibleIntensity = np.unique(intensityEachTrial)

    #Return the cluster spike data for this ephys session
    ephysDir = cell['ephys'][sessiontypeIndex]
    clusterSpikeData = loader.get_session_spikes(ephysDir, int(cell['tetrode']), cluster=int(cell['cluster']))
    clusterSpikeTimes = clusterSpikeData.timestamps

    #Get the events for this session and calculate onset times
    eventData = loader.get_session_events(ephysDir)
    eventOnsetTimes = loader.get_event_onset_times(eventData, minEventOnsetDiff=None)

    baseRange = [-0.1, 0]
    responseRange = [0, 0.1]
    alignmentRange = [baseRange[0], responseRange[1]]

    zvalArray = np.zeros((len(possibleIntensity), len(possibleFreq)))

    for indfreq, freq in enumerate(possibleFreq):
        for indinten, inten in enumerate(possibleIntensity):
            selectinds = np.flatnonzero((freqEachTrial==freq)&(intensityEachTrial==inten))
            selectedOnsetTimes = eventOnsetTimes[selectinds]

            (spikeTimesFromEventOnset,trialIndexForEachSpike,indexLimitsEachTrial) = \
            spikesanalysis.eventlocked_spiketimes(clusterSpikeTimes,selectedOnsetTimes,alignmentRange)

            nspkBase = spikesanalysis.spiketimes_to_spikecounts(spikeTimesFromEventOnset,
                                                                indexLimitsEachTrial,
                                                                baseRange)
            nspkResp = spikesanalysis.spiketimes_to_spikecounts(spikeTimesFromEventOnset,
                                                                indexLimitsEachTrial,
                                                                responseRange)

            zStat, pValue = stats.ranksums(nspkResp[:,0], nspkBase[:,0])

            zvalArray[indinten, indfreq] = zStat

    return zvalArray
def event_response_score(cell,
                         sessiontype,
                         maxZonly=False,
                         responseTimeRange=[-0.5, 1],
                         skip=False):
    '''
    Used to calculate simple response to noise bursts and laser pulses
    '''

    #Find the index of the ephys for this session if it exists
    try:
        sessiontypeIndex = cell['sessiontype'].index(sessiontype)
    except ValueError:  #The cell does not have this session type
        return None

    #Initialize a data loader for this animal
    loader = dataloader.DataLoader(cell['subject'])

    #Return the cluster spike data for this ephys session
    ephysDir = cell['ephys'][sessiontypeIndex]
    clusterSpikeData = loader.get_session_spikes(ephysDir,
                                                 int(cell['tetrode']),
                                                 cluster=int(cell['cluster']))
    clusterSpikeTimes = clusterSpikeData.timestamps

    #Get the events for this session and calculate onset times
    eventData = loader.get_session_events(ephysDir)
    eventOnsetTimes = loader.get_event_onset_times(eventData,
                                                   minEventOnsetDiff=None)

    if skip:
        onsetTimesToUse = np.arange(skip, len(eventOnsetTimes), skip)
        eventOnsetTimes = eventOnsetTimes[onsetTimesToUse]

    #Zscore settings from billy
    baseRange = [-0.050, -0.025]  # Baseline range (in seconds)
    binTime = baseRange[1] - baseRange[0]  # Time-bin size
    responseTimeRange = responseTimeRange  #Time range to calculate z value for (should be divisible by binTime
    responseTime = responseTimeRange[1] - responseTimeRange[0]
    numBins = responseTime / binTime
    binEdges = np.arange(responseTimeRange[0], responseTimeRange[1], binTime)
    timeRange = [-0.5, 1]

    #TODO: Get the spikes and events

    (spikeTimesFromEventOnset,trialIndexForEachSpike,indexLimitsEachTrial) = \
    spikesanalysis.eventlocked_spiketimes(clusterSpikeTimes,eventOnsetTimes,timeRange)

    [zStat, pValue, maxZ] = spikesanalysis.response_score(
        spikeTimesFromEventOnset, indexLimitsEachTrial, baseRange, binEdges
    )  #computes z score for each bin. zStat is array of z scores. maxZ is maximum value of z in timeRange

    if maxZonly:
        return maxZ
    else:
        return zStat, pValue, maxZ
예제 #10
0
def behav_stats(animal, sessions, paradigm='2afc'):
    loader = dataloader.DataLoader(animal)
    nValid = 0
    nCorrect = 0
    for session in sessions:
        behavFile = loadbehavior.path_to_behavior_data(animal,paradigm,session)
        behavData = loader.get_session_behavior(behavFile)
        correct = behavData['outcome']==behavData.labels['outcome']['correct']
        valid = behavData['valid'].astype(bool)
        nValid += len(valid)
        nCorrect += len(correct[correct==True])
    return nValid, nCorrect
예제 #11
0
def plot_laser_bandwidth_summary(cell, bandIndex):
    cellInfo = get_cell_info(cell)
    loader = dataloader.DataLoader(cell['subject'])
    plt.clf()
    gs = gridspec.GridSpec(2, 4)
    eventData = loader.get_session_events(cellInfo['ephysDirs'][bandIndex])
    spikeData = loader.get_session_spikes(cellInfo['ephysDirs'][bandIndex], cellInfo['tetrode'], cluster=cellInfo['cluster'])
    eventOnsetTimes = loader.get_event_onset_times(eventData)
    spikeTimestamps = spikeData.timestamps
    timeRange = [-0.2, 1.5]
    bandBData = loader.get_session_behavior(cellInfo['behavDirs'][bandIndex])  
    bandEachTrial = bandBData['currentBand']
    laserTrial = bandBData['laserTrial']
    numBands = np.unique(bandEachTrial)
    numLas = np.unique(laserTrial)
            
    firstSortLabels = ['{}'.format(band) for band in np.unique(bandEachTrial)]
    secondSortLabels = ['no laser','laser']      
    trialsEachCond = behavioranalysis.find_trials_each_combination(bandEachTrial, 
                                                                           numBands, 
                                                                           laserTrial, 
                                                                           numLas)
    spikeTimesFromEventOnset, trialIndexForEachSpike, indexLimitsEachTrial = spikesanalysis.eventlocked_spiketimes(
                                                                                                        spikeTimestamps, 
                                                                                                        eventOnsetTimes,
                                                                                                        timeRange) 
    colours = [np.tile(['0.25','0.6'],len(numBands)/2+1), np.tile(['#4e9a06','#8ae234'],len(numBands)/2+1)]
    for ind, secondArrayVal in enumerate(numLas):
        plt.subplot(gs[ind, 0:2])
        trialsThisSecondVal = trialsEachCond[:, :, ind]
        pRaster, hcond, zline = extraplots.raster_plot(spikeTimesFromEventOnset,
                                                        indexLimitsEachTrial,
                                                        timeRange,
                                                        trialsEachCond=trialsThisSecondVal,
                                                        labels=firstSortLabels,
                                                        colorEachCond = colours[ind])
        plt.setp(pRaster, ms=4)        
        #plt.title(secondSortLabels[ind])
        plt.ylabel('bandwidth (octaves)')
        if ind == len(numLas) - 1:
            plt.xlabel("Time from sound onset (sec)")
    
           
    # -- plot Yashar plots for bandwidth data --
    plt.subplot(gs[0:, 2:])
    spikeArray, errorArray, baseSpikeRate = band_select(spikeTimestamps, eventOnsetTimes, laserTrial, bandEachTrial, timeRange = [0.0, 1.0])
    band_select_plot(spikeArray, errorArray, baseSpikeRate, numBands, legend=True, labels=secondSortLabels, linecolours=['0.25','#4e9a06'], errorcolours=['0.6','#8ae234'])
    fig_path = '/home/jarauser/Pictures/cell reports'
    fig_name = '{0}_{1}_{2}um_TT{3}Cluster{4}.svg'.format(cellInfo['subject'], cellInfo['date'], cellInfo['depth'], cellInfo['tetrode'], cellInfo['cluster'])
    full_fig_path = os.path.join(fig_path, fig_name)
    fig = plt.gcf()
    fig.set_size_inches(16, 8)
    fig.savefig(full_fig_path, format = 'svg', bbox_inches='tight')
예제 #12
0
def plot_am_psth(cell):
    try:
        sessiontypeIndex = cell['sessiontype'].index(defaultAMtype)
    except ValueError:  #The cell does not have this session type
        return None

    #Initialize a data loader for this animal
    loader = dataloader.DataLoader(cell['subject'])

    #Get the behavior data
    behavData = loader.get_session_behavior(cell['behavior'][sessiontypeIndex])

    freqEachTrial = behavData['currentFreq']
    possibleFreq = np.unique(freqEachTrial)

    ephysDir = cell['ephys'][sessiontypeIndex]
    clusterSpikeData = loader.get_session_spikes(ephysDir,
                                                 int(cell['tetrode']),
                                                 cluster=int(cell['cluster']))
    clusterSpikeTimes = clusterSpikeData.timestamps

    #Get the events for this session and calculate onset times
    eventData = loader.get_session_events(ephysDir)
    eventOnsetTimes = loader.get_event_onset_times(eventData,
                                                   minEventOnsetDiff=None)

    # timeRange = [-0.1, 0.6]

    # spikeTimesFromEventOnset, trialIndexForEachSpike, indexLimitsEachTrial = spikesanalysis.eventlocked_spiketimes(clusterSpikeTimes, eventOnsetTimes, timeRange)

    # colourList = ['b', 'g', 'y', 'orange', 'r']
    nColors = len(possibleFreq)
    # colors = plt.cm.viridis(np.linspace(0, 1, nColors))
    colors = plt.cm.jet(np.linspace(0, 1, nColors))

    # numRates = np.unique(rateEachTrial)
    # trialsEachCond = behavioranalysis.find_trials_each_type(rateEachTrial, numRates)

    dataplotter.plot_psth(clusterSpikeTimes,
                          eventOnsetTimes,
                          freqEachTrial,
                          timeRange=[-0.2, 0.8],
                          binsize=50,
                          colorEachCond=colors)

    plt.xlabel('Time from sound onset (sec)')
    plt.ylabel('Firing rate (Hz)')
    plt.title('AM PSTH')
예제 #13
0
def behav_laser_stats(animal, sessions, paradigm='2afc'):
    loader = dataloader.DataLoader(animal)
    nValid = [0,0]
    nCorrect = [0,0]
    for session in sessions:
        behavFile = loadbehavior.path_to_behavior_data(animal,paradigm,session)
        behavData = loader.get_session_behavior(behavFile)
        laserTrials = np.where(behavData['laserSide']!=0)
        conTrials = np.where(behavData['laserSide']==0)
        correct = behavData['outcome']==behavData.labels['outcome']['correct']
        valid = behavData['valid'].astype(bool)
        nValid[0] += len(valid[conTrials])
        nValid[1] += len(valid[laserTrials])
        nCorrect[0] += np.sum(correct[conTrials])
        nCorrect[1] += np.sum(correct[laserTrials])
    return nValid, nCorrect
예제 #14
0
def am_dependence(spikesEachTrial, rateEachTrial):
    '''
    Calculate the average firing rate of a cell during the 0.5sec AM sound.
    Perform a linear regression on average firing rate and AM rate, and
    return the correlation coefficient for the regression.
    '''

    try:
        sessiontypeIndex = cell['sessiontype'].index(defaultAMtype)
    except ValueError:  #The cell does not have this session type
        return None

    #Initialize a data loader for this animal
    loader = dataloader.DataLoader(cell['subject'])

    #Get the behavior data
    behavData = loader.get_session_behavior(cell['behavior'][sessiontypeIndex])
    freqEachTrial = behavData['currentFreq']

    possibleFreq = np.unique(freqEachTrial)

    ephysDir = cell['ephys'][sessiontypeIndex]
    clusterSpikeData = loader.get_session_spikes(ephysDir,
                                                 int(cell['tetrode']),
                                                 cluster=int(cell['cluster']))
    clusterSpikeTimes = clusterSpikeData.timestamps

    #Get the events for this session and calculate onset times
    eventData = loader.get_session_events(ephysDir)
    eventOnsetTimes = loader.get_event_onset_times(eventData,
                                                   minEventOnsetDiff=None)

    timeRange = [0, 0.5]

    trialsEachCond = behavioranalysis.find_trials_each_type(
        freqEachTrial, possibleFreq)

    spikeArray = dataplotter.avg_spikes_in_event_locked_timerange_each_cond(
        clusterSpikeTimes, trialsEachCond, eventOnsetTimes, timeRange)

    slope, intercept, r_value, p_value, std_err = stats.linregress(
        spikeArray, possibleFreq)

    if not frArray:
        return r_value
    else:
        return r_value, spikeArray, possibleFreq
예제 #15
0
def plot_am_raster(cell):
    try:
        sessiontypeIndex = cell['sessiontype'].index(defaultAMtype)
    except ValueError:  #The cell does not have this session type
        return None

    #Initialize a data loader for this animal
    loader = dataloader.DataLoader(cell['subject'])

    #Get the behavior data
    behavData = loader.get_session_behavior(cell['behavior'][sessiontypeIndex])

    freqEachTrial = behavData['currentFreq']
    possibleFreq = np.unique(freqEachTrial)

    ephysDir = cell['ephys'][sessiontypeIndex]
    clusterSpikeData = loader.get_session_spikes(ephysDir,
                                                 int(cell['tetrode']),
                                                 cluster=int(cell['cluster']))
    clusterSpikeTimes = clusterSpikeData.timestamps

    #Get the events for this session and calculate onset times
    eventData = loader.get_session_events(ephysDir)
    eventOnsetTimes = loader.get_event_onset_times(eventData,
                                                   minEventOnsetDiff=None)

    timeRange = [-0.2, 0.8]
    spikeTimesFromEventOnset, trialIndexForEachSpike, indexLimitsEachTrial = spikesanalysis.eventlocked_spiketimes(
        clusterSpikeTimes, eventOnsetTimes, timeRange)

    nColors = len(possibleFreq)
    # colors = plt.cm.viridis(np.linspace(0, 1, nColors))
    colors = plt.cm.jet(np.linspace(0, 1, nColors))

    freqLabels = ["%.0f" % rate for rate in np.unique(freqEachTrial)]
    dataplotter.plot_raster(clusterSpikeTimes,
                            eventOnsetTimes,
                            sortArray=freqEachTrial,
                            timeRange=[-0.2, 0.8],
                            labels=freqLabels,
                            colorEachCond=colors)
    plt.xlabel('Time from sound onset (sec)')
    plt.ylabel('Modulation Rate (Hz)')
    plt.title('AM Raster')
예제 #16
0
def time_differences_by_trial(animal, sessions, sortBy, paradigm = '2afc', triggers = ['Cin', 'Cout']):
    loader = dataloader.DataLoader(animal)
    timeDiff = []
    import pdb
    for ind,session in enumerate(sessions):
        behavFile = loadbehavior.path_to_behavior_data(animal,paradigm,session)
        behavData = loader.get_session_behavior(behavFile)
        possibleSort = np.unique(behavData[sortBy])
        if ind == 0:
            for sort in range(len(possibleSort)):
                timeDiff.append([])
        trialsEachCond = behavioranalysis.find_trials_each_type(behavData[sortBy], possibleSort)
        eventCode = np.array(behavData.events['eventCode'])
        eventTime = behavData.events['eventTime']
        nextState = behavData.events['nextState']
        trialEnd = np.where(nextState==behavData.stateMatrix['statesNames']['startTrial'])[0][1:]
        try:
            start = np.where(eventCode==behavData.stateMatrix['eventsNames'][triggers[0]])[0]
        except KeyError:
            start = np.where(nextState==behavData.stateMatrix['statesNames'][triggers[0]])[0]+1
        try:
            stop = np.where(eventCode==behavData.stateMatrix['eventsNames'][triggers[1]])[0]
        except KeyError:
            stop = np.where(nextState==behavData.stateMatrix['statesNames'][triggers[1]])[0]+1
        for ind in range(len(possibleSort)):
            trialsThisCond = trialsEachCond[:,ind]
            if len(trialsThisCond) > len(trialEnd):
                trialsThisCond = trialsThisCond[:-1]
            trialEndThisCond = trialEnd[trialsThisCond]
            startThisCond = np.zeros(sum(trialsThisCond))
            stopThisCond = np.zeros(sum(trialsThisCond))
            #pdb.set_trace()
            for i in range(len(trialEndThisCond)):
                startThisCond[i] = max(j for j in start if j < trialEndThisCond[i])
                stopThisCond[i] = min(k for k in stop if k > startThisCond[i])
            startThisCond = startThisCond.astype(int)
            stopThisCond = stopThisCond.astype(int)
            startTime = eventTime[startThisCond]
            stopTime = eventTime[stopThisCond]
            diffThisCond = stopTime - startTime
            #pdb.set_trace()
            timeDiff[ind].extend(diffThisCond)
    return timeDiff, possibleSort
def plot_cell_am(cell, amtype):

    fontsize = 20

    loader = dataloader.DataLoader(cell['subject'])
    try:
        sessiontypeIndex = cell['sessiontype'].index(amtype)

        plt.cla()

        bdata = loader.get_session_behavior(cell['behavior'][sessiontypeIndex])
        eventData = loader.get_session_events(cell['ephys'][sessiontypeIndex])
        spikeData = loader.get_session_spikes(cell['ephys'][sessiontypeIndex],
                                              int(cell['tetrode']),
                                              cluster=int(cell['cluster']))

        spikeTimestamps = spikeData.timestamps
        eventOnsetTimes = loader.get_event_onset_times(eventData)

        currentFreq = bdata['currentFreq']
        dataplotter.plot_raster(spikeTimestamps,
                                eventOnsetTimes,
                                sortArray=currentFreq,
                                fillWidth=0,
                                timeRange=[-0.2, 0.8],
                                ms=2.5)

        ax = plt.gca()
        # extraplots.set_ticks_fontsize(ax, fontsize)
        # ax.set_yticks(np.linspace(0, 10, 3))
        # ax.set_yticklabels(np.round(np.logspace(np.log10(4), np.log10(128), 3), decimals=1))

        fig = plt.gcf()
        # fig.set_size_inches(4.3, 3.9)
        plt.ylabel('AM Rate (Hz)', fontsize=fontsize)
        plt.xlabel('Time from sound onset (s)', fontsize=fontsize)

        # ax.set_xticks([0, 0.5])

    except ValueError:  #The cell does not have this session type
        print 'no am'
예제 #18
0
def band_SNR_psychometric(animal, sessions, paradigm = '2afc'):
    loader = dataloader.DataLoader(animal)
    validPerSNR = None
    rightPerSNR = None
    for ind,session in enumerate(sessions):
        behavFile = loadbehavior.path_to_behavior_data(animal,paradigm,session)
        behavData = loader.get_session_behavior(behavFile)
        possibleSNRs = np.unique(behavData['currentSNR'])
        trialsEachCond = behavioranalysis.find_trials_each_type(behavData['currentSNR'], possibleSNRs)
        valid = behavData['valid'].astype(bool)
        rightChoice = behavData['choice']==behavData.labels['choice']['right']
        if validPerSNR is None:
            validPerSNR = np.zeros(len(possibleSNRs))
            rightPerSNR = np.zeros(len(possibleSNRs))
        for inds in range(len(possibleSNRs)):
            trialsThisSNR = trialsEachCond[:,inds]
            validThisSNR = np.sum(trialsThisSNR.astype(int)[valid]) 
            rightThisSNR = np.sum(trialsThisSNR.astype(int)[rightChoice])
            validPerSNR[inds] += validThisSNR
            rightPerSNR[inds] += rightThisSNR
    return validPerSNR, rightPerSNR, possibleSNRs
예제 #19
0
def time_differences(animal, sessions, paradigm = '2afc', triggers = ['Cin', 'Cout']):
    import pdb
    loader = dataloader.DataLoader(animal)
    timeDiff = None
    for ind,session in enumerate(sessions):
        behavFile = loadbehavior.path_to_behavior_data(animal,paradigm,session)
        behavData = loader.get_session_behavior(behavFile)
        eventCode = np.array(behavData.events['eventCode'])
        eventTime = behavData.events['eventTime']
        nextState = behavData.events['nextState']
        try:
            start = np.where(eventCode==behavData.stateMatrix['eventsNames'][triggers[0]])[0]
        except KeyError:
            start = np.where(nextState==behavData.stateMatrix['statesNames'][triggers[0]])[0]+1
        try:
            stop = np.where(eventCode==behavData.stateMatrix['eventsNames'][triggers[1]])[0]
        except KeyError:
            stop = np.where(nextState==behavData.stateMatrix['statesNames'][triggers[1]])[0]+1
        if len(start)>len(stop):
            startAll = start.copy()
            start = np.zeros(len(stop))
            for i in range(len(stop)):
                start[i] = max(j for j in startAll if j < stop[i])
            start = start.astype(int)
        if len(stop)>len(start):
            stopAll = stop.copy()
            stop = np.zeros(len(start))
            for i in range(len(start)):
                stop[i] = min(j for j in stopAll if j > start[i])
            stop = stop.astype(int)
        startTime = eventTime[start]
        stopTime = eventTime[stop]
        pdb.set_trace()
        diffThisSess = stopTime-startTime
        if timeDiff is None:
            timeDiff = diffThisSess
        else:
            timeDiff = np.concatenate((timeDiff, diffThisSess))
    return timeDiff
예제 #20
0
def suppression_stats(cell, bandSession=0):
    cellInfo = get_cell_info(cell)
    loader = dataloader.DataLoader(cell['subject'])
    
    try:
        bandIndex = cellInfo['bandIndex'][bandSession] #defaults to first band session if none speficied
    except IndexError:
        print "No bandwidth session"
        return None, None
    try:
        eventData = loader.get_session_events(cellInfo['ephysDirs'][bandIndex])
        spikeData = loader.get_session_spikes(cellInfo['ephysDirs'][bandIndex], cellInfo['tetrode'], cluster=cellInfo['cluster'])
        bandBData = loader.get_session_behavior(cellInfo['behavDirs'][bandIndex]) 
    except IOError:
        print "File does not exist"
        return None, None
    eventOnsetTimes = loader.get_event_onset_times(eventData)
    spikeTimeStamps = spikeData.timestamps
    timeRange = [0.0, 1.0]
    bandEachTrial = bandBData['currentBand']
    ampEachTrial = bandBData['currentAmp']
    charFreq = np.unique(bandBData['charFreq'])[0]
    numBands = np.unique(bandEachTrial)
    numAmps = np.unique(ampEachTrial)
    
    spikeArray, errorArray, baselineSpikeRate = band_select(spikeTimeStamps, eventOnsetTimes, ampEachTrial, bandEachTrial, timeRange)
    suppressionStats = compute_suppression_stats(spikeArray, numBands)
    
    if len(cellInfo['laserIndex'])>0:
        eventData = loader.get_session_events(cellInfo['ephysDirs'][cellInfo['laserIndex'][-1]])
        spikeData = loader.get_session_spikes(cellInfo['ephysDirs'][cellInfo['laserIndex'][-1]], cellInfo['tetrode'], cluster=cellInfo['cluster'])
        eventOnsetTimes = loader.get_event_onset_times(eventData)
        spikeTimestamps = spikeData.timestamps
        laserResponse = laser_response(spikeTimestamps, eventOnsetTimes)
    else:
        laserResponse = False
    return suppressionStats, laserResponse
예제 #21
0
def plot_bandwidth_report(cell, bandIndex):
    cellInfo = get_cell_info(cell)
    #pdb.set_trace()
    loader = dataloader.DataLoader(cell['subject'])
    
    if len(cellInfo['laserIndex'])>0:
        laser = True
        gs = gridspec.GridSpec(13, 6)
    else:
        laser = False
        gs = gridspec.GridSpec(9, 6)
    offset = 4*laser
    gs.update(left=0.15, right=0.85, top = 0.96, wspace=0.7, hspace=1.0)
     
     # -- plot bandwidth rasters --
    plt.clf()
    eventData = loader.get_session_events(cellInfo['ephysDirs'][bandIndex])
    spikeData = loader.get_session_spikes(cellInfo['ephysDirs'][bandIndex], cellInfo['tetrode'], cluster=cellInfo['cluster'])
    eventOnsetTimes = loader.get_event_onset_times(eventData)
    spikeTimestamps = spikeData.timestamps
    timeRange = [-0.2, 1.5]
    bandBData = loader.get_session_behavior(cellInfo['behavDirs'][bandIndex])  
    bandEachTrial = bandBData['currentBand']
    ampEachTrial = bandBData['currentAmp']
    charfreq = str(np.unique(bandBData['charFreq'])[0]/1000)
    modrate = str(np.unique(bandBData['modRate'])[0])
    numBands = np.unique(bandEachTrial)
    numAmps = np.unique(ampEachTrial)
            
    firstSortLabels = ['{}'.format(band) for band in np.unique(bandEachTrial)]
    secondSortLabels = ['Amplitude: {}'.format(amp) for amp in np.unique(ampEachTrial)]      
    spikeTimesFromEventOnset, indexLimitsEachTrial, trialsEachCond, firstSortLabels = bandwidth_raster_inputs(eventOnsetTimes, spikeTimestamps, bandEachTrial, ampEachTrial)
    colours = [np.tile(['#4e9a06','#8ae234'],len(numBands)/2+1), np.tile(['#5c3566','#ad7fa8'],len(numBands)/2+1)]
    for ind, secondArrayVal in enumerate(numAmps):
        plt.subplot(gs[5+2*ind+offset:7+2*ind+offset, 0:3])
        trialsThisSecondVal = trialsEachCond[:, :, ind]
        pRaster, hcond, zline = extraplots.raster_plot(spikeTimesFromEventOnset,
                                                        indexLimitsEachTrial,
                                                        timeRange,
                                                        trialsEachCond=trialsThisSecondVal,
                                                        labels=firstSortLabels,
                                                        colorEachCond = colours[ind])
        plt.setp(pRaster, ms=4)        
        plt.title(secondSortLabels[ind])
        plt.ylabel('bandwidth (octaves)')
        if ind == len(np.unique(ampEachTrial)) - 1:
            plt.xlabel("Time from sound onset (sec)")
    
           
    # -- plot Yashar plots for bandwidth data --
    plt.subplot(gs[5+offset:, 3:])
    spikeArray, errorArray, baseSpikeRate = band_select(spikeTimestamps, eventOnsetTimes, ampEachTrial, bandEachTrial, timeRange = [0.0, 1.0])
    band_select_plot(spikeArray, errorArray, baseSpikeRate, numBands, legend=True)
            
    # -- plot frequency tuning heat map -- 
    tuningBData = loader.get_session_behavior(cellInfo['behavDirs'][cellInfo['tuningIndex'][-1]])
    freqEachTrial = tuningBData['currentFreq']
    intEachTrial =  tuningBData['currentIntensity']
            
    eventData = loader.get_session_events(cellInfo['ephysDirs'][cellInfo['tuningIndex'][-1]])
    spikeData = loader.get_session_spikes(cellInfo['ephysDirs'][cellInfo['tuningIndex'][-1]], cellInfo['tetrode'], cluster=cellInfo['cluster'])
    eventOnsetTimes = loader.get_event_onset_times(eventData)
    spikeTimestamps = spikeData.timestamps
    
    plt.subplot(gs[2+offset:4+offset, 0:3])       
    dataplotter.two_axis_heatmap(spikeTimestamps=spikeTimestamps,
                                    eventOnsetTimes=eventOnsetTimes,
                                    firstSortArray=intEachTrial,
                                    secondSortArray=freqEachTrial,
                                    firstSortLabels=["%.0f" % inten for inten in np.unique(intEachTrial)],
                                    secondSortLabels=["%.1f" % freq for freq in np.unique(freqEachTrial)/1000.0],
                                    xlabel='Frequency (kHz)',
                                    ylabel='Intensity (dB SPL)',
                                    plotTitle='Frequency Tuning Curve',
                                    flipFirstAxis=False,
                                    flipSecondAxis=False,
                                    timeRange=[0, 0.1])
    plt.ylabel('Intensity (dB SPL)')
    plt.xlabel('Frequency (kHz)')
    plt.title('Frequency Tuning Curve')
            
    # -- plot frequency tuning raster --
    plt.subplot(gs[0+offset:2+offset, 0:3])
    freqLabels = ["%.1f" % freq for freq in np.unique(freqEachTrial)/1000.0]
    dataplotter.plot_raster(spikeTimestamps, eventOnsetTimes, sortArray=freqEachTrial, timeRange=[-0.1, 0.5], labels=freqLabels)
    plt.xlabel('Time from sound onset (sec)')
    plt.ylabel('Frequency (kHz)')
    plt.title('Frequency Tuning Raster')
            
    # -- plot AM PSTH --
    amBData = loader.get_session_behavior(cellInfo['behavDirs'][cellInfo['amIndex'][-1]])
    rateEachTrial = amBData['currentFreq']
    
    eventData = loader.get_session_events(cellInfo['ephysDirs'][cellInfo['amIndex'][-1]])
    spikeData = loader.get_session_spikes(cellInfo['ephysDirs'][cellInfo['amIndex'][-1]], cellInfo['tetrode'], cluster=cellInfo['cluster'])
    eventOnsetTimes = loader.get_event_onset_times(eventData)
    spikeTimestamps = spikeData.timestamps
    timeRange = [-0.2, 1.5]
    
    spikeTimesFromEventOnset, trialIndexForEachSpike, indexLimitsEachTrial = spikesanalysis.eventlocked_spiketimes(
                                                                                                spikeTimestamps, eventOnsetTimes, timeRange)
    colourList = ['b', 'g', 'y', 'orange', 'r']
    numRates = np.unique(rateEachTrial)
    trialsEachCond = behavioranalysis.find_trials_each_type(rateEachTrial, numRates)
    plt.subplot(gs[2+offset:4+offset, 3:])
    dataplotter.plot_psth(spikeTimestamps, eventOnsetTimes, rateEachTrial, timeRange = [-0.2, 0.8], binsize = 25, colorEachCond = colourList)
    plt.xlabel('Time from sound onset (sec)')
    plt.ylabel('Firing rate (Hz)')
    plt.title('AM PSTH')
    
    # -- plot AM raster --
    plt.subplot(gs[0+offset:2+offset, 3:])
    rateLabels = ["%.0f" % rate for rate in np.unique(rateEachTrial)]
    dataplotter.plot_raster(spikeTimestamps, eventOnsetTimes, sortArray=rateEachTrial, timeRange=[-0.2, 0.8], labels=rateLabels, colorEachCond=colourList)
    plt.xlabel('Time from sound onset (sec)')
    plt.ylabel('Modulation Rate (Hz)')
    plt.title('AM Raster')
    
    # -- plot laser pulse and laser train data (if available) --
    if laser:
        # -- plot laser pulse raster -- 
        plt.subplot(gs[0:2, 0:3])
        eventData = loader.get_session_events(cellInfo['ephysDirs'][cellInfo['laserIndex'][-1]])
        spikeData = loader.get_session_spikes(cellInfo['ephysDirs'][cellInfo['laserIndex'][-1]], cellInfo['tetrode'], cluster=cellInfo['cluster'])
        eventOnsetTimes = loader.get_event_onset_times(eventData)
        spikeTimestamps = spikeData.timestamps
        timeRange = [-0.1, 0.4]
        dataplotter.plot_raster(spikeTimestamps, eventOnsetTimes, timeRange=timeRange)
        plt.xlabel('Time from sound onset (sec)')
        plt.title('Laser Pulse Raster')
        
        # -- plot laser pulse psth --
        plt.subplot(gs[2:4, 0:3])
        dataplotter.plot_psth(spikeTimestamps, eventOnsetTimes, timeRange = timeRange, binsize = 10)
        plt.xlabel('Time from sound onset (sec)')
        plt.ylabel('Firing Rate (Hz)')
        plt.title('Laser Pulse PSTH')
        
        # -- didn't record laser trains for some earlier sessions --
        if len(cellInfo['laserTrainIndex']) > 0:
            # -- plot laser train raster --
            plt.subplot(gs[0:2, 3:])
            eventData = loader.get_session_events(cellInfo['ephysDirs'][cellInfo['laserTrainIndex'][-1]])
            spikeData = loader.get_session_spikes(cellInfo['ephysDirs'][cellInfo['laserTrainIndex'][-1]], cellInfo['tetrode'], cluster=cellInfo['cluster'])
            eventOnsetTimes = loader.get_event_onset_times(eventData)
            spikeTimestamps = spikeData.timestamps
            timeRange = [-0.2, 1.0]
            dataplotter.plot_raster(spikeTimestamps, eventOnsetTimes, timeRange=timeRange)
            plt.xlabel('Time from sound onset (sec)')
            plt.title('Laser Train Raster')
            
            # -- plot laser train psth --
            plt.subplot(gs[2:4, 3:])
            dataplotter.plot_psth(spikeTimestamps, eventOnsetTimes, timeRange = timeRange, binsize = 10)
            plt.xlabel('Time from sound onset (sec)')
            plt.ylabel('Firing Rate (Hz)')
            plt.title('Laser Train PSTH')
        
    # -- show cluster analysis --
    tsThisCluster, wavesThisCluster = load_cluster_waveforms(cellInfo)
    
    # -- Plot ISI histogram --
    plt.subplot(gs[4+offset, 0:2])
    spikesorting.plot_isi_loghist(tsThisCluster)
    plt.ylabel('c%d'%cellInfo['cluster'],rotation=0,va='center',ha='center')
    plt.xlabel('')

    # -- Plot waveforms --
    plt.subplot(gs[4+offset, 2:4])
    spikesorting.plot_waveforms(wavesThisCluster)

    # -- Plot events in time --
    plt.subplot(gs[4+offset, 4:6])
    spikesorting.plot_events_in_time(tsThisCluster)

    plt.suptitle('{0}, {1}, {2}um, Tetrode {3}, Cluster {4}, {5}kHz, {6}Hz modulation'.format(cellInfo['subject'], 
                                                                                            cellInfo['date'], 
                                                                                            cellInfo['depth'], 
                                                                                            cellInfo['tetrode'], 
                                                                                            cellInfo['cluster'], 
                                                                                            charfreq, 
                                                                                            modrate))
    
    fig_path = '/home/jarauser/Pictures/cell reports'
    fig_name = '{0}_{1}_{2}um_TT{3}Cluster{4}.png'.format(cellInfo['subject'], cellInfo['date'], cellInfo['depth'], cellInfo['tetrode'], cellInfo['cluster'])
    full_fig_path = os.path.join(fig_path, fig_name)
    fig = plt.gcf()
    fig.set_size_inches(20, 25)
    fig.savefig(full_fig_path, format = 'png', bbox_inches='tight')
def plot_cell_phys(cell, rastertypes, tctype):

    loader = dataloader.DataLoader(cell['subject'])

    fig = plt.clf()

    #Plot raster sessions
    for indRaster, rastertype in enumerate(rastertypes):
        plt.subplot2grid((6, 6), (indRaster, 0), rowspan=1, colspan=3)

        try:
            sessiontypeIndex = cell['sessiontype'].index(rastertype)
        except ValueError:  #The cell does not have this session type
            continue

        sessionEphys = cell['ephys'][sessiontypeIndex]

        rasterSpikes = loader.get_session_spikes(sessionEphys,
                                                 int(cell['tetrode']),
                                                 cluster=int(cell['cluster']))
        spikeTimestamps = rasterSpikes.timestamps

        rasterEvents = loader.get_session_events(sessionEphys)
        eventOnsetTimes = loader.get_event_onset_times(rasterEvents)

        dataplotter.plot_raster(spikeTimestamps, eventOnsetTimes, ms=1)

        plt.ylabel('{}\n{}'.format(rastertype,
                                   sessionEphys.split('_')[1]),
                   fontsize=10)
        ax = plt.gca()
        extraplots.set_ticks_fontsize(ax, 6)

    #Plot tuning curve
    try:
        sessiontypeIndex = cell['sessiontype'].index(tctype)

        plt.subplot2grid((6, 6), (0, 3), rowspan=3, colspan=3)

        bdata = loader.get_session_behavior(cell['behavior'][sessiontypeIndex])
        eventData = loader.get_session_events(cell['ephys'][sessiontypeIndex])
        spikeData = loader.get_session_spikes(cell['ephys'][sessiontypeIndex],
                                              int(cell['tetrode']),
                                              cluster=int(cell['cluster']))

        spikeTimestamps = spikeData.timestamps

        eventOnsetTimes = loader.get_event_onset_times(eventData)

        freqEachTrial = bdata['currentFreq']
        intensityEachTrial = bdata['currentIntensity']

        possibleFreq = np.unique(freqEachTrial)
        possibleIntensity = np.unique(intensityEachTrial)

        xlabel = 'Frequency (kHz)'
        ylabel = 'Intensity (dB SPL)'

        freqLabels = ["%.1f" % freq for freq in possibleFreq / 1000.0]
        intenLabels = ["%.1f" % inten for inten in possibleIntensity]

        dataplotter.two_axis_heatmap(spikeTimestamps=spikeTimestamps,
                                     eventOnsetTimes=eventOnsetTimes,
                                     firstSortArray=intensityEachTrial,
                                     secondSortArray=freqEachTrial,
                                     firstSortLabels=intenLabels,
                                     secondSortLabels=freqLabels,
                                     xlabel=xlabel,
                                     ylabel=ylabel,
                                     plotTitle='',
                                     flipFirstAxis=True,
                                     flipSecondAxis=False,
                                     timeRange=[0, 0.1],
                                     cmap='magma')

        # plt.title("{0}\n{1}".format(mainTCsession, mainTCbehavFilename), fontsize = 10)

    except ValueError:  #The cell does not have this session type
        print 'no tc'

    plt.show()
def tuning_curve_response(cell):
    '''
    Calculate max Z-score during the response period for each freq-inten combo in a TC
    '''

    try:
        sessiontypeIndex = cell['sessiontype'].index('TuningCurve')
    except ValueError:  #The cell does not have this session type
        return None

    #Initialize a data loader for this animal
    loader = dataloader.DataLoader(cell['subject'])

    #Get the behavior data
    behavData = loader.get_session_behavior(cell['behavior'][sessiontypeIndex])
    intensityEachTrial = behavData['currentIntensity']
    freqEachTrial = behavData['currentFreq']

    possibleFreq = np.unique(freqEachTrial)
    possibleIntensity = np.unique(intensityEachTrial)

    #Return the cluster spike data for this ephys session
    ephysDir = cell['ephys'][sessiontypeIndex]
    clusterSpikeData = loader.get_session_spikes(ephysDir,
                                                 int(cell['tetrode']),
                                                 cluster=int(cell['cluster']))
    clusterSpikeTimes = clusterSpikeData.timestamps

    #Get the events for this session and calculate onset times
    eventData = loader.get_session_events(ephysDir)
    eventOnsetTimes = loader.get_event_onset_times(eventData,
                                                   minEventOnsetDiff=None)

    timeRange = [0, 0.1]

    baseRange = [-0.050, -0.025]  # Baseline range (in seconds)
    binTime = baseRange[1] - baseRange[0]  # Time-bin size
    responseTimeRange = timeRange  #Time range to calculate z value for (should be divisible by binTime
    responseTime = responseTimeRange[1] - responseTimeRange[0]
    numBins = responseTime / binTime
    binEdges = np.arange(responseTimeRange[0], responseTimeRange[1], binTime)

    zvalArray = np.zeros((len(possibleIntensity), len(possibleFreq)))

    for indfreq, freq in enumerate(possibleFreq):
        for indinten, inten in enumerate(possibleIntensity):
            selectinds = np.flatnonzero((freqEachTrial == freq)
                                        & (intensityEachTrial == inten))
            selectedOnsetTimes = eventOnsetTimes[selectinds]


            (spikeTimesFromEventOnset,trialIndexForEachSpike,indexLimitsEachTrial) = \
            spikesanalysis.eventlocked_spiketimes(clusterSpikeTimes,selectedOnsetTimes,timeRange)

            [zStat, pValue, maxZ] = spikesanalysis.response_score(
                spikeTimesFromEventOnset, indexLimitsEachTrial, baseRange,
                binEdges
            )  #computes z score for each bin. zStat is array of z scores. maxZ is maximum value of z in timeRange

            zvalArray[indinten, indfreq] = maxZ
            # zvalArray = np.flipud(zvalArray)

    return zvalArray
예제 #24
0
def plot_bandwidth_noise_amps_comparison(cell, bandIndex=None):
    cellInfo = get_cell_info(cell)
    loader = dataloader.DataLoader(cell['subject'])
    if bandIndex is None:
        try:
            bandIndex = cellInfo['bandIndex'][0]
        except IndexError:
            print 'no bandwidth session'
            pass
    plt.clf()
    gs = gridspec.GridSpec(1, 2)
    eventData = loader.get_session_events(cellInfo['ephysDirs'][bandIndex])
    spikeData = loader.get_session_spikes(cellInfo['ephysDirs'][bandIndex],
                                          cellInfo['tetrode'],
                                          cluster=cellInfo['cluster'])
    eventOnsetTimes = loader.get_event_onset_times(eventData)
    spikeTimestamps = spikeData.timestamps
    timeRange = [-0.2, 1.5]
    bandBData = loader.get_session_behavior(cellInfo['behavDirs'][bandIndex])
    bandEachTrial = bandBData['currentBand']
    secondSort = bandBData['currentAmp']
    secondSortLabels = ['{} dB'.format(amp) for amp in np.unique(secondSort)]
    plt.subplot(gs[0, 0])
    spikeArray, errorArray, baseSpikeRate = band_select(spikeTimestamps,
                                                        eventOnsetTimes,
                                                        secondSort,
                                                        bandEachTrial,
                                                        timeRange=[0.0, 1.0])
    spikeArray = spikeArray[:, -1].reshape((7, 1))
    errorArray = errorArray[:, -1].reshape((7, 1))
    band_select_plot(spikeArray,
                     errorArray,
                     np.unique(bandEachTrial),
                     linecolours=['0.25'],
                     errorcolours=['0.6'])
    plt.title('Bandwidth tuning')

    ampsBData = loader.get_session_behavior(
        cellInfo['behavDirs'][cellInfo['ampsIndex'][-1]])
    ampEachTrial = ampsBData['currentIntensity']

    eventData = loader.get_session_events(
        cellInfo['ephysDirs'][cellInfo['ampsIndex'][-1]])
    spikeData = loader.get_session_spikes(
        cellInfo['ephysDirs'][cellInfo['ampsIndex'][-1]],
        cellInfo['tetrode'],
        cluster=cellInfo['cluster'])
    eventOnsetTimes = loader.get_event_onset_times(eventData)
    spikeTimestamps = spikeData.timestamps
    timeRange = [-0.2, 1.0]

    spikeTimesFromEventOnset, trialIndexForEachSpike, indexLimitsEachTrial = spikesanalysis.eventlocked_spiketimes(
        spikeTimestamps, eventOnsetTimes, timeRange)
    numRates = np.unique(ampEachTrial)
    trialsEachCond = behavioranalysis.find_trials_each_type(
        ampEachTrial, numRates)
    plt.subplot(gs[0, 1])
    spikeArray, errorArray, baseSpikeRate = band_select(
        spikeTimestamps,
        eventOnsetTimes,
        ampsBData['currentFreq'],
        ampEachTrial,
        timeRange=[0.0, 0.5])
    band_select_plot(spikeArray,
                     errorArray,
                     np.unique(ampEachTrial),
                     linecolours=['0.25'],
                     errorcolours=['0.6'])
    plt.xlabel('white noise intensity (dB)')
    plt.ylabel('Average num spikes')
    plt.title('Intensity tuning')
    fig_path = '/home/jarauser/Pictures/cell reports'
    fig_name = '{0}_{1}_{2}um_TT{3}Cluster{4}_noiseAmps.png'.format(
        cellInfo['subject'], cellInfo['date'], cellInfo['depth'],
        cellInfo['tetrode'], cellInfo['cluster'])
    full_fig_path = os.path.join(fig_path, fig_name)
    fig = plt.gcf()
    fig.set_size_inches(9, 4)
    fig.savefig(full_fig_path, format='png', bbox_inches='tight')
예제 #25
0
from jaratest.nick.utils import transferutils as tf
from jaratest.nick.database import dataplotter
reload(dataplotter)
from jaratest.nick.utils import clusterutils
reload(clusterutils)
reload(tf)
from matplotlib import pyplot as plt
import numpy as np
import os

subject = inforec.subject
sessions = inforec.experiments[0].sites[0].session_ephys_dirs()
sessionTypes = inforec.experiments[0].sites[0].session_types()
sessionBehav = inforec.experiments[0].sites[0].session_behav_filenames()

loader = dataloader.DataLoader(subject)

for session in sessions:
    tf.rsync_session_data(subject, session)

for bfile in sessionBehav:
    tf.rsync_behavior(subject, bfile)

for tetrode in range(1, 9):
    # tetrode=1 #This was the best tetrode
    #Cluster the sessions together
    idString = '2016-08-24_light_sound'
    oneTT = clusterutils.cluster_many_sessions(subject,
                                               sessions,
                                               tetrode,
                                               idString,
def plot_cell_tc(cell, tctype):
    loader = dataloader.DataLoader(cell['subject'])
    # try:
    sessiontypeIndex = cell['sessiontype'].index(tctype)

    plt.cla()

    bdata = loader.get_session_behavior(cell['behavior'][sessiontypeIndex])
    eventData = loader.get_session_events(cell['ephys'][sessiontypeIndex])
    spikeData = loader.get_session_spikes(cell['ephys'][sessiontypeIndex],
                                          int(cell['tetrode']),
                                          cluster=int(cell['cluster']))

    spikeTimestamps = spikeData.timestamps

    eventOnsetTimes = loader.get_event_onset_times(eventData)

    freqEachTrial = bdata['currentFreq']
    intensityEachTrial = bdata['currentIntensity']

    possibleFreq = np.unique(freqEachTrial)
    possibleIntensity = np.unique(intensityEachTrial)

    xlabel = 'Frequency (kHz)'
    ylabel = 'Intensity (dB SPL)'

    freqLabels = ["%.1f" % freq for freq in possibleFreq / 1000.0]
    intenLabels = ["%d" % inten for inten in possibleIntensity]

    ax, cax, cbar, spikeArray = dataplotter.two_axis_heatmap(
        spikeTimestamps=spikeTimestamps,
        eventOnsetTimes=eventOnsetTimes,
        firstSortArray=intensityEachTrial,
        secondSortArray=freqEachTrial,
        firstSortLabels=intenLabels,
        secondSortLabels=freqLabels,
        xlabel=xlabel,
        ylabel=ylabel,
        plotTitle='',
        flipFirstAxis=False,
        flipSecondAxis=False,
        timeRange=[0, 0.1],
        cmap='YlOrRd')

    fontsize = 20

    ax.set_xticks(np.linspace(0, 15, 3))
    ax.set_xticklabels(
        np.round(np.logspace(np.log10(2), np.log10(40), 3), decimals=1))
    ax.set_xlabel('Frequency (kHz)', fontsize=fontsize)
    ax.set_ylabel('Intensity (dB SPL)', fontsize=fontsize)
    cbar.ax.yaxis.labelpad = -10

    maxFr = np.max(spikeArray.ravel())
    print maxFr
    cbar.set_clim(0, maxFr)
    cbar.set_ticks([0, maxFr])
    cbar.set_ticklabels([0, np.int(maxFr * 10)])
    cbar.set_label('Firing rate (Hz)', fontsize=fontsize)
    plt.show()

    extraplots.set_ticks_fontsize(ax, fontsize)
    extraplots.set_ticks_fontsize(cbar.ax, fontsize)
예제 #27
0
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import scipy

db = pandas.read_hdf('/home/nick/data/database/pinp017/pinp017_database.h5',
                     'database')

soundResponsive = db.query(
    'isiViolations<0.02 and shapeQuality>2 and noisePval<0.05')

cell = soundResponsive.iloc[0]

sessiontypeIndex = cell['sessiontype'].index('tc')

#Initialize a data loader for this animal
loader = dataloader.DataLoader(cell['subject'])

#Get the behavior data
behavData = loader.get_session_behavior(cell['behavior'][sessiontypeIndex])
intensityEachTrial = behavData['currentIntensity']
freqEachTrial = behavData['currentFreq']

possibleFreq = np.unique(freqEachTrial)
possibleIntensity = np.unique(intensityEachTrial)

#Return the cluster spike data for this ephys session
ephysDir = cell['ephys'][sessiontypeIndex]
clusterSpikeData = loader.get_session_spikes(ephysDir,
                                             int(cell['tetrode']),
                                             cluster=int(cell['cluster']))
clusterSpikeTimes = clusterSpikeData.timestamps
예제 #28
0
            timeDiff[ind].extend(diffThisCond)
    return timeDiff, possibleSort

if __name__ == '__main__':
    import pdb
    SAVE = 0
    CASE = 2
    paradigm = '2afc'
    if CASE < 3:
        #animalNames = ['band011']#, 'band012']
       #animalNames = ['band011', 'band012', 'band017','band020']
        animalNames = ['band020']
        session = ['20170414a','20170415a','20170416a']
        for ind,animal in enumerate(animalNames):
            #plt.subplot(2,2,ind+1)
            loader = dataloader.DataLoader(animal)
            behavFile = loadbehavior.path_to_behavior_data(animal,paradigm,session[0])
            behavData = loader.get_session_behavior(behavFile)
            if ind<2:
                xlabel = False
            else:
                xlabel = True
            if ind%2==0:
                ylabel = True
            else:
                ylabel = False
            if CASE==0:
                plot_dynamics(behavData)
            elif CASE==1:
                band_discrim_byside(behavData)
            elif CASE==2: