calcolare il punto isoelettrico di un peptide (o almeno stimarlo)
Pubblicato da fuliggians su 14 Maggio 2007
Mi hanno chiesto di scrivere un piccolo script per calcolare l’IP di un peptide.
Il problema solito è che questi tipi di stima vengono fatti sull’intera sequenza proteica, non il singolo peptide. Comunque on line ho trovato almeno 2 tools in grado di fare questi calcoli. Sfortunatamente, testandoli un po’ se ne generano dei risultati ben differenti quando si inserisce una sequenza di circa 15 aa.
A questo punto ho scelto di seguire le linee guida del sofware integrato nella “sequence manipulator suite” (consigliato), e specificamente l’algoritmo sviluppato da David Tabb. L’ho trasformato in Perl, e mi sentivo tanto contento.
Ma il problema è che mi avevano pure chiesto di aggiunge l’opzione che alcuni amino acidi siano modificati (per lo più fosforilati). Un bel problema!
Infatti sebbene Google is my friend, non sono riuscito a trovare una lista di valori del pK degli amino acidi modificati. Questi valori infatti sono necessari per implementare il calcolo del IP. Cercando bene, ho individuato 3 diversi set di valori pKa per aminoacidi fosforilati. Come c’era da aspettarsi, sono completamente diversi!
Ecco quello che ho trovato:
- nel phosphosite web page www.phosphosite.org/Login.jsp c’è la possibilità di predirre il pI per vari siti di fosforilazione. E’ basato sull’articolo: Bjellqvist, B., Hughes, G.J., Pasquali, Ch., Paquet, N., Ravier, F., Sanchez, J.-Ch., Frutiger, S. & Hochstrasser, D.F., The focusing positions of polypeptides in immobilized pH gradients can be predicted from their amino acid sequences, Electrophoresis 1993, 14:1023-1031.
- http://prometheus.brc.mcw.edu/promost/
- E infine ho trovato questo http://scansite.mit.edu/calc_mw_pi.htmlin cui si può aggiungere una serie di fosforilazioni!
Comunque mettendo insieme il tutto, ne è uscito questo script, non è certo perfetto, ma se qualcuno di trova ad affrontare le stesse problematiche potrebbe dargli qualche idea.
L’intero script potrete trovarlo tra i file utili nella barra laterale, qui sotto giusto l’implementazione dell’algoritmo.
#####
# for the aa modified we have to insert the relative pK
# and we have to develop a new terminology, maybe different uppercase or lowercase
#####
# The focusing positions of polypeptides in immobilized pH gradients can be predicted from their amino acid sequences,
#Electrophoresis 1993, 14:1023-1031).
#We have added the option to include phosphorylations, using pKa = 2.12 for the first ionization and pKa = 7.21 for the second.
## Phosphoserine/threonine(S/T): pKa1 = 6.90 pKa2=1.2
# Phosphotyrosine(Y) = identical
# http://prometheus.brc.mcw.edu/promost/
############
sub pepIep {
############
$pep=();
$pep= shift @_;
$pkSet= shift @_;#variables
$pH = 7;
$step=3.5;
$charge=0;
$last_charge=0;
#dataset_pk
if ($pkSet == 1) {
$N_term_pK=8;
$K_pK=10;
$R_pK=12;
$H_pK=6.5;
$D_pK=4.4;
$E_pK=4.4;
$C_pK=8.5;
$Y_pK=10;
$C_term_pK=3.1;
}
else {
$N_term_pK=8.6;
$K_pK=10.8;
$R_pK=12.5;
$H_pK=6.5;
$D_pK=3.9;
$E_pK=4.1;
$C_pK=8.5;
$Y_pK=10.1;
$C_term_pK=3.6;
}
#dataset modification
$m1_pK=2.12;
$m2_pK=7.21;
@pepSplitted=();
%aaList=();
@aaModifiedList=();
@pepSplitted=split //, $pep;
foreach my $aa (@pepSplitted) {
$aaList{lc $aa}++;
if ($aa eq ‘*’) {
$aaList{lc $last_aa}–;
$aaList{lc $last_aa.$aa}++;
push @aaModifiedList, lc $last_aa.$aa;
}
$last_aa=lc $aa;
}
while (1) {
#charge Standard
$charge=&partial_charge($N_term_pK,$pH)+$aaList{k}*&partial_charge($K_pK,$pH)+$aaList{r}*&partial_charge($R_pK,$pH)+$aaList{h}*&partial_charge($H_pK,$pH)-$aaList{d}*&partial_charge($pH,$D_pK)-$aaList{e}*&partial_charge($pH,$E_pK)-$aaList{c}*&partial_charge($pH,$C_pK)-$aaList{y}*&partial_charge($pH,$Y_pK)-&partial_charge($pH,$C_term_pK);
#charge Modified (in case they have the same pK values)
foreach $aaMod (@aaModifiedList) {
if ($aaList{$aaMod}==1) { $charge-=&partial_charge($pH,$m1_pK);}
elsif ($aaList{$aaMod}>1) { $charge-=&partial_charge($pH,$m1_pK)-($aaList{$aaMod}-1)*&partial_charge($pH,$m2_pK);}
}
#check
if (sprintf(“%d”,$charge*100)/100 == sprintf(“%d”,$last_charge*100)/100) {last;}
if ($charge>0){$pH=$pH+$step;}
else {$pH=$pH-$step;}
$step=$step/2;
$last_charge=$charge;
}
return sprintf(“%.2f”,$pH);
}
Feed del blog
Digg/fuliggians
Flickr/fuliggians
Myspace/radioborsotto
Friendster/Fuliggians
Del.icio.us/fuliggians
Blog/Fuliggians
dalloliogm detto
hola!
ehi se vuoi un consiglio, usa il tag
di wordpress per i codici, viene impaginato molto meglio!
dalloliogm detto
come non detto, wordpress mi ha distrutto il commento sopra.
Usa il tag ‘code’!