예제 #1
0
def inactivation_indices(db, filename=''):
    bestCells = db.query("isiViolations<0.02")  # or modifiedISI<0.02")
    bestCells = bestCells.loc[bestCells['spikeShapeQuality'] > 2]
    bestCells = bestCells.query(
        'soundResponsePVal<0.05 or onsetSoundResponsePVal<0.05 or sustainedSoundResponsePVal<0.05'
    )
    bestCells = bestCells.loc[bestCells['tuningFitR2'] > 0.05]
    bestCells = bestCells.loc[bestCells['octavesFromPrefFreq'] < 0.5]

    for dbIndex, dbRow in bestCells.iterrows():

        cell = ephyscore.Cell(dbRow)

        bandEphysData, bandBehavData = cell.load_by_index(
            int(dbRow['bestBandSession']))
        bandEventOnsetTimes = funcs.get_sound_onset_times(
            bandEphysData, 'bandwidth')
        bandSpikeTimestamps = bandEphysData['spikeTimes']

        bandEachTrial = bandBehavData['currentBand']
        secondSort = bandBehavData['laserTrial']

        propOnset, propSustained = funcs.onset_sustained_spike_proportion(
            bandSpikeTimestamps, bandEventOnsetTimes)

        db.at[dbIndex, 'proportionSpikesOnset'] = propOnset
        db.at[dbIndex, 'proportionSpikesSustained'] = propSustained

        #by default: not subtracting baseline, but are replacing pure tone response with baseline for 0 bw condition
        onsetSupInds, onsetSupIndpVals, onsetFacInds, onsetFacIndpVals, onsetPeakInds, onsetSpikeArray = funcs.bandwidth_suppression_from_peak(
            bandSpikeTimestamps,
            bandEventOnsetTimes,
            bandEachTrial,
            secondSort,
            timeRange=[0.0, 0.05],
            baseRange=[-0.05, 0.0])
        db.at[dbIndex, 'onsetSuppressionIndexLaser'] = onsetSupInds[-1]
        db.at[dbIndex, 'onsetSuppressionpValLaser'] = onsetSupIndpVals[-1]
        db.at[dbIndex, 'onsetFacilitationIndexLaser'] = onsetFacInds[-1]
        db.at[dbIndex, 'onsetFacilitationpValLaser'] = onsetFacIndpVals[-1]
        db.at[dbIndex,
              'onsetPrefBandwidthLaser'] = bandEachTrial[onsetPeakInds[-1]]

        db.at[dbIndex, 'onsetSuppressionIndexNoLaser'] = onsetSupInds[0]
        db.at[dbIndex, 'onsetSuppressionpValNoLaser'] = onsetSupIndpVals[0]
        db.at[dbIndex, 'onsetFacilitationIndexNoLaser'] = onsetFacInds[0]
        db.at[dbIndex, 'onsetFacilitationpValNoLaser'] = onsetFacIndpVals[0]
        db.at[dbIndex,
              'onsetPrefBandwidthNoLaser'] = bandEachTrial[onsetPeakInds[0]]

        #base range is right before sound onset so we get estimate for laser baseline
        sustainedSupInds, sustainedSupIndpVals, sustainedFacInds, sustainedFacIndpVals, sustainedPeakInds, sustainedSpikeArray = funcs.bandwidth_suppression_from_peak(
            bandSpikeTimestamps,
            bandEventOnsetTimes,
            bandEachTrial,
            secondSort,
            timeRange=[0.2, 1.0],
            baseRange=[-0.05, 0.0])
        db.at[dbIndex, 'sustainedSuppressionIndexLaser'] = sustainedSupInds[-1]
        db.at[dbIndex,
              'sustainedSuppressionpValLaser'] = sustainedSupIndpVals[-1]
        db.at[dbIndex,
              'sustainedFacilitationIndexLaser'] = sustainedFacInds[-1]
        db.at[dbIndex,
              'sustainedFacilitationpValLaser'] = sustainedFacIndpVals[-1]
        db.at[dbIndex, 'sustainedPrefBandwidthLaser'] = bandEachTrial[
            sustainedPeakInds[-1]]

        db.at[dbIndex,
              'sustainedSuppressionIndexNoLaser'] = sustainedSupInds[0]
        db.at[dbIndex,
              'sustainedSuppressionpValNoLaser'] = sustainedSupIndpVals[0]
        db.at[dbIndex,
              'sustainedFacilitationIndexNoLaser'] = sustainedFacInds[0]
        db.at[dbIndex,
              'sustainedFacilitationpValNoLaser'] = sustainedFacIndpVals[0]
        db.at[dbIndex, 'sustainedPrefBandwidthNoLaser'] = bandEachTrial[
            sustainedPeakInds[0]]

        #no laser fit
        sustainedResponseNoLaser = sustainedSpikeArray[:, 0]

        bandsForFit = np.unique(bandEachTrial)
        bandsForFit[-1] = 6
        mFixed = 1

        fitParams, R2 = fitfuncs.diff_of_gauss_fit(bandsForFit,
                                                   sustainedResponseNoLaser,
                                                   mFixed=mFixed)

        #fit params
        db.at[dbIndex, 'R0noLaser'] = fitParams[0]
        db.at[dbIndex, 'RDnoLaser'] = fitParams[3]
        db.at[dbIndex, 'RSnoLaser'] = fitParams[4]
        db.at[dbIndex, 'mnoLaser'] = mFixed
        db.at[dbIndex, 'sigmaDnoLaser'] = fitParams[1]
        db.at[dbIndex, 'sigmaSnoLaser'] = fitParams[2]
        db.at[dbIndex, 'bandwidthTuningR2noLaser'] = R2

        testBands = np.linspace(bandsForFit[0], bandsForFit[-1], 500)
        allFitParams = [mFixed]
        allFitParams.extend(fitParams)
        suppInd, prefBW = fitfuncs.extract_stats_from_fit(
            allFitParams, testBands)

        db.at[dbIndex, 'fitSustainedSuppressionIndexNoLaser'] = suppInd
        db.at[dbIndex, 'fitSustainedPrefBandwidthNoLaser'] = prefBW

        #laser fit
        sustainedResponseLaser = sustainedSpikeArray[:, 1]

        fitParamsLaser, R2Laser = fitfuncs.diff_of_gauss_fit(
            bandsForFit, sustainedResponseLaser, mFixed=mFixed)

        #fit params
        db.at[dbIndex, 'R0laser'] = fitParamsLaser[0]
        db.at[dbIndex, 'RDlaser'] = fitParamsLaser[3]
        db.at[dbIndex, 'RSlaser'] = fitParamsLaser[4]
        db.at[dbIndex, 'mlaser'] = mFixed
        db.at[dbIndex, 'sigmaDlaser'] = fitParamsLaser[1]
        db.at[dbIndex, 'sigmaSlaser'] = fitParamsLaser[2]
        db.at[dbIndex, 'bandwidthTuningR2laser'] = R2Laser

        allFitParamsLaser = [mFixed]
        allFitParamsLaser.extend(fitParamsLaser)
        suppIndLaser, prefBWLaser = fitfuncs.extract_stats_from_fit(
            allFitParamsLaser, testBands)

        db.at[dbIndex, 'fitSustainedSuppressionIndexLaser'] = suppIndLaser
        db.at[dbIndex, 'fitSustainedPrefBandwidthLaser'] = prefBWLaser

        meanLaserDiff = np.mean(sustainedResponseLaser -
                                sustainedResponseNoLaser)
        db.at[dbIndex, 'laserChangeResponse'] = meanLaserDiff

        laserDiff = sustainedResponseLaser - sustainedResponseNoLaser
        peakInd = np.argmax(sustainedResponseNoLaser)

        db.at[dbIndex, 'peakChangeFR'] = laserDiff[peakInd]
        db.at[dbIndex, 'WNChangeFR'] = laserDiff[-1]

        testRespsNoLaser = fitfuncs.diff_gauss_form(testBands, *allFitParams)
        testRespsLaser = fitfuncs.diff_gauss_form(testBands,
                                                  *allFitParamsLaser)

        laserDiffModel = testRespsLaser - testRespsNoLaser
        peakIndModel = np.argmax(testRespsNoLaser)

        db.at[dbIndex, 'fitPeakChangeFR'] = laserDiffModel[peakIndModel]
        db.at[dbIndex, 'fitWNChangeFR'] = laserDiffModel[-1]

        #also calculating fits and suppression with pure tone being 0 bw condition
        toneSustainedSupInds, toneSustainedSupIndpVals, toneSustainedFacInds, toneSustainedFacIndpVals, toneSustainedPeakInds, toneSustainedSpikeArray = funcs.bandwidth_suppression_from_peak(
            bandSpikeTimestamps,
            bandEventOnsetTimes,
            bandEachTrial,
            secondSort,
            timeRange=[0.2, 1.0],
            baseRange=[-0.05, 0.0],
            zeroBWBaseline=False)
        db.at[
            dbIndex,
            'sustainedSuppressionIndexNoLaserPureTone'] = toneSustainedSupInds[
                0]
        db.at[
            dbIndex,
            'sustainedSuppressionpValNoLaserPureTone'] = toneSustainedSupIndpVals[
                0]
        db.at[
            dbIndex,
            'sustainedFacilitationIndexNoLaserPureTone'] = toneSustainedFacInds[
                0]
        db.at[
            dbIndex,
            'sustainedFacilitationpValNoLaserPureTone'] = toneSustainedFacIndpVals[
                0]
        db.at[dbIndex,
              'sustainedPrefBandwidthNoLaserPureTone'] = bandEachTrial[
                  toneSustainedPeakInds[0]]

        db.at[dbIndex,
              'sustainedSuppressionIndexLaserPureTone'] = toneSustainedSupInds[
                  -1]
        db.at[
            dbIndex,
            'sustainedSuppressionpValLaserPureTone'] = toneSustainedSupIndpVals[
                -1]
        db.at[
            dbIndex,
            'sustainedFacilitationIndexLaserPureTone'] = toneSustainedFacInds[
                -1]
        db.at[
            dbIndex,
            'sustainedFacilitationpValLaserPureTone'] = toneSustainedFacIndpVals[
                -1]
        db.at[dbIndex, 'sustainedPrefBandwidthLaserPureTone'] = bandEachTrial[
            toneSustainedPeakInds[-1]]

        toneSustainedResponseNoLaser = toneSustainedSpikeArray[:, 0]

        toneFitParamsNoLaser, toneR2 = fitfuncs.diff_of_gauss_fit(
            bandsForFit, toneSustainedResponseNoLaser, mFixed=mFixed)

        #fit params
        db.at[dbIndex, 'R0PureToneNoLaser'] = toneFitParamsNoLaser[0]
        db.at[dbIndex, 'RDPureToneNoLaser'] = toneFitParamsNoLaser[3]
        db.at[dbIndex, 'RSPureToneNoLaser'] = toneFitParamsNoLaser[4]
        db.at[dbIndex, 'mPureToneNoLaser'] = mFixed
        db.at[dbIndex, 'sigmaDPureToneNoLaser'] = toneFitParamsNoLaser[1]
        db.at[dbIndex, 'sigmaSPureToneNoLaser'] = toneFitParamsNoLaser[2]
        db.at[dbIndex, 'bandwidthTuningR2PureToneNoLaser'] = toneR2

        allFitParamsToneNoLaser = [mFixed]
        allFitParamsToneNoLaser.extend(toneFitParamsNoLaser)
        suppIndTone, prefBWTone = fitfuncs.extract_stats_from_fit(
            allFitParamsToneNoLaser, testBands)

        db.at[dbIndex,
              'fitSustainedSuppressionIndexPureToneNoLaser'] = suppIndTone
        db.at[dbIndex, 'fitSustainedPrefBandwidthPureToneNoLaser'] = prefBWTone

        toneSustainedResponseLaser = toneSustainedSpikeArray[:, 1]

        toneFitParamsLaser, toneR2Laser = fitfuncs.diff_of_gauss_fit(
            bandsForFit, toneSustainedResponseLaser, mFixed=mFixed)

        #fit params
        db.at[dbIndex, 'R0PureToneLaser'] = toneFitParamsLaser[0]
        db.at[dbIndex, 'RDPureToneLaser'] = toneFitParamsLaser[3]
        db.at[dbIndex, 'RSPureToneLaser'] = toneFitParamsLaser[4]
        db.at[dbIndex, 'mPureToneLaser'] = mFixed
        db.at[dbIndex, 'sigmaDPureToneLaser'] = toneFitParamsLaser[1]
        db.at[dbIndex, 'sigmaSPureToneLaser'] = toneFitParamsLaser[2]
        db.at[dbIndex, 'bandwidthTuningR2PureToneLaser'] = toneR2Laser

        allFitParamsToneLaser = [mFixed]
        allFitParamsToneLaser.extend(toneFitParamsLaser)
        suppIndToneLaser, prefBWToneLaser = fitfuncs.extract_stats_from_fit(
            allFitParamsToneLaser, testBands)

        db.at[dbIndex,
              'fitSustainedSuppressionIndexPureToneLaser'] = suppIndToneLaser
        db.at[dbIndex,
              'fitSustainedPrefBandwidthPureToneLaser'] = prefBWToneLaser

        testRespsNoLaser = fitfuncs.diff_gauss_form(testBands,
                                                    *allFitParamsToneNoLaser)
        testRespsLaser = fitfuncs.diff_gauss_form(testBands,
                                                  *allFitParamsToneLaser)

        laserDiffModel = testRespsLaser - testRespsNoLaser
        peakIndModel = np.argmax(testRespsNoLaser)

        db.at[dbIndex,
              'fitPeakChangeFRPureTone'] = laserDiffModel[peakIndModel]
        db.at[dbIndex, 'fitWNChangeFRPureTone'] = laserDiffModel[-1]

        #also calculating fits and suppression with nothing being fit for bw 0
        noZeroSustainedResponseNoLaser = sustainedSpikeArray[1:, 0]
        bandsForFitNoZero = bandsForFit[1:]

        noZeroFitParamsNoLaser, noZeroR2 = fitfuncs.diff_of_gauss_fit(
            bandsForFitNoZero, noZeroSustainedResponseNoLaser, mFixed=mFixed)

        #fit params
        db.at[dbIndex, 'R0noZeroNoLaser'] = noZeroFitParamsNoLaser[0]
        db.at[dbIndex, 'RDnoZeroNoLaser'] = noZeroFitParamsNoLaser[3]
        db.at[dbIndex, 'RSnoZeroNoLaser'] = noZeroFitParamsNoLaser[4]
        db.at[dbIndex, 'mnoZeroNoLaser'] = mFixed
        db.at[dbIndex, 'sigmaDnoZeroNoLaser'] = noZeroFitParamsNoLaser[1]
        db.at[dbIndex, 'sigmaSnoZeroNoLaser'] = noZeroFitParamsNoLaser[2]
        db.at[dbIndex, 'bandwidthTuningR2noZeroNoLaser'] = noZeroR2

        allFitParamsNoZero = [mFixed]
        allFitParamsNoZero.extend(noZeroFitParamsNoLaser)
        testBandsNoZero = np.linspace(bandsForFitNoZero[0],
                                      bandsForFitNoZero[-1], 500)
        suppIndNoZero, prefBWNoZero = fitfuncs.extract_stats_from_fit(
            allFitParamsNoZero, testBandsNoZero)

        db.at[dbIndex,
              'fitSustainedSuppressionIndexNoZeroNoLaser'] = suppIndNoZero
        db.at[dbIndex, 'fitSustainedPrefBandwidthNoZeroNoLaser'] = prefBWNoZero

        noZeroSustainedResponseLaser = sustainedSpikeArray[1:, 1]
        bandsForFitNoZero = bandsForFit[1:]

        noZeroFitParamsLaser, noZeroR2Laser = fitfuncs.diff_of_gauss_fit(
            bandsForFitNoZero, noZeroSustainedResponseLaser, mFixed=mFixed)

        #fit params
        db.at[dbIndex, 'R0noZeroLaser'] = noZeroFitParamsLaser[0]
        db.at[dbIndex, 'RDnoZeroLaser'] = noZeroFitParamsLaser[3]
        db.at[dbIndex, 'RSnoZeroLaser'] = noZeroFitParamsLaser[4]
        db.at[dbIndex, 'mnoZeroLaser'] = mFixed
        db.at[dbIndex, 'sigmaDnoZeroLaser'] = noZeroFitParamsLaser[1]
        db.at[dbIndex, 'sigmaSnoZeroLaser'] = noZeroFitParamsLaser[2]
        db.at[dbIndex, 'bandwidthTuningR2noZeroLaser'] = noZeroR2Laser

        allFitParamsNoZeroLaser = [mFixed]
        allFitParamsNoZeroLaser.extend(noZeroFitParamsLaser)
        suppIndNoZeroLaser, prefBWNoZeroLaser = fitfuncs.extract_stats_from_fit(
            allFitParamsNoZeroLaser, testBandsNoZero)

        db.at[dbIndex,
              'fitSustainedSuppressionIndexNoZeroLaser'] = suppIndNoZeroLaser
        db.at[dbIndex,
              'fitSustainedPrefBandwidthNoZeroLaser'] = prefBWNoZeroLaser

        testRespsNoLaser = fitfuncs.diff_gauss_form(testBandsNoZero,
                                                    *allFitParamsNoZero)
        testRespsLaser = fitfuncs.diff_gauss_form(testBandsNoZero,
                                                  *allFitParamsNoZeroLaser)

        laserDiffModel = testRespsLaser - testRespsNoLaser
        peakIndModel = np.argmax(testRespsNoLaser)

        db.at[dbIndex, 'fitPeakChangeFRNoZero'] = laserDiffModel[peakIndModel]
        db.at[dbIndex, 'fitWNChangeFRNoZero'] = laserDiffModel[-1]

    if len(filename) != 0:
        celldatabase.save_hdf(db, filename)
        print filename + " saved"

    return db
