Modalities of TCR interactions with pMHCs
Introduction
In this notebook, we investigated whether TCRs can be both flexible and rigid depending on the antigen they are contacting. We also looked at the opposite phenomenon of whether peptides can be both flexible and rigid depending on the TCR that is contacting them.
[1]:
import pandas as pd
[2]:
apo_holo_summary = pd.read_csv('../data/processed/apo-holo-tcr-pmhc-class-I/apo_holo_summary.csv')
apo_holo_summary['id'] = apo_holo_summary['file_name'].str.replace('.pdb', '', regex=False)
apo_holo_summary = apo_holo_summary.set_index('id')
apo_holo_summary
[2]:
file_name | pdb_id | structure_type | state | alpha_chain | beta_chain | antigen_chain | mhc_chain1 | mhc_chain2 | cdr_sequences_collated | peptide_sequence | mhc_slug | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
id | ||||||||||||
1ao7_D-E-C-A-B_tcr_pmhc | 1ao7_D-E-C-A-B_tcr_pmhc.pdb | 1ao7 | tcr_pmhc | holo | D | E | C | A | B | DRGSQS-IYSNGD-AVTTDSWGKLQ-MNHEY-SVGAGI-ASRPGLA... | LLFGYPVYV | hla_a_02_01 |
1b0g_C-A-B_pmhc | 1b0g_C-A-B_pmhc.pdb | 1b0g | pmhc | apo | NaN | NaN | C | A | B | NaN | ALWGFFPVL | hla_a_02_01 |
1b0g_F-D-E_pmhc | 1b0g_F-D-E_pmhc.pdb | 1b0g | pmhc | apo | NaN | NaN | F | D | E | NaN | ALWGFFPVL | hla_a_02_01 |
1bd2_D-E-C-A-B_tcr_pmhc | 1bd2_D-E-C-A-B_tcr_pmhc.pdb | 1bd2 | tcr_pmhc | holo | D | E | C | A | B | NSMFDY-ISSIKDK-AAMEGAQKLV-MNHEY-SVGAGI-ASSYPGG... | LLFGYPVYV | hla_a_02_01 |
1bii_P-A-B_pmhc | 1bii_P-A-B_pmhc.pdb | 1bii | pmhc | apo | NaN | NaN | P | A | B | NaN | RGPGRAFVTI | h2_dd |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
7rtd_C-A-B_pmhc | 7rtd_C-A-B_pmhc.pdb | 7rtd | pmhc | apo | NaN | NaN | C | A | B | NaN | YLQPRTFLL | hla_a_02_01 |
7rtr_D-E-C-A-B_tcr_pmhc | 7rtr_D-E-C-A-B_tcr_pmhc.pdb | 7rtr | tcr_pmhc | holo | D | E | C | A | B | DRGSQS-IYSNGD-AVNRDDKII-SEHNR-FQNEAQ-ASSPDIEQY | YLQPRTFLL | hla_a_02_01 |
8gvb_A-B-P-H-L_tcr_pmhc | 8gvb_A-B-P-H-L_tcr_pmhc.pdb | 8gvb | tcr_pmhc | holo | A | B | P | H | L | YGATPY-YFSGDTLV-AVGFTGGGNKLT-SEHNR-FQNEAQ-ASSD... | RYPLTFGW | hla_a_24_02 |
8gvg_A-B-P-H-L_tcr_pmhc | 8gvg_A-B-P-H-L_tcr_pmhc.pdb | 8gvg | tcr_pmhc | holo | A | B | P | H | L | YGATPY-YFSGDTLV-AVGFTGGGNKLT-SEHNR-FQNEAQ-ASSD... | RFPLTFGW | hla_a_24_02 |
8gvi_A-B-P-H-L_tcr_pmhc | 8gvi_A-B-P-H-L_tcr_pmhc.pdb | 8gvi | tcr_pmhc | holo | A | B | P | H | L | YGATPY-YFSGDTLV-AVVFTGGGNKLT-SEHNR-FQNEAQ-ASSL... | RYPLTFGW | hla_a_24_02 |
391 rows × 12 columns
[3]:
def categorize_movement(rmsd: float) -> str:
if rmsd < 0.5:
return f'Little Movement (<0.5 Å)'
if 0.5 <= rmsd < 1.0:
return f'Some Movement (0.5 to 1.0 Å)'
if 1.0 <= rmsd < 2.0:
return 'Movement (1.0 to 2.0 Å)'
if 2.0 <= rmsd < 4.0:
return 'Large Movement (2.0 to 4.0 Å)'
if 4.0 <= rmsd:
return 'Significant Movement (>4.0 Å)'
movement_order = pd.CategoricalDtype(categories=['Little Movement (<0.5 Å)',
'Some Movement (0.5 to 1.0 Å)',
'Movement (1.0 to 2.0 Å)',
'Large Movement (2.0 to 4.0 Å)',
'Significant Movement (>4.0 Å)'], ordered=True)
[4]:
def classify_modality(rmsd: float) -> str | None:
return 'rigid' if rmsd < 0.5 else 'flexible' if rmsd > 1.0 else None
TCR CDR Analysis
Load data
[5]:
results_fw_align = pd.read_csv('../data/processed/apo-holo-tcr-pmhc-class-I-comparisons/rmsd_cdr_fw_align_results.csv')
results_fw_align = results_fw_align.merge(
apo_holo_summary[['file_name',
'pdb_id',
'structure_type',
'state',
'alpha_chain',
'beta_chain',
'antigen_chain',
'mhc_chain1',
'mhc_chain2']],
how='left',
left_on='structure_x_name',
right_on='file_name',
).merge(
apo_holo_summary[['file_name',
'pdb_id',
'structure_type',
'state',
'alpha_chain',
'beta_chain',
'antigen_chain',
'mhc_chain1',
'mhc_chain2']],
how='left',
left_on='structure_y_name',
right_on='file_name',
).merge(
apo_holo_summary[['cdr_sequences_collated', 'peptide_sequence', 'mhc_slug']],
how='left',
left_on='complex_id',
right_index=True,
)
[6]:
results_fw_align['comparison'] = results_fw_align['state_x'] + '-' + results_fw_align['state_y']
results_fw_align['comparison'] = results_fw_align['comparison'].map(
lambda entry: 'apo-holo' if entry == 'holo-apo' else entry
)
results_fw_align = results_fw_align.query("comparison == 'apo-holo'").reset_index(drop=True)
[7]:
results_fw_align['structure_comparison'] = results_fw_align.apply(
lambda row: '-'.join(sorted([row.structure_x_name, row.structure_y_name])),
axis='columns',
)
results_fw_align = results_fw_align.drop_duplicates(['structure_comparison', 'chain_type', 'cdr']).reset_index(drop=True)
[8]:
results_fw_align
[8]:
complex_id | structure_x_name | structure_y_name | chain_type | cdr | rmsd | file_name_x | pdb_id_x | structure_type_x | state_x | ... | alpha_chain_y | beta_chain_y | antigen_chain_y | mhc_chain1_y | mhc_chain2_y | cdr_sequences_collated | peptide_sequence | mhc_slug | comparison | structure_comparison | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 3qdg_D-E-C-A-B_tcr_pmhc | 3qdg_D-E-C-A-B_tcr_pmhc.pdb | 3qeu_A-B_tcr.pdb | alpha_chain | 1 | 1.932806 | 3qdg_D-E-C-A-B_tcr_pmhc.pdb | 3qdg | tcr_pmhc | holo | ... | A | B | NaN | NaN | NaN | DRGSQS-IYSNGD-AVNFGGGKLI-MRHNA-SNTAGT-ASSLSFGTEAF | ELAGIGILTV | hla_a_02_01 | apo-holo | 3qdg_D-E-C-A-B_tcr_pmhc.pdb-3qeu_A-B_tcr.pdb |
1 | 3qdg_D-E-C-A-B_tcr_pmhc | 3qdg_D-E-C-A-B_tcr_pmhc.pdb | 3qeu_A-B_tcr.pdb | alpha_chain | 2 | 1.308598 | 3qdg_D-E-C-A-B_tcr_pmhc.pdb | 3qdg | tcr_pmhc | holo | ... | A | B | NaN | NaN | NaN | DRGSQS-IYSNGD-AVNFGGGKLI-MRHNA-SNTAGT-ASSLSFGTEAF | ELAGIGILTV | hla_a_02_01 | apo-holo | 3qdg_D-E-C-A-B_tcr_pmhc.pdb-3qeu_A-B_tcr.pdb |
2 | 3qdg_D-E-C-A-B_tcr_pmhc | 3qdg_D-E-C-A-B_tcr_pmhc.pdb | 3qeu_A-B_tcr.pdb | alpha_chain | 3 | 1.244062 | 3qdg_D-E-C-A-B_tcr_pmhc.pdb | 3qdg | tcr_pmhc | holo | ... | A | B | NaN | NaN | NaN | DRGSQS-IYSNGD-AVNFGGGKLI-MRHNA-SNTAGT-ASSLSFGTEAF | ELAGIGILTV | hla_a_02_01 | apo-holo | 3qdg_D-E-C-A-B_tcr_pmhc.pdb-3qeu_A-B_tcr.pdb |
3 | 3qdg_D-E-C-A-B_tcr_pmhc | 3qdg_D-E-C-A-B_tcr_pmhc.pdb | 3qeu_A-B_tcr.pdb | beta_chain | 1 | 0.809066 | 3qdg_D-E-C-A-B_tcr_pmhc.pdb | 3qdg | tcr_pmhc | holo | ... | A | B | NaN | NaN | NaN | DRGSQS-IYSNGD-AVNFGGGKLI-MRHNA-SNTAGT-ASSLSFGTEAF | ELAGIGILTV | hla_a_02_01 | apo-holo | 3qdg_D-E-C-A-B_tcr_pmhc.pdb-3qeu_A-B_tcr.pdb |
4 | 3qdg_D-E-C-A-B_tcr_pmhc | 3qdg_D-E-C-A-B_tcr_pmhc.pdb | 3qeu_A-B_tcr.pdb | beta_chain | 2 | 0.688597 | 3qdg_D-E-C-A-B_tcr_pmhc.pdb | 3qdg | tcr_pmhc | holo | ... | A | B | NaN | NaN | NaN | DRGSQS-IYSNGD-AVNFGGGKLI-MRHNA-SNTAGT-ASSLSFGTEAF | ELAGIGILTV | hla_a_02_01 | apo-holo | 3qdg_D-E-C-A-B_tcr_pmhc.pdb-3qeu_A-B_tcr.pdb |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
569 | 7rtr_D-E-C-A-B_tcr_pmhc | 7n1d_A-B_tcr.pdb | 7rtr_D-E-C-A-B_tcr_pmhc.pdb | alpha_chain | 2 | 0.810170 | 7n1d_A-B_tcr.pdb | 7n1d | tcr | apo | ... | D | E | C | A | B | DRGSQS-IYSNGD-AVNRDDKII-SEHNR-FQNEAQ-ASSPDIEQY | YLQPRTFLL | hla_a_02_01 | apo-holo | 7n1d_A-B_tcr.pdb-7rtr_D-E-C-A-B_tcr_pmhc.pdb |
570 | 7rtr_D-E-C-A-B_tcr_pmhc | 7n1d_A-B_tcr.pdb | 7rtr_D-E-C-A-B_tcr_pmhc.pdb | alpha_chain | 3 | 0.563263 | 7n1d_A-B_tcr.pdb | 7n1d | tcr | apo | ... | D | E | C | A | B | DRGSQS-IYSNGD-AVNRDDKII-SEHNR-FQNEAQ-ASSPDIEQY | YLQPRTFLL | hla_a_02_01 | apo-holo | 7n1d_A-B_tcr.pdb-7rtr_D-E-C-A-B_tcr_pmhc.pdb |
571 | 7rtr_D-E-C-A-B_tcr_pmhc | 7n1d_A-B_tcr.pdb | 7rtr_D-E-C-A-B_tcr_pmhc.pdb | beta_chain | 1 | 0.399182 | 7n1d_A-B_tcr.pdb | 7n1d | tcr | apo | ... | D | E | C | A | B | DRGSQS-IYSNGD-AVNRDDKII-SEHNR-FQNEAQ-ASSPDIEQY | YLQPRTFLL | hla_a_02_01 | apo-holo | 7n1d_A-B_tcr.pdb-7rtr_D-E-C-A-B_tcr_pmhc.pdb |
572 | 7rtr_D-E-C-A-B_tcr_pmhc | 7n1d_A-B_tcr.pdb | 7rtr_D-E-C-A-B_tcr_pmhc.pdb | beta_chain | 2 | 0.284455 | 7n1d_A-B_tcr.pdb | 7n1d | tcr | apo | ... | D | E | C | A | B | DRGSQS-IYSNGD-AVNRDDKII-SEHNR-FQNEAQ-ASSPDIEQY | YLQPRTFLL | hla_a_02_01 | apo-holo | 7n1d_A-B_tcr.pdb-7rtr_D-E-C-A-B_tcr_pmhc.pdb |
573 | 7rtr_D-E-C-A-B_tcr_pmhc | 7n1d_A-B_tcr.pdb | 7rtr_D-E-C-A-B_tcr_pmhc.pdb | beta_chain | 3 | 0.432453 | 7n1d_A-B_tcr.pdb | 7n1d | tcr | apo | ... | D | E | C | A | B | DRGSQS-IYSNGD-AVNRDDKII-SEHNR-FQNEAQ-ASSPDIEQY | YLQPRTFLL | hla_a_02_01 | apo-holo | 7n1d_A-B_tcr.pdb-7rtr_D-E-C-A-B_tcr_pmhc.pdb |
574 rows × 29 columns
Analysis
[9]:
def average_and_classify_cdr_movement(group):
group_mean = group.groupby(['chain_type',
'cdr',
'peptide_sequence',
'mhc_slug']).agg({'rmsd': 'mean'})
group_mean['movement'] = group_mean['rmsd'].map(categorize_movement).astype(movement_order)
group_mean['classification'] = group_mean['rmsd'].map(classify_modality)
return group_mean
cdr_results_agg = (results_fw_align.groupby('cdr_sequences_collated')
.apply(average_and_classify_cdr_movement)
.reset_index())
[10]:
cdr_results_agg_multi_pmhc = (cdr_results_agg.groupby(['cdr_sequences_collated', 'chain_type', 'cdr'])
.filter(lambda group: len(group) > 1))
[11]:
cdr_results_agg_multi_pmhc['num_modalities'] = (
cdr_results_agg_multi_pmhc.groupby(['cdr_sequences_collated', 'chain_type', 'cdr'])['classification']
.transform(lambda movement: movement.nunique())
)
[12]:
cdr_results_agg_multi_pmhc
[12]:
cdr_sequences_collated | chain_type | cdr | peptide_sequence | mhc_slug | rmsd | movement | classification | num_modalities | |
---|---|---|---|---|---|---|---|---|---|
11 | DRGSQS-IYSNGD-AVNFGGGKLI-MRHNA-SNTAGT-ASSLSFGTEAF | alpha_chain | 1 | AAGIGILTV | hla_a_02_01 | 2.149292 | Large Movement (2.0 to 4.0 Å) | flexible | 1 |
12 | DRGSQS-IYSNGD-AVNFGGGKLI-MRHNA-SNTAGT-ASSLSFGTEAF | alpha_chain | 1 | ELAGIGILTV | hla_a_02_01 | 2.188011 | Large Movement (2.0 to 4.0 Å) | flexible | 1 |
13 | DRGSQS-IYSNGD-AVNFGGGKLI-MRHNA-SNTAGT-ASSLSFGTEAF | alpha_chain | 1 | MMWDRGLGMM | hla_a_02_01 | 1.983439 | Movement (1.0 to 2.0 Å) | flexible | 1 |
14 | DRGSQS-IYSNGD-AVNFGGGKLI-MRHNA-SNTAGT-ASSLSFGTEAF | alpha_chain | 1 | SMLGIGIVPV | hla_a_02_01 | 2.269887 | Large Movement (2.0 to 4.0 Å) | flexible | 1 |
15 | DRGSQS-IYSNGD-AVNFGGGKLI-MRHNA-SNTAGT-ASSLSFGTEAF | alpha_chain | 2 | AAGIGILTV | hla_a_02_01 | 1.095455 | Movement (1.0 to 2.0 Å) | flexible | 1 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
287 | YSATPY-YYSGDPVV-AVSGFASALT-NNHNN-SYGAGS-ASGGGGTLY | beta_chain | 1 | SIYRYYGL | h2_kb | 0.579553 | Some Movement (0.5 to 1.0 Å) | None | 0 |
288 | YSATPY-YYSGDPVV-AVSGFASALT-NNHNN-SYGAGS-ASGGGGTLY | beta_chain | 2 | EQYKFYSV | h2_kb | 0.850569 | Some Movement (0.5 to 1.0 Å) | None | 0 |
289 | YSATPY-YYSGDPVV-AVSGFASALT-NNHNN-SYGAGS-ASGGGGTLY | beta_chain | 2 | SIYRYYGL | h2_kb | 0.938313 | Some Movement (0.5 to 1.0 Å) | None | 0 |
290 | YSATPY-YYSGDPVV-AVSGFASALT-NNHNN-SYGAGS-ASGGGGTLY | beta_chain | 3 | EQYKFYSV | h2_kb | 1.084084 | Movement (1.0 to 2.0 Å) | flexible | 1 |
291 | YSATPY-YYSGDPVV-AVSGFASALT-NNHNN-SYGAGS-ASGGGGTLY | beta_chain | 3 | SIYRYYGL | h2_kb | 0.925296 | Some Movement (0.5 to 1.0 Å) | None | 1 |
226 rows × 9 columns
[13]:
cdr_results_agg_multi_pmhc['num_modalities'].describe()
[13]:
count 226.000000
mean 0.814159
std 0.389842
min 0.000000
25% 1.000000
50% 1.000000
75% 1.000000
max 1.000000
Name: num_modalities, dtype: float64
[14]:
cdr_results_agg_multi_pmhc.query('num_modalities > 1')
[14]:
cdr_sequences_collated | chain_type | cdr | peptide_sequence | mhc_slug | rmsd | movement | classification | num_modalities |
---|
No TCRs had both <0.5 Å RMSD movement binding to one antigen and >1.0 Å RMSD binding to a different antigen.
Peptide Analysis
Load data
[15]:
pmhc_results = pd.read_csv('../data/processed/apo-holo-tcr-pmhc-class-I-comparisons/pmhc_tcr_contact_apo_holo.csv')
peptide_results = pmhc_results.query("chain_type == 'antigen_chain'").reset_index(drop=True)
peptide_results = peptide_results.drop(columns=['chain_type', 'tcr_contact'])
peptide_results = peptide_results.merge(
apo_holo_summary[['file_name',
'pdb_id',
'structure_type',
'state',
'alpha_chain',
'beta_chain',
'antigen_chain',
'mhc_chain1',
'mhc_chain2']],
how='left',
left_on='structure_x_name',
right_on='file_name',
).merge(
apo_holo_summary[['file_name',
'pdb_id',
'structure_type',
'state',
'alpha_chain',
'beta_chain',
'antigen_chain',
'mhc_chain1',
'mhc_chain2']],
how='left',
left_on='structure_y_name',
right_on='file_name',
).merge(
apo_holo_summary[['cdr_sequences_collated', 'peptide_sequence', 'mhc_slug']],
how='left',
left_on='complex_id',
right_index=True,
)
[16]:
peptide_results['comparison'] = peptide_results['state_x'] + '-' + peptide_results['state_y']
peptide_results['comparison'] = peptide_results['comparison'].map(
lambda entry: 'apo-holo' if entry == 'holo-apo' else entry
)
peptide_results = peptide_results.query("comparison == 'apo-holo'").reset_index(drop=True)
[17]:
peptide_results['structure_comparison'] = peptide_results.apply(
lambda row: '-'.join(sorted([row.structure_x_name, row.structure_y_name])),
axis='columns',
)
peptide_results = peptide_results.drop_duplicates(['structure_comparison']).reset_index(drop=True)
[18]:
peptide_results
[18]:
complex_id | structure_x_name | structure_y_name | rmsd | file_name_x | pdb_id_x | structure_type_x | state_x | alpha_chain_x | beta_chain_x | ... | alpha_chain_y | beta_chain_y | antigen_chain_y | mhc_chain1_y | mhc_chain2_y | cdr_sequences_collated | peptide_sequence | mhc_slug | comparison | structure_comparison | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 5c0a_D-E-C-A-B_tcr_pmhc | 5c0a_D-E-C-A-B_tcr_pmhc.pdb | 5n1y_C-A-B_pmhc.pdb | 0.448858 | 5c0a_D-E-C-A-B_tcr_pmhc.pdb | 5c0a | tcr_pmhc | holo | D | E | ... | NaN | NaN | C | A | B | NSAFQY-TYSSGN-AMRGDSSYKLI-SGHDY-FNNNVP-ASSLWEK... | MVWGPDPLYV | hla_a_02_01 | apo-holo | 5c0a_D-E-C-A-B_tcr_pmhc.pdb-5n1y_C-A-B_pmhc.pdb |
1 | 5wlg_D-E-C-A-B_tcr_pmhc | 5wlg_D-E-C-A-B_tcr_pmhc.pdb | 5wli_C-A-B_pmhc.pdb | 0.498148 | 5wlg_D-E-C-A-B_tcr_pmhc.pdb | 5wlg | tcr_pmhc | holo | D | E | ... | NaN | NaN | C | A | B | TYTTV-IRSNERE-ATVYAQGLT-NNHDY-SYVADS-ASSDWGDTGQLY | SQLLNAKYL | h2_db | apo-holo | 5wlg_D-E-C-A-B_tcr_pmhc.pdb-5wli_C-A-B_pmhc.pdb |
2 | 5wlg_D-E-C-A-B_tcr_pmhc | 5wlg_D-E-C-A-B_tcr_pmhc.pdb | 5wli_F-D-E_pmhc.pdb | 0.519507 | 5wlg_D-E-C-A-B_tcr_pmhc.pdb | 5wlg | tcr_pmhc | holo | D | E | ... | NaN | NaN | F | D | E | TYTTV-IRSNERE-ATVYAQGLT-NNHDY-SYVADS-ASSDWGDTGQLY | SQLLNAKYL | h2_db | apo-holo | 5wlg_D-E-C-A-B_tcr_pmhc.pdb-5wli_F-D-E_pmhc.pdb |
3 | 5wlg_D-E-C-A-B_tcr_pmhc | 5wlg_D-E-C-A-B_tcr_pmhc.pdb | 5wli_I-G-H_pmhc.pdb | 0.459025 | 5wlg_D-E-C-A-B_tcr_pmhc.pdb | 5wlg | tcr_pmhc | holo | D | E | ... | NaN | NaN | I | G | H | TYTTV-IRSNERE-ATVYAQGLT-NNHDY-SYVADS-ASSDWGDTGQLY | SQLLNAKYL | h2_db | apo-holo | 5wlg_D-E-C-A-B_tcr_pmhc.pdb-5wli_I-G-H_pmhc.pdb |
4 | 5wlg_D-E-C-A-B_tcr_pmhc | 5wlg_D-E-C-A-B_tcr_pmhc.pdb | 5wli_L-J-K_pmhc.pdb | 0.494705 | 5wlg_D-E-C-A-B_tcr_pmhc.pdb | 5wlg | tcr_pmhc | holo | D | E | ... | NaN | NaN | L | J | K | TYTTV-IRSNERE-ATVYAQGLT-NNHDY-SYVADS-ASSDWGDTGQLY | SQLLNAKYL | h2_db | apo-holo | 5wlg_D-E-C-A-B_tcr_pmhc.pdb-5wli_L-J-K_pmhc.pdb |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
372 | 7rtr_D-E-C-A-B_tcr_pmhc | 7n6d_G-E-F_pmhc.pdb | 7rtr_D-E-C-A-B_tcr_pmhc.pdb | 0.468869 | 7n6d_G-E-F_pmhc.pdb | 7n6d | pmhc | apo | NaN | NaN | ... | D | E | C | A | B | DRGSQS-IYSNGD-AVNRDDKII-SEHNR-FQNEAQ-ASSPDIEQY | YLQPRTFLL | hla_a_02_01 | apo-holo | 7n6d_G-E-F_pmhc.pdb-7rtr_D-E-C-A-B_tcr_pmhc.pdb |
373 | 7rtr_D-E-C-A-B_tcr_pmhc | 7n6d_K-I-J_pmhc.pdb | 7rtr_D-E-C-A-B_tcr_pmhc.pdb | 0.411050 | 7n6d_K-I-J_pmhc.pdb | 7n6d | pmhc | apo | NaN | NaN | ... | D | E | C | A | B | DRGSQS-IYSNGD-AVNRDDKII-SEHNR-FQNEAQ-ASSPDIEQY | YLQPRTFLL | hla_a_02_01 | apo-holo | 7n6d_K-I-J_pmhc.pdb-7rtr_D-E-C-A-B_tcr_pmhc.pdb |
374 | 7rtr_D-E-C-A-B_tcr_pmhc | 7n6d_O-M-N_pmhc.pdb | 7rtr_D-E-C-A-B_tcr_pmhc.pdb | 0.448905 | 7n6d_O-M-N_pmhc.pdb | 7n6d | pmhc | apo | NaN | NaN | ... | D | E | C | A | B | DRGSQS-IYSNGD-AVNRDDKII-SEHNR-FQNEAQ-ASSPDIEQY | YLQPRTFLL | hla_a_02_01 | apo-holo | 7n6d_O-M-N_pmhc.pdb-7rtr_D-E-C-A-B_tcr_pmhc.pdb |
375 | 7rtr_D-E-C-A-B_tcr_pmhc | 7p3d_C-A-B_pmhc.pdb | 7rtr_D-E-C-A-B_tcr_pmhc.pdb | 0.765295 | 7p3d_C-A-B_pmhc.pdb | 7p3d | pmhc | apo | NaN | NaN | ... | D | E | C | A | B | DRGSQS-IYSNGD-AVNRDDKII-SEHNR-FQNEAQ-ASSPDIEQY | YLQPRTFLL | hla_a_02_01 | apo-holo | 7p3d_C-A-B_pmhc.pdb-7rtr_D-E-C-A-B_tcr_pmhc.pdb |
376 | 7rtr_D-E-C-A-B_tcr_pmhc | 7rtd_C-A-B_pmhc.pdb | 7rtr_D-E-C-A-B_tcr_pmhc.pdb | 0.455078 | 7rtd_C-A-B_pmhc.pdb | 7rtd | pmhc | apo | NaN | NaN | ... | D | E | C | A | B | DRGSQS-IYSNGD-AVNRDDKII-SEHNR-FQNEAQ-ASSPDIEQY | YLQPRTFLL | hla_a_02_01 | apo-holo | 7rtd_C-A-B_pmhc.pdb-7rtr_D-E-C-A-B_tcr_pmhc.pdb |
377 rows × 27 columns
Analysis
[19]:
def average_and_classify_peptide_movement(group):
group_mean = group.groupby('cdr_sequences_collated').agg({'rmsd': 'mean'})
group_mean['movement'] = group_mean['rmsd'].map(categorize_movement).astype(movement_order)
group_mean['classification'] = group_mean['rmsd'].map(classify_modality)
return group_mean
peptide_results_agg = (peptide_results.groupby(['peptide_sequence', 'mhc_slug'])
.apply(average_and_classify_peptide_movement)
.reset_index())
[20]:
peptide_results_agg_multi_tcr = (peptide_results_agg.groupby(['mhc_slug', 'peptide_sequence'])
.filter(lambda group: len(group) > 1))
[21]:
peptide_results_agg_multi_tcr['num_modalities'] = (
peptide_results_agg_multi_tcr.groupby(['mhc_slug', 'peptide_sequence'])['classification']
.transform(lambda movement: movement.nunique())
)
[22]:
peptide_results_agg_multi_tcr
[22]:
peptide_sequence | mhc_slug | cdr_sequences_collated | rmsd | movement | classification | num_modalities | |
---|---|---|---|---|---|---|---|
0 | AAGIGILTV | hla_a_02_01 | DRGSQS-IYSNGD-AVNFGGGKLI-MRHNA-SNTAGT-ASSLSFGTEAF | 1.157017 | Movement (1.0 to 2.0 Å) | flexible | 1 |
1 | AAGIGILTV | hla_a_02_01 | DRGSQS-IYSNGD-AVNVAGKST-GTSNPN-SVGIG-AWSETGLGT... | 1.134248 | Movement (1.0 to 2.0 Å) | flexible | 1 |
2 | AAGIGILTV | hla_a_02_01 | FLGSQS-TYREGD-AVNDGGRLT-GTSNPN-WGPFG-AWSETGLGM... | 0.986466 | Some Movement (0.5 to 1.0 Å) | None | 1 |
3 | AAGIGILTV | hla_a_02_01 | SIFNT-LYKAGEL-AGGTGNQFY-ENHRY-SYGVKD-AISEVGVGQPQH | 1.323428 | Movement (1.0 to 2.0 Å) | flexible | 1 |
4 | AAGIGILTV | hla_a_02_01 | YRGSQS-IYSNGD-AVNFGGGKLI-MRHNA-SNTAGT-ASSWSFGTEAF | 0.526953 | Some Movement (0.5 to 1.0 Å) | None | 1 |
8 | APRGPHGGAASGL | hla_b_07_02 | NIATNDY-GYKTK-LVGEILDNFNKFY-MDHEN-SYDVKM-ASSQR... | 4.232887 | Significant Movement (>4.0 Å) | flexible | 1 |
9 | APRGPHGGAASGL | hla_b_07_02 | NIATNDY-GYKTK-LVVDQKLV-SGDLS-YYNGEE-ASSGGHTGSNEQF | 2.814299 | Large Movement (2.0 to 4.0 Å) | flexible | 1 |
11 | ASNENMETM | h2_db | DSTFNY-IRSVSDK-AASEGSGSWQLI-MNHDT-YYDKIL-ASSAG... | 0.396101 | Little Movement (<0.5 Å) | rigid | 1 |
12 | ASNENMETM | h2_db | DSTFNY-IRSVSDK-AASETSGSWQLI-MNHDT-YYDKIL-ASSRD... | 0.409245 | Little Movement (<0.5 Å) | rigid | 1 |
13 | ASNENMETM | h2_db | TTMRS-LASGT-AAVTGNTGKLI-MNHDT-YYDKIL-ASSRGTIHS... | 0.558530 | Some Movement (0.5 to 1.0 Å) | None | 1 |
14 | EAAGIGILTV | hla_a_02_01 | DRGSQS-IYSNGD-AVNVAGKST-GTSNPN-SVGIG-AWSETGLGT... | 3.621428 | Large Movement (2.0 to 4.0 Å) | flexible | 1 |
15 | EAAGIGILTV | hla_a_02_01 | FLGSQS-TYREGD-AVNDGGRLT-GTSNPN-WGPFG-AWSETGLGM... | 3.573235 | Large Movement (2.0 to 4.0 Å) | flexible | 1 |
22 | FLRGRAYGL | hla_b_08_01 | NSASQS-VYSSG-VVRAGKLI-MNHEY-SVGEGT-ASGQGNFDIQY | 0.617307 | Some Movement (0.5 to 1.0 Å) | None | 0 |
23 | FLRGRAYGL | hla_b_08_01 | TISGTDY-GLTSN-ILPLAGGTSYGKLT-SGHVS-FQNEAQ-ASSL... | 0.717857 | Some Movement (0.5 to 1.0 Å) | None | 0 |
24 | FLRGRAYGL | hla_b_08_01 | TSDPSYG-QGSYDQGN-AMREDTGNQFY-SGHAT-FQNNGV-ASSF... | 0.596415 | Some Movement (0.5 to 1.0 Å) | None | 0 |
27 | GILGFVFTL | hla_a_02_01 | SSNFYA-MTLNGDE-AFDTNAGKST-LNHDA-SQIVND-ASSIFGQ... | 0.446045 | Little Movement (<0.5 Å) | rigid | 1 |
28 | GILGFVFTL | hla_a_02_01 | SVFSS-VVTGGEV-AGAGSQGNLI-LNHDA-SQIVND-ASSSRASYEQY | 0.581065 | Some Movement (0.5 to 1.0 Å) | None | 1 |
29 | GILGFVFTL | hla_a_02_01 | SVFSS-VVTGGEV-AGAGSQGNLI-LNHDA-SQIVND-ASSSRSSYEQY | 0.465703 | Little Movement (<0.5 Å) | rigid | 1 |
30 | GILGFVFTL | hla_a_02_01 | SVFSS-VVTGGEV-AGAIGPSNTGKLI-LNHDA-SQIVND-ASSIR... | 0.344910 | Little Movement (<0.5 Å) | rigid | 1 |
31 | GILGFVFTL | hla_a_02_01 | TSESDYY-QEAYKQQN-AWGVNAGGTSYGKLT-LNHDA-SQIVND-... | 0.564845 | Some Movement (0.5 to 1.0 Å) | None | 1 |
37 | HMTEVVRHC | hla_a_02_01 | NSAFQY-TYSSGN-AMSGLKEDSSYKLI-MNHEY-SMNVEV-ASSI... | 0.694367 | Some Movement (0.5 to 1.0 Å) | None | 0 |
38 | HMTEVVRHC | hla_a_02_01 | NSASQS-VYSSG-VVQPGGYQKVT-MNHNS-SASEGT-ASSEGLWQ... | 0.785581 | Some Movement (0.5 to 1.0 Å) | None | 0 |
39 | HMTEVVRHC | hla_a_02_01 | NYSPAY-IRENEKE-ALDIYPHDMR-SGHAT-FQNNGV-ASSLDPG... | 0.864221 | Some Movement (0.5 to 1.0 Å) | None | 0 |
40 | HMTEVVRHC | hla_a_02_01 | TSENNYY-QEAYK-AFMGYSGAGSYQLT-ENHRY-SYGVKD-AISE... | 0.809779 | Some Movement (0.5 to 1.0 Å) | None | 0 |
45 | IPLTEEAEL | hla_b_35_01 | TRDTTYY-RNSFDEQN-ALSHNSGGSNYKLT-SGHNT-YYREEE-A... | 1.013667 | Movement (1.0 to 2.0 Å) | flexible | 1 |
46 | IPLTEEAEL | hla_b_35_01 | TSWWSYY-QGSDEQN-ALGEGGAQKLV-MNHNS-SASEGT-ASRTR... | 1.104902 | Movement (1.0 to 2.0 Å) | flexible | 1 |
58 | LLFGYPVYV | hla_a_02_01 | DRGSQS-IYSNGD-AVTTDSWGKLQ-MNHEY-SVGAGI-ASRPGLA... | 1.071247 | Movement (1.0 to 2.0 Å) | flexible | 1 |
59 | LLFGYPVYV | hla_a_02_01 | DRGSQS-IYSNGD-AVTTDSWGKLQ-MNHEY-SVGAGI-ASRPGLM... | 1.084802 | Movement (1.0 to 2.0 Å) | flexible | 1 |
60 | LLFGYPVYV | hla_a_02_01 | IRSSTS-IYSNGD-AVTTDRSGKLQ-MNHEY-SVGVGI-ASRPGAA... | 0.659812 | Some Movement (0.5 to 1.0 Å) | None | 1 |
61 | LLFGYPVYV | hla_a_02_01 | NSMFDY-ISSIKDK-AAMEGAQKLV-MNHEY-SVGAGI-ASSYPGG... | 1.105653 | Movement (1.0 to 2.0 Å) | flexible | 1 |
63 | LPEPLPQGQLTAY | hla_b_35_08 | TRDTTYY-RNSFDEQN-ALSGFYNTDKLI-MNHNS-SASEGT-ASP... | 0.467122 | Little Movement (<0.5 Å) | rigid | 1 |
64 | LPEPLPQGQLTAY | hla_b_35_08 | TRDTTYY-RNSFDEQN-ALSGFYNTDKLI-MNHNS-SASEGT-ASP... | 0.450190 | Little Movement (<0.5 Å) | rigid | 1 |
65 | LPEPLPQGQLTAY | hla_b_35_08 | TTSDR-LLSNGAV-AVGGGSNYQLI-SGHDT-YYEEEE-ASSRTGS... | 0.781614 | Some Movement (0.5 to 1.0 Å) | None | 1 |
69 | NLVPMVATV | hla_a_02_01 | SSNFYA-MTLNGDE-ARNTGNQFY-MNHEY-SVGAGI-ASSPVTGG... | 0.569056 | Some Movement (0.5 to 1.0 Å) | None | 0 |
70 | NLVPMVATV | hla_a_02_01 | TISGTDY-GLTSN-ILDNNNDMR-SGHVS-FNYEAQ-ASSLAPGTT... | 0.717804 | Some Movement (0.5 to 1.0 Å) | None | 0 |
74 | RFPLTFGWCF | hla_a_24_02 | DRGSQS-IYSNGD-GTYNQGGKLI-MNHEY-SMNVEV-ASSGASHEQY | 1.302746 | Movement (1.0 to 2.0 Å) | flexible | 1 |
75 | RFPLTFGWCF | hla_a_24_02 | YGATPY-YFSGDTLV-AVGAPSGAGSYQLT-MGHRA-YSYEKL-AS... | 0.830768 | Some Movement (0.5 to 1.0 Å) | None | 1 |
85 | RYPLTFGW | hla_a_24_02 | YGATPY-YFSGDTLV-AVGFTGGGNKLT-SEHNR-FQNEAQ-ASSD... | 0.869939 | Some Movement (0.5 to 1.0 Å) | None | 0 |
86 | RYPLTFGW | hla_a_24_02 | YGATPY-YFSGDTLV-AVVFTGGGNKLT-SEHNR-FQNEAQ-ASSL... | 0.708066 | Some Movement (0.5 to 1.0 Å) | None | 0 |
87 | RYPLTFGWCF | hla_a_24_02 | DSAIYN-IQSSQRE-AVRMDSSYKLI-SEHNR-FQNEAQ-ASSSWD... | 1.522271 | Movement (1.0 to 2.0 Å) | flexible | 1 |
88 | RYPLTFGWCF | hla_a_24_02 | TSWWSYY-QGSDEQN-ALGELARSGGYQKVT-GTSNPN-SVGIG-A... | 1.112057 | Movement (1.0 to 2.0 Å) | flexible | 1 |
91 | SLLMWITQC | hla_a_02_01 | DSAIYN-IPFWQRE-AVRPTSGGSYIPT-MNHEY-SVSVGM-ASSY... | 0.972491 | Some Movement (0.5 to 1.0 Å) | None | 0 |
92 | SLLMWITQC | hla_a_02_01 | DSAIYN-IQSSQRE-AVRPLLDGTYIPT-MNHEY-SVGAGT-ASSY... | 0.875077 | Some Movement (0.5 to 1.0 Å) | None | 0 |
93 | SLLMWITQC | hla_a_02_01 | DSAIYN-IQSSQRE-AVRPTSGGSYIPT-MNHEY-SVGAGI-ASSY... | 0.880234 | Some Movement (0.5 to 1.0 Å) | None | 0 |
94 | SLLMWITQC | hla_a_02_01 | DSAIYN-ITPWQRE-AVRPLLDGTYIPT-MNHEY-SVAIQT-ASSY... | 0.826961 | Some Movement (0.5 to 1.0 Å) | None | 0 |
95 | SLLMWITQC | hla_a_02_01 | DSAIYN-ITPWQRE-AVRPLLDGTYIPT-MNHEY-SVSVGM-ASSY... | 0.839051 | Some Movement (0.5 to 1.0 Å) | None | 0 |
100 | SSLCNFRAYV | h2_db | TISGNEY-GLQQN-ILSGGCNYKLT-MSHET-SYDVDS-ASSFGREQY | 0.344040 | Little Movement (<0.5 Å) | rigid | 1 |
101 | SSLCNFRAYV | h2_db | TISGNEY-GLQQN-ILSGGSNYKLT-MSHET-SYDVDS-ASSFGREQY | 0.356701 | Little Movement (<0.5 Å) | rigid | 1 |
106 | VVVGADGVGK | hla_a_11_01 | TRDTAYY-QPWWGEQN-AMSVPSGDGSYQFT-MNHEY-SVGEGT-A... | 1.256482 | Movement (1.0 to 2.0 Å) | flexible | 1 |
107 | VVVGADGVGK | hla_a_11_01 | TRDTTYY-RNSFDEQN-ALSGPSGAGSYQLT-MNHEY-SVGEGT-A... | 1.259841 | Movement (1.0 to 2.0 Å) | flexible | 1 |
111 | YLQPRTFLL | hla_a_02_01 | DRGSQS-IYSNGD-AVNRDDKII-SEHNR-FQNEAQ-ASSPDIEQY | 0.512357 | Some Movement (0.5 to 1.0 Å) | None | 0 |
112 | YLQPRTFLL | hla_a_02_01 | NSASQS-VYSSG-VVNINTDKLI-SEHNR-FQNEAQ-ASSSANSGELF | 0.627788 | Some Movement (0.5 to 1.0 Å) | None | 0 |
113 | YLQPRTFLL | hla_a_02_01 | NSASQS-VYSSG-VVNRNNDMR-LNHDA-SQIVND-AGQVTNTGELF | 0.685808 | Some Movement (0.5 to 1.0 Å) | None | 0 |
[23]:
peptide_results_agg_multi_tcr['num_modalities'].describe()
[23]:
count 53.000000
mean 0.641509
std 0.484146
min 0.000000
25% 0.000000
50% 1.000000
75% 1.000000
max 1.000000
Name: num_modalities, dtype: float64
[24]:
peptide_results_agg_multi_tcr.query('num_modalities > 1')
[24]:
peptide_sequence | mhc_slug | cdr_sequences_collated | rmsd | movement | classification | num_modalities |
---|
Similarly, no peptides have both large (>1.0 Å RMSD) conformational changes and small (<0.5 Å RMSD) conformational changes for different TCRs.
Conclusion
Neither the TCR CDR loops, nor the peptides show different movement modalities (rigid vs flexible) when contacted by different entities. These results indicate that the flexiblity of TCRs between apo and holo conformations is dependent on the composition of the entitity itself and not the entitity it is contacting.