Testing effect of DMSO backfill on Affinity

The experiment was performed on April 20, 2016. Full details can be found in Fluorescence Assay Lab Notebook in the google doc.

Roughly, 50 uL of 0.5uM of p38 in Kinase Buffer in a 384 well plate. A 24 well titration of each ligand was performed by the D300. A row of just buffer with the ligand titration was also measured along side our binding assay. In half the plate DMSO concentrations were normalized. In the other half they were not. (Note it is likely Gefitinib was not dispensed for unknown reasons, but just an observation upon watching the EVO pipette.)

DMSO percent in the DMSO backfill is to normalize concentration to the highest concentration which is: 0.2% DMSO


In [3]:
from assaytools import platereader
import matplotlib.pyplot as plt
import string
%pylab inline


Couldn't import dot_parser, loading of dot files will not be possible.
Populating the interactive namespace from numpy and matplotlib


In [4]:
part1 = "p38_singlet1_20160420_153238.xml"
part2 = "p38_singlet2_20160420_154750.xml"

In [5]:
part1_data = platereader.read_icontrol_xml(part1)
part2_data = platereader.read_icontrol_xml(part2)

In [6]:
#part1_data

In [7]:
part1_data.keys()


Out[7]:
['280_480_TOP_120',
 '280_340_TOP_100',
 '280_480_TOP_100',
 '340_480_BOT_120',
 '280_480_BOT_100',
 '340_480_TOP_100',
 '280_340_BOT_100',
 '340_480_BOT_100',
 '280_480_BOT_120',
 '340_480_TOP_120']

In [8]:
part2_data.keys()


Out[8]:
['ABS_280', '280_340_BOT_120', 'ABS_340', 'ABS_480', '280_340_TOP_120']

In [9]:
part1_data_A = platereader.select_data(part1_data, '280_480_TOP_120', 'A')

In [10]:
part1_data_B = platereader.select_data(part1_data, '280_480_TOP_120', 'B')

In [11]:
well = dict()
for j in string.ascii_uppercase:
    for i in range(1,25):
        well['%s' %j + '%s' %i] = i

In [12]:
def plotting(data_protein,data_buffer,ligand):
    
    x,y = [],[]

    for key in data_protein:
        x.append(ligand[key])
        y.append(data_protein[key])
    
    a,b = [],[]

    for key in data_buffer:
       a.append(ligand[key])
       b.append(data_buffer[key])
    
    plt.scatter(x,y)
    plt.scatter(a,b,color='k');

In [13]:
plotting(part1_data_A,part1_data_B,well)


/Users/hansons/anaconda/lib/python2.7/site-packages/matplotlib/collections.py:590: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison
  if self._edgecolors == str('face'):

In [14]:
part1_data_C = platereader.select_data(part1_data, '280_480_TOP_120', 'C')
part1_data_D = platereader.select_data(part1_data, '280_480_TOP_120', 'D')

In [15]:
plotting(part1_data_C,part1_data_D,well)



In [16]:
part1_data_E = platereader.select_data(part1_data, '280_480_TOP_120', 'E')
part1_data_F = platereader.select_data(part1_data, '280_480_TOP_120', 'F')
plotting(part1_data_E,part1_data_F,well)



In [17]:
part1_data_G = platereader.select_data(part1_data, '280_480_TOP_120', 'G')
part1_data_H = platereader.select_data(part1_data, '280_480_TOP_120', 'H')
plotting(part1_data_G,part1_data_H,well)



In [18]:
part1_data_I = platereader.select_data(part1_data, '280_480_TOP_120', 'I')
part1_data_J = platereader.select_data(part1_data, '280_480_TOP_120', 'J')
plotting(part1_data_I,part1_data_J,well)
plotting(part1_data_A,part1_data_B,well)



In [19]:
part1_data_K = platereader.select_data(part1_data, '280_480_TOP_120', 'K')
part1_data_L = platereader.select_data(part1_data, '280_480_TOP_120', 'L')
plotting(part1_data_K,part1_data_L,well)
plotting(part1_data_C,part1_data_D,well)



In [20]:
part1_data_M = platereader.select_data(part1_data, '280_480_TOP_120', 'M')
part1_data_N = platereader.select_data(part1_data, '280_480_TOP_120', 'N')
plotting(part1_data_M,part1_data_N,well)
plotting(part1_data_E,part1_data_F,well)



In [21]:
part1_data_O = platereader.select_data(part1_data, '280_480_TOP_120', 'O')
part1_data_P = platereader.select_data(part1_data, '280_480_TOP_120', 'P')
plotting(part1_data_O,part1_data_P,well)
plotting(part1_data_G,part1_data_H,well)



In [22]:
part1_data_O