예제 #2
0
def inactivation_indices(db):
    '''
    This function takes as argument a pandas DataFrame and adds new columns.
    The filename should be the full path to where the database will be saved. If a filename is not specified, the database will not be saved.
    
    This function computes indices like Suppression Index with and without laser for all cells passing (generous) thresholds for good cells.
    The thresholds used here are more generous than the ones in studyparams, in case we want to relax our criteria in the future.
    '''

    bestCells = db.query("isiViolations<0.02")  # or modifiedISI<0.02")
    bestCells = bestCells.loc[bestCells['spikeShapeQuality'] > 2]
    bestCells = bestCells.query(
        'soundResponsePVal<0.05 or onsetSoundResponsePVal<0.05 or sustainedSoundResponsePVal<0.05'
    )
    bestCells = bestCells.loc[bestCells['tuningFitR2'] > 0.05]
    bestCells = bestCells.loc[bestCells['octavesFromPrefFreq'] < 0.5]

    for dbIndex, dbRow in bestCells.iterrows():

        cell = ephyscore.Cell(dbRow)
        print "Now processing", dbRow['subject'], dbRow['date'], dbRow[
            'depth'], dbRow['tetrode'], dbRow['cluster']

        bandEphysData, bandBehavData = cell.load_by_index(
            int(dbRow['bestBandSession']))
        bandEventOnsetTimes = funcs.get_sound_onset_times(
            bandEphysData, 'bandwidth')
        bandSpikeTimestamps = bandEphysData['spikeTimes']

        bandEachTrial = bandBehavData['currentBand']
        secondSort = bandBehavData['laserTrial']

        propOnset, propSustained = funcs.onset_sustained_spike_proportion(
            bandSpikeTimestamps, bandEventOnsetTimes)

        db.at[dbIndex, 'proportionSpikesOnset'] = propOnset
        db.at[dbIndex, 'proportionSpikesSustained'] = propSustained

        # by default: not subtracting baseline, but are replacing pure tone response with baseline for 0 bw condition
        onsetSupInds, onsetSupIndpVals, onsetFacInds, onsetFacIndpVals, onsetPeakInds, onsetSpikeArray = funcs.bandwidth_suppression_from_peak(
            bandSpikeTimestamps,
            bandEventOnsetTimes,
            bandEachTrial,
            secondSort,
            timeRange=[0.0, 0.05],
            baseRange=[-0.05, 0.0])
        #print onsetSupInds
        db.at[dbIndex, 'onsetSuppressionIndexLaser'] = onsetSupInds[-1]
        db.at[dbIndex, 'onsetSuppressionpValLaser'] = onsetSupIndpVals[-1]
        db.at[dbIndex, 'onsetFacilitationIndexLaser'] = onsetFacInds[-1]
        db.at[dbIndex, 'onsetFacilitationpValLaser'] = onsetFacIndpVals[-1]
        db.at[dbIndex, 'onsetPrefBandwidthLaser'] = bandEachTrial[int(
            onsetPeakInds[-1])]

        db.at[dbIndex, 'onsetSuppressionIndexNoLaser'] = onsetSupInds[0]
        db.at[dbIndex, 'onsetSuppressionpValNoLaser'] = onsetSupIndpVals[0]
        db.at[dbIndex, 'onsetFacilitationIndexNoLaser'] = onsetFacInds[0]
        db.at[dbIndex, 'onsetFacilitationpValNoLaser'] = onsetFacIndpVals[0]
        db.at[dbIndex, 'onsetPrefBandwidthNoLaser'] = bandEachTrial[int(
            onsetPeakInds[0])]

        # base range is right before sound onset so we get estimate for laser baseline
        sustainedSupInds, sustainedSupIndpVals, sustainedFacInds, sustainedFacIndpVals, sustainedPeakInds, sustainedSpikeArray = funcs.bandwidth_suppression_from_peak(
            bandSpikeTimestamps,
            bandEventOnsetTimes,
            bandEachTrial,
            secondSort,
            timeRange=[0.2, 1.0],
            baseRange=[-0.05, 0.0])
        db.at[dbIndex, 'sustainedSuppressionIndexLaser'] = sustainedSupInds[-1]
        db.at[dbIndex,
              'sustainedSuppressionpValLaser'] = sustainedSupIndpVals[-1]
        db.at[dbIndex,
              'sustainedFacilitationIndexLaser'] = sustainedFacInds[-1]
        db.at[dbIndex,
              'sustainedFacilitationpValLaser'] = sustainedFacIndpVals[-1]
        db.at[dbIndex, 'sustainedPrefBandwidthLaser'] = bandEachTrial[int(
            sustainedPeakInds[-1])]

        db.at[dbIndex,
              'sustainedSuppressionIndexNoLaser'] = sustainedSupInds[0]
        db.at[dbIndex,
              'sustainedSuppressionpValNoLaser'] = sustainedSupIndpVals[0]
        db.at[dbIndex,
              'sustainedFacilitationIndexNoLaser'] = sustainedFacInds[0]
        db.at[dbIndex,
              'sustainedFacilitationpValNoLaser'] = sustainedFacIndpVals[0]
        db.at[dbIndex, 'sustainedPrefBandwidthNoLaser'] = bandEachTrial[int(
            sustainedPeakInds[0])]

        # no laser fit
        sustainedResponseNoLaser = sustainedSpikeArray[:, 0]

        bandsForFit = np.unique(bandEachTrial)
        bandsForFit[-1] = 6
        mFixed = 1

        fitParams, R2 = fitfuncs.diff_of_gauss_fit(bandsForFit,
                                                   sustainedResponseNoLaser,
                                                   mFixed=mFixed)

        # fit params
        db.at[dbIndex, 'R0noLaser'] = fitParams[0]
        db.at[dbIndex, 'RDnoLaser'] = fitParams[3]
        db.at[dbIndex, 'RSnoLaser'] = fitParams[4]
        db.at[dbIndex, 'mnoLaser'] = mFixed
        db.at[dbIndex, 'sigmaDnoLaser'] = fitParams[1]
        db.at[dbIndex, 'sigmaSnoLaser'] = fitParams[2]
        db.at[dbIndex, 'bandwidthTuningR2noLaser'] = R2

        testBands = np.linspace(bandsForFit[0], bandsForFit[-1], 500)
        allFitParams = [mFixed]
        allFitParams.extend(fitParams)
        suppInd, prefBW = fitfuncs.extract_stats_from_fit(
            allFitParams, testBands)

        db.at[dbIndex, 'fitSustainedSuppressionIndexNoLaser'] = suppInd
        db.at[dbIndex, 'fitSustainedPrefBandwidthNoLaser'] = prefBW

        # laser fit
        sustainedResponseLaser = sustainedSpikeArray[:, 1]

        fitParamsLaser, R2Laser = fitfuncs.diff_of_gauss_fit(
            bandsForFit, sustainedResponseLaser, mFixed=mFixed)

        # fit params
        db.at[dbIndex, 'R0laser'] = fitParamsLaser[0]
        db.at[dbIndex, 'RDlaser'] = fitParamsLaser[3]
        db.at[dbIndex, 'RSlaser'] = fitParamsLaser[4]
        db.at[dbIndex, 'mlaser'] = mFixed
        db.at[dbIndex, 'sigmaDlaser'] = fitParamsLaser[1]
        db.at[dbIndex, 'sigmaSlaser'] = fitParamsLaser[2]
        db.at[dbIndex, 'bandwidthTuningR2laser'] = R2Laser

        allFitParamsLaser = [mFixed]
        allFitParamsLaser.extend(fitParamsLaser)
        suppIndLaser, prefBWLaser = fitfuncs.extract_stats_from_fit(
            allFitParamsLaser, testBands)

        db.at[dbIndex, 'fitSustainedSuppressionIndexLaser'] = suppIndLaser
        db.at[dbIndex, 'fitSustainedPrefBandwidthLaser'] = prefBWLaser

        meanLaserDiff = np.mean(sustainedResponseLaser -
                                sustainedResponseNoLaser)
        db.at[dbIndex, 'laserChangeResponse'] = meanLaserDiff

        laserDiff = sustainedResponseLaser - sustainedResponseNoLaser
        peakInd = np.argmax(sustainedResponseNoLaser)

        db.at[dbIndex, 'peakChangeFR'] = laserDiff[peakInd]
        db.at[dbIndex, 'WNChangeFR'] = laserDiff[-1]

        testRespsNoLaser = fitfuncs.diff_gauss_form(testBands, *allFitParams)
        testRespsLaser = fitfuncs.diff_gauss_form(testBands,
                                                  *allFitParamsLaser)

        laserDiffModel = testRespsLaser - testRespsNoLaser
        peakIndModel = np.argmax(testRespsNoLaser)

        db.at[dbIndex, 'fitPeakFRNoLaser'] = testRespsNoLaser[peakIndModel]
        db.at[dbIndex, 'fitPeakFRLaser'] = testRespsLaser[peakIndModel]
        db.at[dbIndex, 'fitPeakChangeFR'] = laserDiffModel[peakIndModel]

        db.at[dbIndex, 'fitWNFRNoLaser'] = testRespsNoLaser[-1]
        db.at[dbIndex, 'fitWNFRLaser'] = testRespsLaser[-1]
        db.at[dbIndex, 'fitWNChangeFR'] = laserDiffModel[-1]

        # also calculating fits and suppression with pure tone being 0 bw condition
        #         toneSustainedSupInds, toneSustainedSupIndpVals, toneSustainedFacInds, toneSustainedFacIndpVals, toneSustainedPeakInds, toneSustainedSpikeArray = funcs.bandwidth_suppression_from_peak(bandSpikeTimestamps, bandEventOnsetTimes, bandEachTrial, secondSort, timeRange=[0.2,1.0], baseRange=[-0.05,0.0], zeroBWBaseline=False)
        #         db.at[dbIndex, 'sustainedSuppressionIndexNoLaserPureTone'] = toneSustainedSupInds[0]
        #         db.at[dbIndex, 'sustainedSuppressionpValNoLaserPureTone'] = toneSustainedSupIndpVals[0]
        #         db.at[dbIndex, 'sustainedFacilitationIndexNoLaserPureTone'] = toneSustainedFacInds[0]
        #         db.at[dbIndex, 'sustainedFacilitationpValNoLaserPureTone'] = toneSustainedFacIndpVals[0]
        #         db.at[dbIndex, 'sustainedPrefBandwidthNoLaserPureTone'] = bandEachTrial[int(toneSustainedPeakInds[0])]
        #
        #         db.at[dbIndex, 'sustainedSuppressionIndexLaserPureTone'] = toneSustainedSupInds[-1]
        #         db.at[dbIndex, 'sustainedSuppressionpValLaserPureTone'] = toneSustainedSupIndpVals[-1]
        #         db.at[dbIndex, 'sustainedFacilitationIndexLaserPureTone'] = toneSustainedFacInds[-1]
        #         db.at[dbIndex, 'sustainedFacilitationpValLaserPureTone'] = toneSustainedFacIndpVals[-1]
        #         db.at[dbIndex, 'sustainedPrefBandwidthLaserPureTone'] = bandEachTrial[int(toneSustainedPeakInds[-1])]
        #
        #         toneSustainedResponseNoLaser = toneSustainedSpikeArray[:,0]
        #
        #         toneFitParamsNoLaser, toneR2 = fitfuncs.diff_of_gauss_fit(bandsForFit, toneSustainedResponseNoLaser, mFixed=mFixed)
        #
        #         # fit params
        #         db.at[dbIndex, 'R0PureToneNoLaser'] = toneFitParamsNoLaser[0]
        #         db.at[dbIndex, 'RDPureToneNoLaser'] = toneFitParamsNoLaser[3]
        #         db.at[dbIndex, 'RSPureToneNoLaser'] = toneFitParamsNoLaser[4]
        #         db.at[dbIndex, 'mPureToneNoLaser'] = mFixed
        #         db.at[dbIndex, 'sigmaDPureToneNoLaser'] = toneFitParamsNoLaser[1]
        #         db.at[dbIndex, 'sigmaSPureToneNoLaser'] = toneFitParamsNoLaser[2]
        #         db.at[dbIndex, 'bandwidthTuningR2PureToneNoLaser'] = toneR2
        #
        #         allFitParamsToneNoLaser = [mFixed]
        #         allFitParamsToneNoLaser.extend(toneFitParamsNoLaser)
        #         suppIndTone, prefBWTone = fitfuncs.extract_stats_from_fit(allFitParamsToneNoLaser, testBands)
        #
        #         db.at[dbIndex, 'fitSustainedSuppressionIndexPureToneNoLaser'] = suppIndTone
        #         db.at[dbIndex, 'fitSustainedPrefBandwidthPureToneNoLaser'] = prefBWTone
        #
        #
        #         toneSustainedResponseLaser = toneSustainedSpikeArray[:,1]
        #
        #         toneFitParamsLaser, toneR2Laser = fitfuncs.diff_of_gauss_fit(bandsForFit, toneSustainedResponseLaser, mFixed=mFixed)
        #
        #         # fit params
        #         db.at[dbIndex, 'R0PureToneLaser'] = toneFitParamsLaser[0]
        #         db.at[dbIndex, 'RDPureToneLaser'] = toneFitParamsLaser[3]
        #         db.at[dbIndex, 'RSPureToneLaser'] = toneFitParamsLaser[4]
        #         db.at[dbIndex, 'mPureToneLaser'] = mFixed
        #         db.at[dbIndex, 'sigmaDPureToneLaser'] = toneFitParamsLaser[1]
        #         db.at[dbIndex, 'sigmaSPureToneLaser'] = toneFitParamsLaser[2]
        #         db.at[dbIndex, 'bandwidthTuningR2PureToneLaser'] = toneR2Laser
        #
        #         allFitParamsToneLaser = [mFixed]
        #         allFitParamsToneLaser.extend(toneFitParamsLaser)
        #         suppIndToneLaser, prefBWToneLaser = fitfuncs.extract_stats_from_fit(allFitParamsToneLaser, testBands)
        #
        #         db.at[dbIndex, 'fitSustainedSuppressionIndexPureToneLaser'] = suppIndToneLaser
        #         db.at[dbIndex, 'fitSustainedPrefBandwidthPureToneLaser'] = prefBWToneLaser
        #
        #         testRespsNoLaser = fitfuncs.diff_gauss_form(testBands, *allFitParamsToneNoLaser)
        #         testRespsLaser = fitfuncs.diff_gauss_form(testBands, *allFitParamsToneLaser)
        #
        #         laserDiffModel = testRespsLaser-testRespsNoLaser
        #         peakIndModel = np.argmax(testRespsNoLaser)
        #
        #         db.at[dbIndex, 'fitPeakChangeFRPureTone'] = laserDiffModel[peakIndModel]
        #         db.at[dbIndex, 'fitWNChangeFRPureTone'] = laserDiffModel[-1]

        # also calculating fits and suppression with nothing being fit for bw 0
        noZeroSustainedResponseNoLaser = sustainedSpikeArray[1:, 0]
        bandsForFitNoZero = bandsForFit[1:]

        noZeroFitParamsNoLaser, noZeroR2 = fitfuncs.diff_of_gauss_fit(
            bandsForFitNoZero, noZeroSustainedResponseNoLaser, mFixed=mFixed)

        # fit params
        db.at[dbIndex, 'R0noZeroNoLaser'] = noZeroFitParamsNoLaser[0]
        db.at[dbIndex, 'RDnoZeroNoLaser'] = noZeroFitParamsNoLaser[3]
        db.at[dbIndex, 'RSnoZeroNoLaser'] = noZeroFitParamsNoLaser[4]
        db.at[dbIndex, 'mnoZeroNoLaser'] = mFixed
        db.at[dbIndex, 'sigmaDnoZeroNoLaser'] = noZeroFitParamsNoLaser[1]
        db.at[dbIndex, 'sigmaSnoZeroNoLaser'] = noZeroFitParamsNoLaser[2]
        db.at[dbIndex, 'bandwidthTuningR2noZeroNoLaser'] = noZeroR2

        allFitParamsNoZero = [mFixed]
        allFitParamsNoZero.extend(noZeroFitParamsNoLaser)
        testBandsNoZero = np.linspace(bandsForFitNoZero[0],
                                      bandsForFitNoZero[-1], 500)
        suppIndNoZero, prefBWNoZero = fitfuncs.extract_stats_from_fit(
            allFitParamsNoZero, testBandsNoZero)

        db.at[dbIndex,
              'fitSustainedSuppressionIndexNoZeroNoLaser'] = suppIndNoZero
        db.at[dbIndex, 'fitSustainedPrefBandwidthNoZeroNoLaser'] = prefBWNoZero

        noZeroSustainedResponseLaser = sustainedSpikeArray[1:, 1]
        bandsForFitNoZero = bandsForFit[1:]

        noZeroFitParamsLaser, noZeroR2Laser = fitfuncs.diff_of_gauss_fit(
            bandsForFitNoZero, noZeroSustainedResponseLaser, mFixed=mFixed)

        # fit params
        db.at[dbIndex, 'R0noZeroLaser'] = noZeroFitParamsLaser[0]
        db.at[dbIndex, 'RDnoZeroLaser'] = noZeroFitParamsLaser[3]
        db.at[dbIndex, 'RSnoZeroLaser'] = noZeroFitParamsLaser[4]
        db.at[dbIndex, 'mnoZeroLaser'] = mFixed
        db.at[dbIndex, 'sigmaDnoZeroLaser'] = noZeroFitParamsLaser[1]
        db.at[dbIndex, 'sigmaSnoZeroLaser'] = noZeroFitParamsLaser[2]
        db.at[dbIndex, 'bandwidthTuningR2noZeroLaser'] = noZeroR2Laser

        allFitParamsNoZeroLaser = [mFixed]
        allFitParamsNoZeroLaser.extend(noZeroFitParamsLaser)
        suppIndNoZeroLaser, prefBWNoZeroLaser = fitfuncs.extract_stats_from_fit(
            allFitParamsNoZeroLaser, testBandsNoZero)

        db.at[dbIndex,
              'fitSustainedSuppressionIndexNoZeroLaser'] = suppIndNoZeroLaser
        db.at[dbIndex,
              'fitSustainedPrefBandwidthNoZeroLaser'] = prefBWNoZeroLaser

        testRespsNoLaser = fitfuncs.diff_gauss_form(testBandsNoZero,
                                                    *allFitParamsNoZero)
        testRespsLaser = fitfuncs.diff_gauss_form(testBandsNoZero,
                                                  *allFitParamsNoZeroLaser)

        laserDiffModel = testRespsLaser - testRespsNoLaser
        peakIndModel = np.argmax(testRespsNoLaser)

        db.at[dbIndex, 'fitPeakChangeFRNoZero'] = laserDiffModel[peakIndModel]
        db.at[dbIndex, 'fitWNChangeFRNoZero'] = laserDiffModel[-1]

        # onset change
        noZeroOnsetResponseNoLaser = onsetSpikeArray[1:, 0]
        bandsForFitNoZero = bandsForFit[1:]

        noZeroOnsetFitParamsNoLaser, noZeroOnsetR2 = fitfuncs.diff_of_gauss_fit(
            bandsForFitNoZero, noZeroOnsetResponseNoLaser, mFixed=mFixed)

        # fit params
        db.at[dbIndex, 'onsetR0noZeroNoLaser'] = noZeroOnsetFitParamsNoLaser[0]
        db.at[dbIndex, 'onsetRDnoZeroNoLaser'] = noZeroOnsetFitParamsNoLaser[3]
        db.at[dbIndex, 'onsetRSnoZeroNoLaser'] = noZeroOnsetFitParamsNoLaser[4]
        db.at[dbIndex, 'onsetmnoZeroNoLaser'] = mFixed
        db.at[dbIndex,
              'onsetsigmaDnoZeroNoLaser'] = noZeroOnsetFitParamsNoLaser[1]
        db.at[dbIndex,
              'onsetsigmaSnoZeroNoLaser'] = noZeroOnsetFitParamsNoLaser[2]
        db.at[dbIndex, 'onsetbandwidthTuningR2noZeroNoLaser'] = noZeroOnsetR2

        allFitParamsOnsetNoZero = [mFixed]
        allFitParamsOnsetNoZero.extend(noZeroOnsetFitParamsNoLaser)
        testBandsNoZero = np.linspace(bandsForFitNoZero[0],
                                      bandsForFitNoZero[-1], 500)
        suppIndOnsetNoZero, prefBWOnsetNoZero = fitfuncs.extract_stats_from_fit(
            allFitParamsOnsetNoZero, testBandsNoZero)

        db.at[dbIndex,
              'fitOnsetSuppressionIndexNoZeroNoLaser'] = suppIndOnsetNoZero
        db.at[dbIndex,
              'fitOnsetPrefBandwidthNoZeroNoLaser'] = prefBWOnsetNoZero

        noZeroOnsetResponseLaser = onsetSpikeArray[1:, 1]
        bandsForFitNoZero = bandsForFit[1:]

        noZeroOnsetFitParamsLaser, noZeroOnsetR2Laser = fitfuncs.diff_of_gauss_fit(
            bandsForFitNoZero, noZeroOnsetResponseLaser, mFixed=mFixed)

        # fit params
        db.at[dbIndex, 'onsetR0noZeroLaser'] = noZeroOnsetFitParamsLaser[0]
        db.at[dbIndex, 'onsetRDnoZeroLaser'] = noZeroOnsetFitParamsLaser[3]
        db.at[dbIndex, 'onsetRSnoZeroLaser'] = noZeroOnsetFitParamsLaser[4]
        db.at[dbIndex, 'onsetmnoZeroLaser'] = mFixed
        db.at[dbIndex, 'onsetsigmaDnoZeroLaser'] = noZeroOnsetFitParamsLaser[1]
        db.at[dbIndex, 'onsetsigmaSnoZeroLaser'] = noZeroOnsetFitParamsLaser[2]
        db.at[dbIndex,
              'onsetbandwidthTuningR2noZeroLaser'] = noZeroOnsetR2Laser

        allFitParamsOnsetNoZeroLaser = [mFixed]
        allFitParamsOnsetNoZeroLaser.extend(noZeroOnsetFitParamsLaser)
        suppIndOnsetNoZeroLaser, prefBWOnsetNoZeroLaser = fitfuncs.extract_stats_from_fit(
            allFitParamsOnsetNoZeroLaser, testBandsNoZero)

        db.at[dbIndex,
              'fitOnsetSuppressionIndexNoZeroLaser'] = suppIndOnsetNoZeroLaser
        db.at[dbIndex,
              'fitOnsetPrefBandwidthNoZeroLaser'] = prefBWOnsetNoZeroLaser

        testRespsNoLaser = fitfuncs.diff_gauss_form(testBandsNoZero,
                                                    *allFitParamsOnsetNoZero)
        testRespsLaser = fitfuncs.diff_gauss_form(
            testBandsNoZero, *allFitParamsOnsetNoZeroLaser)

        laserDiffModel = testRespsLaser - testRespsNoLaser
        peakIndModel = np.argmax(testRespsNoLaser)

        db.at[dbIndex,
              'fitOnsetPeakChangeFRNoZero'] = laserDiffModel[peakIndModel]
        db.at[dbIndex, 'fitOnsetWNChangeFRNoZero'] = laserDiffModel[-1]

    return db