Out[22]:
{'O1': '2436',
 'O10': '2590',
 'O11': '2541',
 'O12': '2681',
 'O13': '2556',
 'O14': '2514',
 'O15': '2571',
 'O16': '2414',
 'O17': '2519',
 'O18': '2418',
 'O19': '2466',
 'O2': '2415',
 'O20': '2479',
 'O21': '2526',
 'O22': '2479',
 'O23': '2472',
 'O24': '2394',
 'O3': '2480',
 'O4': '2427',
 'O5': '2415',
 'O6': '2438',
 'O7': '2403',
 'O8': '2485',
 'O9': '2599'}

In [23]:
#While this way of plotting works fine, I need to have this data in a list in the right order 
#to analyze as I currently have it

In [24]:
Lstated = np.array([20.0e-6,14.0e-6,9.82e-6,6.88e-6,4.82e-6,3.38e-6,2.37e-6,1.66e-6,1.16e-6,0.815e-6,0.571e-6,0.4e-6,0.28e-6,0.196e-6,0.138e-6,0.0964e-6,0.0676e-6,0.0474e-6,0.0320e-6,0.0240e-6,0.0160e-6,0.0120e-6,0.008e-6,0.00001e-6], np.float64) # ligand concentration, M

In [25]:
#sorted(well.keys(), key=lambda k:well[k])

In [ ]:


In [ ]:


In [26]:
def reorder2list(data,wells):
    
    sorted_keys = sorted(well.keys(), key=lambda k:well[k])
    
    reorder_data = []
    
    for key in sorted_keys:
        try:
            reorder_data.append(data[key])
        except:
            pass
        
    reorder_data = np.asarray(reorder_data,np.float64)
    
    return reorder_data

In [ ]:


In [ ]:


In [27]:
reorder_A = reorder2list(part1_data_A,well)

In [28]:
part1_data_A


Out[28]:
{'A1': '15298',
 'A10': '8146',
 'A11': '6850',
 'A12': '11834',
 'A13': '4940',
 'A14': '4305',
 'A15': '3722',
 'A16': '3483',
 'A17': '3040',
 'A18': '2956',
 'A19': '2912',
 'A2': '15558',
 'A20': '2887',
 'A21': '2649',
 'A22': '2558',
 'A23': '2537',
 'A24': '2500',
 'A3': '15186',
 'A4': '14461',
 'A5': '13961',
 'A6': '13245',
 'A7': '11926',
 'A8': '11053',
 'A9': '9478'}

In [29]:
reorder_A


Out[29]:
array([ 15298.,  15558.,  15186.,  14461.,  13961.,  13245.,  11926.,
        11053.,   9478.,   8146.,   6850.,  11834.,   4940.,   4305.,
         3722.,   3483.,   3040.,   2956.,   2912.,   2887.,   2649.,
         2558.,   2537.,   2500.])

In [30]:
reorder_B = reorder2list(part1_data_B,well)

In [31]:
plt.semilogx()
plt.plot(Lstated,reorder_A,Lstated,reorder_B);


Analysis

Below everything needs to be changed to be relevant to 384 well plate.


In [32]:
# Stated concentrations of protein and ligand.
#ligand_conc from before
Pstated = 0.5e-6 * np.ones([24],np.float64) # protein concentration, M

In [33]:
# Assay configuration details
import math
assay_volume = 50e-6 # assay volume, L
well_area = 0.1369 # well area, cm^2 for 4ti-0203 [http://4ti.co.uk/files/3113/4217/2464/4ti-0201.pdf]
path_length = assay_volume * 1000 / well_area # cm, needed for inner filter effect corrections     

# Uncertainties in protein and ligand concentrations.
dPstated = 0.35 * Pstated # protein concentration uncertainty
dLstated = 0.08 * Lstated # ligand concentraiton uncertainty (due to gravimetric preparation and HP D300 dispensing)

In [40]:
def quick_model(protein_data, buffer_data,name):
    reorder_protein = reorder2list(protein_data,well)
    reorder_buffer = reorder2list(buffer_data,well)
    
    from assaytools import pymcmodels
    pymc_model = pymcmodels.make_model(Pstated, dPstated, Lstated, dLstated, 
               top_complex_fluorescence=reorder_protein,
               top_ligand_fluorescence=reorder_buffer,
               use_primary_inner_filter_correction=True, 
               use_secondary_inner_filter_correction=True, 
               assay_volume=assay_volume, DG_prior='uniform')
    
    mcmc = pymcmodels.run_mcmc(pymc_model)
    
    from assaytools import plots
    figure = plots.plot_measurements(Lstated, Pstated, pymc_model, mcmc=mcmc)
    
    map = pymcmodels.map_fit(pymc_model)
    
    pymcmodels.show_summary(pymc_model, map, mcmc)
    
    DeltaG = map.DeltaG.value
    
    np.save('DeltaG_%s.npy'%name,DeltaG)
    np.save('DeltaG_trace_%s.npy'%name,mcmc.DeltaG.trace())

In [41]:
quick_model(part1_data_A,part1_data_B,'BOS_w_backfill')


MAP fitting cycle 5/5
DeltaG = -34.5 +- 6.0 kT
Kd = 1.0 nM +- 57518692.2 fM

In [42]:
quick_model(part1_data_I,part1_data_J,'BOS')


MAP fitting cycle 5/5
DeltaG = -15.1 +- 1.9 kT
Kd = 290.4 nM +- 171.2 nM

In [43]:
DeltaG_trace_BOS_w_backfill = np.load('DeltaG_trace_BOS_w_backfill.npy')
DeltaG_trace_BOS = np.load('DeltaG_trace_BOS.npy')

In [146]:
import pandas as pd

bos_affinity = pd.read_csv('../literature_affinity/bosutinib.csv')

# bos_affinity[['Name in screen']] == 'p38-alpha'
# bos_affinity[['Affinity (nM)']] 
bos_affinity[bos_affinity['Name in screen'] == 'p38-alpha']['Affinity (nM)']
#bos_affinity.


Out[146]:
329    >3000.0
Name: Affinity (nM), dtype: object

In [65]:
plt.hist(DeltaG_trace_BOS, 40, alpha=0.75, label='Bos no backfill')
plt.hist(DeltaG_trace_BOS_w_backfill, 40, alpha=0.75, label='Bos with backfill')
plt.plot([DeltaG_trace_BOS_w_backfill.mean(),DeltaG_trace_BOS_w_backfill.mean()],[0, 350],'g-')
plt.plot([DeltaG_trace_BOS.mean(),DeltaG_trace_BOS.mean()],[0, 350],'b-')
#plt.plot([literature_Bos,literature_Bos],[0, 350],'r-',label='IUPHARM data')
plt.xlabel('$\Delta G$ ($k_B T$)');
plt.ylabel('$P(\Delta G)$');
plt.title('histogram of estimates for binding free energy');
plt.legend(loc=0);



In [149]:
quick_model(part1_data_C,part1_data_D,'BSI_w_backfill')


MAP fitting cycle 5/5
DeltaG = -13.3 +- 0.6 kT
Kd = 1.7 uM +- 1.4 uM

In [150]:
quick_model(part1_data_K,part1_data_L,'BSI')


MAP fitting cycle 5/5
DeltaG = -13.0 +- 0.6 kT
Kd = 2.4 uM +- 3.0 uM

In [151]:
DeltaG_trace_BSI_w_backfill = np.load('DeltaG_trace_BSI_w_backfill.npy')
DeltaG_trace_BSI = np.load('DeltaG_trace_BSI.npy')

In [153]:
plt.hist(DeltaG_trace_BSI, 40, alpha=0.75, label='Bsi no backfill')
plt.hist(DeltaG_trace_BSI_w_backfill, 40, alpha=0.75, label='Bsi with backfill')
plt.plot([DeltaG_trace_BSI_w_backfill.mean(),DeltaG_trace_BSI_w_backfill.mean()],[0, 350],'g-')
plt.plot([DeltaG_trace_BSI.mean(),DeltaG_trace_BSI.mean()],[0, 350],'b-')
#plt.plot([literature_Bos,literature_Bos],[0, 350],'r-',label='IUPHARM data')
plt.xlabel('$\Delta G$ ($k_B T$)');
plt.ylabel('$P(\Delta G)$');
plt.title('histogram of estimates for binding free energy');
plt.legend(loc=0);



In [154]:
quick_model(part1_data_E,part1_data_F,'ERL_w_backfill')


MAP fitting cycle 5/5
DeltaG = -11.5 +- 0.5 kT
Kd = 10.4 uM +- 12.0 uM

In [155]:
quick_model(part1_data_M,part1_data_N,'ERL')


MAP fitting cycle 5/5
DeltaG = -10.4 +- 0.2 kT
Kd = 29.9 uM +- 5.8 uM

In [156]:
DeltaG_trace_ERL_w_backfill = np.load('DeltaG_trace_ERL_w_backfill.npy')
DeltaG_trace_ERL = np.load('DeltaG_trace_ERL.npy')

In [157]:
plt.hist(DeltaG_trace_ERL, 40, alpha=0.75, label='Erl no backfill')
plt.hist(DeltaG_trace_ERL_w_backfill, 40, alpha=0.75, label='Erl with backfill')
plt.plot([DeltaG_trace_ERL_w_backfill.mean(),DeltaG_trace_ERL_w_backfill.mean()],[0, 350],'g-')
plt.plot([DeltaG_trace_ERL.mean(),DeltaG_trace_ERL.mean()],[0, 350],'b-')
#plt.plot([literature_Bos,literature_Bos],[0, 350],'r-',label='IUPHARM data')
plt.xlabel('$\Delta G$ ($k_B T$)');
plt.ylabel('$P(\Delta G)$');
plt.title('histogram of estimates for binding free energy');
plt.legend(loc=0);



In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:


In [ ]:
Summary of differences in bar chart: http://matplotlib.org/examples/api/barchart_demo.html