def photoID_indices(db, filename=''):
    '''
    This function takes as argument a pandas DataFrame and adds new columns.
    The filename should be the full path to where the database will be saved. If a filename is not specified, the database will not be saved.
    
    This function computes indices like Suppression Index for all cells passing (generous) thresholds for good cells.
    The thresholds used here are more generous than the ones in studyparams, in case we want to relax our criteria in the future.
    '''

    bestCells = db.query("isiViolations<0.02 or modifiedISI<0.02")
    bestCells = bestCells.loc[bestCells['spikeShapeQuality'] > 2]
    bestCells = bestCells.query(
        'soundResponsePVal<0.05 or onsetSoundResponsePVal<0.05 or sustainedSoundResponsePVal<0.05'
    )
    bestCells = bestCells.loc[bestCells['tuningFitR2'] > 0.05]
    bestCells = bestCells.loc[bestCells['octavesFromPrefFreq'] < 0.5]

    #prepare arrays of NaNs for when we save arrays of data
    bandwidthSpikeArraysHighAmp = np.empty((len(db), 7))
    bandwidthSpikeArraysHighAmp[:] = np.nan

    bandwidthSpikeArraysLowAmp = np.empty((len(db), 7))
    bandwidthSpikeArraysLowAmp[:] = np.nan

    bandwidthSpikeArraysOnset = np.empty((len(db), 6))
    bandwidthSpikeArraysOnset[:] = np.nan

    for dbIndex, dbRow in bestCells.iterrows():

        cell = ephyscore.Cell(dbRow, useModifiedClusters=True)

        bandEphysData, bandBehavData = cell.load_by_index(
            int(dbRow['bestBandSession']))
        bandEventOnsetTimes = funcs.get_sound_onset_times(
            bandEphysData, 'bandwidth')
        bandSpikeTimestamps = bandEphysData['spikeTimes']

        bandEachTrial = bandBehavData['currentBand']
        secondSort = bandBehavData['currentAmp']

        propOnset, propSustained = funcs.onset_sustained_spike_proportion(
            bandSpikeTimestamps, bandEventOnsetTimes)

        db.at[dbIndex, 'proportionSpikesOnset'] = propOnset
        db.at[dbIndex, 'proportionSpikesSustained'] = propSustained

        #by default: not subtracting baseline, but are replacing pure tone response with baseline for 0 bw condition
        onsetSupInds, onsetSupIndpVals, onsetFacInds, onsetFacIndpVals, onsetPeakInds, onsetSpikeArray = funcs.bandwidth_suppression_from_peak(
            bandSpikeTimestamps,
            bandEventOnsetTimes,
            bandEachTrial,
            secondSort,
            timeRange=[0.0, 0.05],
            baseRange=[-0.05, 0.0])
        db.at[dbIndex, 'onsetSuppressionIndex'] = onsetSupInds[-1]
        db.at[dbIndex, 'onsetSuppressionpVal'] = onsetSupIndpVals[-1]
        db.at[dbIndex, 'onsetFacilitationIndex'] = onsetFacInds[-1]
        db.at[dbIndex, 'onsetFacilitationpVal'] = onsetFacIndpVals[-1]
        db.at[dbIndex, 'onsetPrefBandwidth'] = bandEachTrial[onsetPeakInds[-1]]

        sustainedSupInds, sustainedSupIndpVals, sustainedFacInds, sustainedFacIndpVals, sustainedPeakInds, sustainedSpikeArray = funcs.bandwidth_suppression_from_peak(
            bandSpikeTimestamps,
            bandEventOnsetTimes,
            bandEachTrial,
            secondSort,
            timeRange=[0.2, 1.0],
            baseRange=[-1.0, -0.2])
        db.at[dbIndex, 'sustainedSuppressionIndex'] = sustainedSupInds[-1]
        db.at[dbIndex, 'sustainedSuppressionpVal'] = sustainedSupIndpVals[-1]
        db.at[dbIndex, 'sustainedFacilitationIndex'] = sustainedFacInds[-1]
        db.at[dbIndex, 'sustainedFacilitationpVal'] = sustainedFacIndpVals[-1]
        db.at[dbIndex,
              'sustainedPrefBandwidth'] = bandEachTrial[sustainedPeakInds[-1]]

        #only interested in high amp responses
        sustainedResponse = sustainedSpikeArray[:, -1]
        bandsForFit = np.unique(bandEachTrial)
        bandsForFit[-1] = 6
        mFixed = 1

        fitParams, R2 = fitfuncs.diff_of_gauss_fit(bandsForFit,
                                                   sustainedResponse,
                                                   mFixed=mFixed)

        #fit params
        db.at[dbIndex, 'R0'] = fitParams[0]
        db.at[dbIndex, 'RD'] = fitParams[3]
        db.at[dbIndex, 'RS'] = fitParams[4]
        db.at[dbIndex, 'm'] = mFixed
        db.at[dbIndex, 'sigmaD'] = fitParams[1]
        db.at[dbIndex, 'sigmaS'] = fitParams[2]
        db.at[dbIndex, 'bandwidthTuningR2'] = R2

        testBands = np.linspace(bandsForFit[0], bandsForFit[-1], 500)
        allFitParams = [mFixed]
        allFitParams.extend(fitParams)
        suppInd, prefBW = fitfuncs.extract_stats_from_fit(
            allFitParams, testBands)

        db.at[dbIndex, 'fitSustainedSuppressionIndex'] = suppInd
        db.at[dbIndex, 'fitSustainedPrefBandwidth'] = prefBW

        #also calculating fits and suppression with pure tone being 0 bw condition
        toneSustainedSupInds, toneSustainedSupIndpVals, toneSustainedFacInds, toneSustainedFacIndpVals, toneSustainedPeakInds, toneSustainedSpikeArray = funcs.bandwidth_suppression_from_peak(
            bandSpikeTimestamps,
            bandEventOnsetTimes,
            bandEachTrial,
            secondSort,
            timeRange=[0.2, 1.0],
            baseRange=[-1.0, -0.2],
            zeroBWBaseline=False)
        db.at[dbIndex,
              'sustainedSuppressionIndexPureTone'] = toneSustainedSupInds[-1]
        db.at[
            dbIndex,
            'sustainedSuppressionpValPureTone'] = toneSustainedSupIndpVals[-1]
        db.at[dbIndex,
              'sustainedFacilitationIndexPureTone'] = toneSustainedFacInds[-1]
        db.at[
            dbIndex,
            'sustainedFacilitationpValPureTone'] = toneSustainedFacIndpVals[-1]
        db.at[dbIndex, 'sustainedPrefBandwidthPureTone'] = bandEachTrial[
            toneSustainedPeakInds[-1]]

        #only interested in high amp responses
        toneSustainedResponse = toneSustainedSpikeArray[:, -1]

        toneFitParams, toneR2 = fitfuncs.diff_of_gauss_fit(
            bandsForFit, toneSustainedResponse, mFixed=mFixed)

        #fit params
        db.at[dbIndex, 'R0PureTone'] = toneFitParams[0]
        db.at[dbIndex, 'RDPureTone'] = toneFitParams[3]
        db.at[dbIndex, 'RSPureTone'] = toneFitParams[4]
        db.at[dbIndex, 'mPureTone'] = mFixed
        db.at[dbIndex, 'sigmaDPureTone'] = toneFitParams[1]
        db.at[dbIndex, 'sigmaSPureTone'] = toneFitParams[2]
        db.at[dbIndex, 'bandwidthTuningR2PureTone'] = toneR2

        allFitParamsTone = [mFixed]
        allFitParamsTone.extend(toneFitParams)
        suppIndTone, prefBWTone = fitfuncs.extract_stats_from_fit(
            allFitParamsTone, testBands)

        db.at[dbIndex, 'fitSustainedSuppressionIndexPureTone'] = suppIndTone
        db.at[dbIndex, 'fitSustainedPrefBandwidthPureTone'] = prefBWTone

        #also calculating fits and suppression with nothing being fit for bw 0, want to do both intensities here
        #doing this for onset responses as well
        noZeroSustainedResponseHighAmp = sustainedSpikeArray[1:, -1]
        noZeroOnsetResponseHighAmp = onsetSpikeArray[1:, -1]
        bandsForFitNoZero = bandsForFit[1:]

        noZeroFitParamsHigh, noZeroR2High = fitfuncs.diff_of_gauss_fit(
            bandsForFitNoZero, noZeroSustainedResponseHighAmp, mFixed=mFixed)

        #fit params
        db.at[dbIndex, 'R0noZeroHighAmp'] = noZeroFitParamsHigh[0]
        db.at[dbIndex, 'RDnoZeroHighAmp'] = noZeroFitParamsHigh[3]
        db.at[dbIndex, 'RSnoZeroHighAmp'] = noZeroFitParamsHigh[4]
        db.at[dbIndex, 'mnoZeroHighAmp'] = mFixed
        db.at[dbIndex, 'sigmaDnoZeroHighAmp'] = noZeroFitParamsHigh[1]
        db.at[dbIndex, 'sigmaSnoZeroHighAmp'] = noZeroFitParamsHigh[2]
        db.at[dbIndex, 'bandwidthTuningR2noZeroHighAmp'] = noZeroR2High

        allFitParamsNoZeroHigh = [mFixed]
        allFitParamsNoZeroHigh.extend(noZeroFitParamsHigh)
        testBandsNoZero = np.linspace(bandsForFitNoZero[0],
                                      bandsForFitNoZero[-1], 500)
        suppIndNoZero, prefBWNoZero = fitfuncs.extract_stats_from_fit(
            allFitParamsNoZeroHigh, testBandsNoZero)

        db.at[dbIndex,
              'fitSustainedSuppressionIndexNoZeroHighAmp'] = suppIndNoZero
        db.at[dbIndex, 'fitSustainedPrefBandwidthNoZeroHighAmp'] = prefBWNoZero

        noZeroFitParamsOnset, noZeroR2Onset = fitfuncs.diff_of_gauss_fit(
            bandsForFitNoZero, noZeroOnsetResponseHighAmp, mFixed=mFixed)

        db.at[dbIndex, 'R0noZeroOnset'] = noZeroFitParamsOnset[0]
        db.at[dbIndex, 'RDnoZeroOnset'] = noZeroFitParamsOnset[3]
        db.at[dbIndex, 'RSnoZeroOnset'] = noZeroFitParamsOnset[4]
        db.at[dbIndex, 'mnoZeroOnset'] = mFixed
        db.at[dbIndex, 'sigmaDnoZeroOnset'] = noZeroFitParamsOnset[1]
        db.at[dbIndex, 'sigmaSnoZeroOnset'] = noZeroFitParamsOnset[2]
        db.at[dbIndex, 'bandwidthTuningR2noZeroOnset'] = noZeroR2Onset

        allFitParamsNoZeroOnset = [mFixed]
        allFitParamsNoZeroOnset.extend(noZeroFitParamsOnset)
        suppIndNoZero, prefBWNoZero = fitfuncs.extract_stats_from_fit(
            allFitParamsNoZeroOnset, testBandsNoZero)

        db.at[dbIndex, 'fitOnsetSuppressionIndexNoZero'] = suppIndNoZero
        db.at[dbIndex, 'fitOnsetPrefBandwidthNoZero'] = prefBWNoZero

        if sustainedSpikeArray.shape[1] > 1:
            noZeroSustainedResponseLowAmp = sustainedSpikeArray[1:, 0]

            if all(noZeroSustainedResponseLowAmp):
                noZeroFitParamsLow, noZeroR2Low = fitfuncs.diff_of_gauss_fit(
                    bandsForFitNoZero,
                    noZeroSustainedResponseLowAmp,
                    mFixed=mFixed)

                #fit params
                db.at[dbIndex, 'R0noZeroLowAmp'] = noZeroFitParamsLow[0]
                db.at[dbIndex, 'RDnoZeroLowAmp'] = noZeroFitParamsLow[3]
                db.at[dbIndex, 'RSnoZeroLowAmp'] = noZeroFitParamsLow[4]
                db.at[dbIndex, 'mnoZeroLowAmp'] = mFixed
                db.at[dbIndex, 'sigmaDnoZeroLowAmp'] = noZeroFitParamsLow[1]
                db.at[dbIndex, 'sigmaSnoZeroLowAmp'] = noZeroFitParamsLow[2]
                db.at[dbIndex, 'bandwidthTuningR2noZeroLowAmp'] = noZeroR2Low

                allFitParamsNoZeroLow = [mFixed]
                allFitParamsNoZeroLow.extend(noZeroFitParamsLow)
                suppIndNoZero, prefBWNoZero = fitfuncs.extract_stats_from_fit(
                    allFitParamsNoZeroLow, testBandsNoZero)

                db.at[
                    dbIndex,
                    'fitSustainedSuppressionIndexNoZeroLowAmp'] = suppIndNoZero
                db.at[dbIndex,
                      'fitSustainedPrefBandwidthNoZeroLowAmp'] = prefBWNoZero

        #save the spike array and baseline rate for each cell in case needed for future calculations
        bandwidthSpikeArraysHighAmp[dbIndex, :] = toneSustainedSpikeArray[:,
                                                                          -1]
        bandwidthSpikeArraysLowAmp[dbIndex, :] = toneSustainedSpikeArray[:, 0]
        bandwidthSpikeArraysOnset[dbIndex, :] = noZeroOnsetResponseHighAmp
        db.at[dbIndex, 'bandwidthBaselineRate'] = sustainedResponse[0]

    db['bandwidthOnsetSpikeArrayHighAmp'] = list(bandwidthSpikeArraysOnset)
    db['bandwidthSustainedSpikeArrayHighAmp'] = list(
        bandwidthSpikeArraysHighAmp)
    db['bandwidthSustainedSpikeArrayLowAmp'] = list(bandwidthSpikeArraysLowAmp)

    if len(filename) != 0:
        celldatabase.save_hdf(db, filename)
        print filename + " saved"

    return db
예제 #4
0
def inactivation_database(db,
                          baseStats=False,
                          computeIndices=True,
                          filename='inactivation_cells.h5'):
    if type(db) == str:
        dbPath = os.path.join(settings.DATABASE_PATH, db)
        db = celldatabase.load_hdf(dbPath)

    if baseStats:
        soundResponseTestStatistic = np.empty(len(db))
        soundResponsePVal = np.empty(len(db))
        onsetSoundResponseTestStatistic = np.empty(len(db))
        onsetSoundResponsePVal = np.empty(len(db))
        sustainedSoundResponseTestStatistic = np.empty(len(db))
        sustainedSoundResponsePVal = np.empty(len(db))

        gaussFit = []
        tuningTimeRange = []
        Rsquared = np.empty(len(db))
        prefFreq = np.empty(len(db))
        octavesFromPrefFreq = np.empty(len(db))
        bestBandSession = np.empty(len(db))

        for indRow, (dbIndex, dbRow) in enumerate(db.iterrows()):
            cellObj = ephyscore.Cell(dbRow)
            print "Now processing", dbRow['subject'], dbRow['date'], dbRow[
                'depth'], dbRow['tetrode'], dbRow['cluster']

            # --- Determine sound responsiveness during bandwidth sessions and calculate baseline firing rates with and without laser---
            #done in a kind of stupid way because regular and control sessions are handled the same way
            if any(session in dbRow['sessionType']
                   for session in ['laserBandwidth', 'laserBandwidthControl']):
                if 'laserBandwidth' in dbRow['sessionType']:
                    bandEphysData, bandBehavData = cellObj.load(
                        'laserBandwidth')
                    behavSession = 'laserBandwidth'
                    db.at[dbIndex, 'controlSession'] = 0
                elif 'laserBandwidthControl' in dbRow['sessionType']:
                    bandEphysData, bandBehavData = cellObj.load(
                        'laserBandwidthControl')
                    behavSession = 'laserBandwidthControl'
                    db.at[dbIndex, 'controlSession'] = 1
                bandEventOnsetTimes = funcs.get_sound_onset_times(
                    bandEphysData, 'bandwidth')
                bandSpikeTimestamps = bandEphysData['spikeTimes']
                bandEachTrial = bandBehavData['currentBand']
                secondSort = bandBehavData['laserTrial']
                numBands = np.unique(bandEachTrial)
                numSec = np.unique(secondSort)

                trialsEachComb = behavioranalysis.find_trials_each_combination(
                    bandEachTrial, numBands, secondSort, numSec)
                trialsEachBaseCond = trialsEachComb[:, :,
                                                    0]  #using no laser trials to determine sound responsiveness
                testStatistic, pVal = funcs.sound_response_any_stimulus(
                    bandEventOnsetTimes, bandSpikeTimestamps,
                    trialsEachBaseCond, [0.0, 1.0], [-1.2, -0.2])
                onsetTestStatistic, onsetpVal = funcs.sound_response_any_stimulus(
                    bandEventOnsetTimes, bandSpikeTimestamps,
                    trialsEachBaseCond, [0.0, 0.05], [-0.25, 0.2])
                sustainedTestStatistic, sustainedpVal = funcs.sound_response_any_stimulus(
                    bandEventOnsetTimes, bandSpikeTimestamps,
                    trialsEachBaseCond, [0.2, 1.0], [-1.0, 0.2])
                pVal *= len(numBands)  #correction for multiple comparisons
                onsetpVal *= len(numBands)
                sustainedpVal *= len(numBands)
                #pdb.set_trace()

                #find baselines with and without laser
                baselineRange = [-0.05, 0.0]
                baselineRates, baselineSEMs = funcs.inactivated_cells_baselines(
                    bandSpikeTimestamps, bandEventOnsetTimes, secondSort,
                    baselineRange)
                db.at[dbIndex, 'baselineFRnoLaser'] = baselineRates[0]
                db.at[dbIndex, 'baselineFRLaser'] = baselineRates[1]
                db.at[dbIndex, 'baselineFRnoLaserSEM'] = baselineSEMs[0]
                db.at[dbIndex, 'baselineFRLaserSEM'] = baselineSEMs[1]
                db.at[dbIndex,
                      'baselineChangeFR'] = baselineRates[1] - baselineRates[0]
            else:
                print "No bandwidth session for this cell"
                testStatistic = np.nan
                pVal = np.nan
                onsetTestStatistic = np.nan
                onsetpVal = np.nan
                sustainedTestStatistic = np.nan
                sustainedpVal = np.nan
                #pdb.set_trace()

            soundResponseTestStatistic[indRow] = testStatistic
            soundResponsePVal[indRow] = pVal
            onsetSoundResponseTestStatistic[indRow] = onsetTestStatistic
            onsetSoundResponsePVal[indRow] = onsetpVal
            sustainedSoundResponseTestStatistic[
                indRow] = sustainedTestStatistic
            sustainedSoundResponsePVal[indRow] = sustainedpVal

            # --- Determine frequency tuning of cells ---
            try:
                tuningEphysData, tuningBehavData = cellObj.load('tuningCurve')
            except IndexError:
                print "No tuning session for this cell"
                freqFit = np.full(4, np.nan)
                thisRsquared = np.nan
                bestFreq = np.nan
                tuningWindow = np.full(2, np.nan)
                octavesFromBest = np.nan
                bandIndex = np.nan
            else:
                tuningEventOnsetTimes = funcs.get_sound_onset_times(
                    tuningEphysData, 'tuningCurve')
                tuningSpikeTimestamps = tuningEphysData['spikeTimes']
                freqEachTrial = tuningBehavData['currentFreq']
                intensityEachTrial = tuningBehavData['currentIntensity']
                numFreqs = np.unique(freqEachTrial)
                numIntensities = np.unique(intensityEachTrial)
                timeRange = [-0.2, 0.2]
                spikeTimesFromEventOnset, trialIndexForEachSpike, indexLimitsEachTrial = spikesanalysis.eventlocked_spiketimes(
                    tuningSpikeTimestamps, tuningEventOnsetTimes, timeRange)
                trialsEachType = behavioranalysis.find_trials_each_type(
                    intensityEachTrial, numIntensities)
                trialsHighInt = trialsEachType[:, -1]
                trialsEachComb = behavioranalysis.find_trials_each_combination(
                    freqEachTrial, numFreqs, intensityEachTrial,
                    numIntensities)
                trialsEachFreqHighInt = trialsEachComb[:, :, -1]
                tuningWindow = funcs.best_window_freq_tuning(
                    spikeTimesFromEventOnset, indexLimitsEachTrial,
                    trialsEachFreqHighInt)
                tuningWindow = np.array(tuningWindow)
                spikeCountMat = spikesanalysis.spiketimes_to_spikecounts(
                    spikeTimesFromEventOnset, indexLimitsEachTrial,
                    tuningWindow)
                tuningSpikeRates = (spikeCountMat[trialsHighInt].flatten()) / (
                    tuningWindow[1] - tuningWindow[0])
                freqsThisIntensity = freqEachTrial[trialsHighInt]
                freqFit, thisRsquared = funcs.gaussian_tuning_fit(
                    np.log2(freqsThisIntensity), tuningSpikeRates)
                if freqFit is not None:
                    bestFreq = 2**freqFit[0]
                    bandIndex, octavesFromBest = funcs.best_index(
                        cellObj, bestFreq, behavSession)
                else:
                    freqFit = np.full(4, np.nan)
                    bestFreq = np.nan
                    bandIndex = np.nan
                    octavesFromBest = np.nan
            gaussFit.append(freqFit)
            tuningTimeRange.append(tuningWindow)
            Rsquared[indRow] = thisRsquared
            prefFreq[indRow] = bestFreq
            octavesFromPrefFreq[indRow] = octavesFromBest
            bestBandSession[indRow] = bandIndex

        db['soundResponseUStat'] = soundResponseTestStatistic
        db['soundResponsePVal'] = soundResponsePVal
        db['onsetSoundResponseUStat'] = onsetSoundResponseTestStatistic
        db['onsetSoundResponsePVal'] = onsetSoundResponsePVal
        db['sustainedSoundResponseUStat'] = sustainedSoundResponseTestStatistic
        db['sustainedSoundResponsePVal'] = sustainedSoundResponsePVal

        db['gaussFit'] = gaussFit
        db['tuningTimeRange'] = tuningTimeRange
        db['tuningFitR2'] = Rsquared
        db['prefFreq'] = prefFreq
        db['octavesFromPrefFreq'] = octavesFromPrefFreq
        db['bestBandSession'] = bestBandSession

    if computeIndices:
        bestCells = db.query("isiViolations<0.02")  # or modifiedISI<0.02")
        bestCells = bestCells.loc[bestCells['spikeShapeQuality'] > 2]
        bestCells = bestCells.query(
            'soundResponsePVal<0.05 or onsetSoundResponsePVal<0.05 or sustainedSoundResponsePVal<0.05'
        )
        bestCells = bestCells.loc[bestCells['tuningFitR2'] > R2CUTOFF]
        bestCells = bestCells.loc[
            bestCells['octavesFromPrefFreq'] < OCTAVESCUTOFF]

        for dbIndex, dbRow in bestCells.iterrows():

            cell = ephyscore.Cell(dbRow)

            bandEphysData, bandBehavData = cell.load_by_index(
                int(dbRow['bestBandSession']))
            bandEventOnsetTimes = funcs.get_sound_onset_times(
                bandEphysData, 'bandwidth')
            bandSpikeTimestamps = bandEphysData['spikeTimes']

            bandEachTrial = bandBehavData['currentBand']
            secondSort = bandBehavData['laserTrial']

            propOnset, propSustained = funcs.onset_sustained_spike_proportion(
                bandSpikeTimestamps, bandEventOnsetTimes)

            db.at[dbIndex, 'proportionSpikesOnset'] = propOnset
            db.at[dbIndex, 'proportionSpikesSustained'] = propSustained

            #by default: not subtracting baseline, but are replacing pure tone response with baseline for 0 bw condition
            onsetSupInds, onsetSupIndpVals, onsetFacInds, onsetFacIndpVals, onsetPeakInds, onsetSpikeArray = funcs.bandwidth_suppression_from_peak(
                bandSpikeTimestamps,
                bandEventOnsetTimes,
                bandEachTrial,
                secondSort,
                timeRange=[0.0, 0.05],
                baseRange=[-0.05, 0.0])
            db.at[dbIndex, 'onsetSuppressionIndexLaser'] = onsetSupInds[-1]
            db.at[dbIndex, 'onsetSuppressionpValLaser'] = onsetSupIndpVals[-1]
            db.at[dbIndex, 'onsetFacilitationIndexLaser'] = onsetFacInds[-1]
            db.at[dbIndex, 'onsetFacilitationpValLaser'] = onsetFacIndpVals[-1]
            db.at[dbIndex,
                  'onsetPrefBandwidthLaser'] = bandEachTrial[onsetPeakInds[-1]]

            db.at[dbIndex, 'onsetSuppressionIndexNoLaser'] = onsetSupInds[0]
            db.at[dbIndex, 'onsetSuppressionpValNoLaser'] = onsetSupIndpVals[0]
            db.at[dbIndex, 'onsetFacilitationIndexNoLaser'] = onsetFacInds[0]
            db.at[dbIndex,
                  'onsetFacilitationpValNoLaser'] = onsetFacIndpVals[0]
            db.at[dbIndex, 'onsetPrefBandwidthNoLaser'] = bandEachTrial[
                onsetPeakInds[0]]

            #base range is right before sound onset so we get estimate for laser baseline
            sustainedSupInds, sustainedSupIndpVals, sustainedFacInds, sustainedFacIndpVals, sustainedPeakInds, sustainedSpikeArray = funcs.bandwidth_suppression_from_peak(
                bandSpikeTimestamps,
                bandEventOnsetTimes,
                bandEachTrial,
                secondSort,
                timeRange=[0.2, 1.0],
                baseRange=[-0.05, 0.0])
            db.at[dbIndex,
                  'sustainedSuppressionIndexLaser'] = sustainedSupInds[-1]
            db.at[dbIndex,
                  'sustainedSuppressionpValLaser'] = sustainedSupIndpVals[-1]
            db.at[dbIndex,
                  'sustainedFacilitationIndexLaser'] = sustainedFacInds[-1]
            db.at[dbIndex,
                  'sustainedFacilitationpValLaser'] = sustainedFacIndpVals[-1]
            db.at[dbIndex, 'sustainedPrefBandwidthLaser'] = bandEachTrial[
                sustainedPeakInds[-1]]

            db.at[dbIndex,
                  'sustainedSuppressionIndexNoLaser'] = sustainedSupInds[0]
            db.at[dbIndex,
                  'sustainedSuppressionpValNoLaser'] = sustainedSupIndpVals[0]
            db.at[dbIndex,
                  'sustainedFacilitationIndexNoLaser'] = sustainedFacInds[0]
            db.at[dbIndex,
                  'sustainedFacilitationpValNoLaser'] = sustainedFacIndpVals[0]
            db.at[dbIndex, 'sustainedPrefBandwidthNoLaser'] = bandEachTrial[
                sustainedPeakInds[0]]

            #no laser fit
            sustainedResponseNoLaser = sustainedSpikeArray[:, 0]

            bandsForFit = np.unique(bandEachTrial)
            bandsForFit[-1] = 6
            mFixed = 1

            fitParams, R2 = fitfuncs.diff_of_gauss_fit(
                bandsForFit, sustainedResponseNoLaser, mFixed=mFixed)

            #fit params
            db.at[dbIndex, 'R0noLaser'] = fitParams[0]
            db.at[dbIndex, 'RDnoLaser'] = fitParams[3]
            db.at[dbIndex, 'RSnoLaser'] = fitParams[4]
            db.at[dbIndex, 'mnoLaser'] = mFixed
            db.at[dbIndex, 'sigmaDnoLaser'] = fitParams[1]
            db.at[dbIndex, 'sigmaSnoLaser'] = fitParams[2]
            db.at[dbIndex, 'bandwidthTuningR2noLaser'] = R2

            testBands = np.linspace(bandsForFit[0], bandsForFit[-1], 500)
            allFitParams = [mFixed]
            allFitParams.extend(fitParams)
            suppInd, prefBW = fitfuncs.extract_stats_from_fit(
                allFitParams, testBands)

            db.at[dbIndex, 'fitSustainedSuppressionIndexNoLaser'] = suppInd
            db.at[dbIndex, 'fitSustainedPrefBandwidthNoLaser'] = prefBW

            #laser fit
            sustainedResponseLaser = sustainedSpikeArray[:, 1]

            fitParamsLaser, R2Laser = fitfuncs.diff_of_gauss_fit(
                bandsForFit, sustainedResponseLaser, mFixed=mFixed)

            #fit params
            db.at[dbIndex, 'R0laser'] = fitParamsLaser[0]
            db.at[dbIndex, 'RDlaser'] = fitParamsLaser[3]
            db.at[dbIndex, 'RSlaser'] = fitParamsLaser[4]
            db.at[dbIndex, 'mlaser'] = mFixed
            db.at[dbIndex, 'sigmaDlaser'] = fitParamsLaser[1]
            db.at[dbIndex, 'sigmaSlaser'] = fitParamsLaser[2]
            db.at[dbIndex, 'bandwidthTuningR2laser'] = R2Laser

            allFitParamsLaser = [mFixed]
            allFitParamsLaser.extend(fitParamsLaser)
            suppIndLaser, prefBWLaser = fitfuncs.extract_stats_from_fit(
                allFitParamsLaser, testBands)

            db.at[dbIndex, 'fitSustainedSuppressionIndexLaser'] = suppIndLaser
            db.at[dbIndex, 'fitSustainedPrefBandwidthLaser'] = prefBWLaser

            meanLaserDiff = np.mean(sustainedResponseLaser -
                                    sustainedResponseNoLaser)
            db.at[dbIndex, 'laserChangeResponse'] = meanLaserDiff

            laserDiff = sustainedResponseLaser - sustainedResponseNoLaser
            peakInd = np.argmax(sustainedResponseNoLaser)

            db.at[dbIndex, 'peakChangeFR'] = laserDiff[peakInd]
            db.at[dbIndex, 'WNChangeFR'] = laserDiff[-1]

            testRespsNoLaser = fitfuncs.diff_gauss_form(
                testBands, *allFitParams)
            testRespsLaser = fitfuncs.diff_gauss_form(testBands,
                                                      *allFitParamsLaser)

            laserDiffModel = testRespsLaser - testRespsNoLaser
            peakIndModel = np.argmax(testRespsNoLaser)

            db.at[dbIndex, 'fitPeakChangeFR'] = laserDiffModel[peakIndModel]
            db.at[dbIndex, 'fitWNChangeFR'] = laserDiffModel[-1]

            #also calculating fits and suppression with pure tone being 0 bw condition
            toneSustainedSupInds, toneSustainedSupIndpVals, toneSustainedFacInds, toneSustainedFacIndpVals, toneSustainedPeakInds, toneSustainedSpikeArray = funcs.bandwidth_suppression_from_peak(
                bandSpikeTimestamps,
                bandEventOnsetTimes,
                bandEachTrial,
                secondSort,
                timeRange=[0.2, 1.0],
                baseRange=[-0.05, 0.0],
                zeroBWBaseline=False)
            db.at[
                dbIndex,
                'sustainedSuppressionIndexNoLaserPureTone'] = toneSustainedSupInds[
                    0]
            db.at[
                dbIndex,
                'sustainedSuppressionpValNoLaserPureTone'] = toneSustainedSupIndpVals[
                    0]
            db.at[
                dbIndex,
                'sustainedFacilitationIndexNoLaserPureTone'] = toneSustainedFacInds[
                    0]
            db.at[
                dbIndex,
                'sustainedFacilitationpValNoLaserPureTone'] = toneSustainedFacIndpVals[
                    0]
            db.at[dbIndex,
                  'sustainedPrefBandwidthNoLaserPureTone'] = bandEachTrial[
                      toneSustainedPeakInds[0]]

            db.at[
                dbIndex,
                'sustainedSuppressionIndexLaserPureTone'] = toneSustainedSupInds[
                    -1]
            db.at[
                dbIndex,
                'sustainedSuppressionpValLaserPureTone'] = toneSustainedSupIndpVals[
                    -1]
            db.at[
                dbIndex,
                'sustainedFacilitationIndexLaserPureTone'] = toneSustainedFacInds[
                    -1]
            db.at[
                dbIndex,
                'sustainedFacilitationpValLaserPureTone'] = toneSustainedFacIndpVals[
                    -1]
            db.at[dbIndex,
                  'sustainedPrefBandwidthLaserPureTone'] = bandEachTrial[
                      toneSustainedPeakInds[-1]]

            toneSustainedResponseNoLaser = toneSustainedSpikeArray[:, 0]

            toneFitParamsNoLaser, toneR2 = fitfuncs.diff_of_gauss_fit(
                bandsForFit, toneSustainedResponseNoLaser, mFixed=mFixed)

            #fit params
            db.at[dbIndex, 'R0PureToneNoLaser'] = toneFitParamsNoLaser[0]
            db.at[dbIndex, 'RDPureToneNoLaser'] = toneFitParamsNoLaser[3]
            db.at[dbIndex, 'RSPureToneNoLaser'] = toneFitParamsNoLaser[4]
            db.at[dbIndex, 'mPureToneNoLaser'] = mFixed
            db.at[dbIndex, 'sigmaDPureToneNoLaser'] = toneFitParamsNoLaser[1]
            db.at[dbIndex, 'sigmaSPureToneNoLaser'] = toneFitParamsNoLaser[2]
            db.at[dbIndex, 'bandwidthTuningR2PureToneNoLaser'] = toneR2

            allFitParamsToneNoLaser = [mFixed]
            allFitParamsToneNoLaser.extend(toneFitParamsNoLaser)
            suppIndTone, prefBWTone = fitfuncs.extract_stats_from_fit(
                allFitParamsToneNoLaser, testBands)

            db.at[dbIndex,
                  'fitSustainedSuppressionIndexPureToneNoLaser'] = suppIndTone
            db.at[dbIndex,
                  'fitSustainedPrefBandwidthPureToneNoLaser'] = prefBWTone

            toneSustainedResponseLaser = toneSustainedSpikeArray[:, 1]

            toneFitParamsLaser, toneR2Laser = fitfuncs.diff_of_gauss_fit(
                bandsForFit, toneSustainedResponseLaser, mFixed=mFixed)

            #fit params
            db.at[dbIndex, 'R0PureToneLaser'] = toneFitParamsLaser[0]
            db.at[dbIndex, 'RDPureToneLaser'] = toneFitParamsLaser[3]
            db.at[dbIndex, 'RSPureToneLaser'] = toneFitParamsLaser[4]
            db.at[dbIndex, 'mPureToneLaser'] = mFixed
            db.at[dbIndex, 'sigmaDPureToneLaser'] = toneFitParamsLaser[1]
            db.at[dbIndex, 'sigmaSPureToneLaser'] = toneFitParamsLaser[2]
            db.at[dbIndex, 'bandwidthTuningR2PureToneLaser'] = toneR2Laser

            allFitParamsToneLaser = [mFixed]
            allFitParamsToneLaser.extend(toneFitParamsLaser)
            suppIndToneLaser, prefBWToneLaser = fitfuncs.extract_stats_from_fit(
                allFitParamsToneLaser, testBands)

            db.at[
                dbIndex,
                'fitSustainedSuppressionIndexPureToneLaser'] = suppIndToneLaser
            db.at[dbIndex,
                  'fitSustainedPrefBandwidthPureToneLaser'] = prefBWToneLaser

            testRespsNoLaser = fitfuncs.diff_gauss_form(
                testBands, *allFitParamsToneNoLaser)
            testRespsLaser = fitfuncs.diff_gauss_form(testBands,
                                                      *allFitParamsToneLaser)

            laserDiffModel = testRespsLaser - testRespsNoLaser
            peakIndModel = np.argmax(testRespsNoLaser)

            db.at[dbIndex,
                  'fitPeakChangeFRPureTone'] = laserDiffModel[peakIndModel]
            db.at[dbIndex, 'fitWNChangeFRPureTone'] = laserDiffModel[-1]

            #also calculating fits and suppression with nothing being fit for bw 0
            noZeroSustainedResponseNoLaser = sustainedSpikeArray[1:, 0]
            bandsForFitNoZero = bandsForFit[1:]

            noZeroFitParamsNoLaser, noZeroR2 = fitfuncs.diff_of_gauss_fit(
                bandsForFitNoZero,
                noZeroSustainedResponseNoLaser,
                mFixed=mFixed)

            #fit params
            db.at[dbIndex, 'R0noZeroNoLaser'] = noZeroFitParamsNoLaser[0]
            db.at[dbIndex, 'RDnoZeroNoLaser'] = noZeroFitParamsNoLaser[3]
            db.at[dbIndex, 'RSnoZeroNoLaser'] = noZeroFitParamsNoLaser[4]
            db.at[dbIndex, 'mnoZeroNoLaser'] = mFixed
            db.at[dbIndex, 'sigmaDnoZeroNoLaser'] = noZeroFitParamsNoLaser[1]
            db.at[dbIndex, 'sigmaSnoZeroNoLaser'] = noZeroFitParamsNoLaser[2]
            db.at[dbIndex, 'bandwidthTuningR2noZeroNoLaser'] = noZeroR2

            allFitParamsNoZero = [mFixed]
            allFitParamsNoZero.extend(noZeroFitParamsNoLaser)
            testBandsNoZero = np.linspace(bandsForFitNoZero[0],
                                          bandsForFitNoZero[-1], 500)
            suppIndNoZero, prefBWNoZero = fitfuncs.extract_stats_from_fit(
                allFitParamsNoZero, testBandsNoZero)

            db.at[dbIndex,
                  'fitSustainedSuppressionIndexNoZeroNoLaser'] = suppIndNoZero
            db.at[dbIndex,
                  'fitSustainedPrefBandwidthNoZeroNoLaser'] = prefBWNoZero

            noZeroSustainedResponseLaser = sustainedSpikeArray[1:, 1]
            bandsForFitNoZero = bandsForFit[1:]

            noZeroFitParamsLaser, noZeroR2Laser = fitfuncs.diff_of_gauss_fit(
                bandsForFitNoZero, noZeroSustainedResponseLaser, mFixed=mFixed)

            #fit params
            db.at[dbIndex, 'R0noZeroLaser'] = noZeroFitParamsLaser[0]
            db.at[dbIndex, 'RDnoZeroLaser'] = noZeroFitParamsLaser[3]
            db.at[dbIndex, 'RSnoZeroLaser'] = noZeroFitParamsLaser[4]
            db.at[dbIndex, 'mnoZeroLaser'] = mFixed
            db.at[dbIndex, 'sigmaDnoZeroLaser'] = noZeroFitParamsLaser[1]
            db.at[dbIndex, 'sigmaSnoZeroLaser'] = noZeroFitParamsLaser[2]
            db.at[dbIndex, 'bandwidthTuningR2noZeroLaser'] = noZeroR2Laser

            allFitParamsNoZeroLaser = [mFixed]
            allFitParamsNoZeroLaser.extend(noZeroFitParamsLaser)
            suppIndNoZeroLaser, prefBWNoZeroLaser = fitfuncs.extract_stats_from_fit(
                allFitParamsNoZeroLaser, testBandsNoZero)

            db.at[
                dbIndex,
                'fitSustainedSuppressionIndexNoZeroLaser'] = suppIndNoZeroLaser
            db.at[dbIndex,
                  'fitSustainedPrefBandwidthNoZeroLaser'] = prefBWNoZeroLaser

            testRespsNoLaser = fitfuncs.diff_gauss_form(
                testBandsNoZero, *allFitParamsNoZero)
            testRespsLaser = fitfuncs.diff_gauss_form(testBandsNoZero,
                                                      *allFitParamsNoZeroLaser)

            laserDiffModel = testRespsLaser - testRespsNoLaser
            peakIndModel = np.argmax(testRespsNoLaser)

            db.at[dbIndex,
                  'fitPeakChangeFRNoZero'] = laserDiffModel[peakIndModel]
            db.at[dbIndex, 'fitWNChangeFRNoZero'] = laserDiffModel[-1]

    if len(filename) != 0:
        celldatabase.save_hdf(db, dbFilename)