Cosmic または Uniprot で表示されるタンパク質の正規の AA 配列に、Protein Databank の PDB ファイルを一致させたいと考えています。具体的には、pdb ファイルから、バックボーンの炭素アルファ原子とその xyz 位置を取得する必要があります。また、タンパク質シーケンスで実際の順序を引き出す必要があります。構造 3GFT (Kras - Uniprot Accession Number P01116) の場合、これは簡単です。ResSeq 番号を取得するだけです。ただし、他のいくつかのタンパク質については、これがどのように可能かわかりません.
たとえば、構造 (2ZHQ) (タンパク質 F2 - Uniprot アクセッション番号 P00734) の場合、Seqres は番号「1」と「14」で繰り返される ResSeq 番号を持ち、Icode エントリのみが異なります。さらに、icode エントリは辞書順ではないため、抽出する順序を判断するのは困難です。
構造 3V5Q (Uniprot Accession Number Q16288) を考慮すると、さらに悪化します。ほとんどのタンパク質では、ResSeq 番号は、COSMIC や UNIPROT などのソースからの実際のアミノ酸と一致します。ただし、位置 711 の後、位置 730 にジャンプします。REMARK 465 (欠落している原子) を見ると、チェーン A では 726-729 が欠落していることがわかります。しかし、それをタンパク質と照合した後、それらの AA は実際には 712-715 です。
簡単な 3GFT の例で動作するコードを添付しましたが、誰かが pdb ファイルの専門家であり、残りの部分を理解するのを手伝ってくれるなら、私は大いに感謝します.
library(gdata)
#answer<- get.positions("http://www.pdb.org/pdb/files/2ZHQ.pdb","L")
answer<- get.positions("http://www.pdb.org/pdb/files/3GFT.pdb","A")
#This function reads a pdb file and returns the appropriate data structure
get.positions <- function(sourcefile, chain_required = "A"){
N <- 10^5
AACount <- 0
positions = data.frame(Residue=rep(NA, N),AtomCount=rep(0, N),SideChain=rep(NA, N),XCoord=rep(0, N),YCoord=rep(0, N),ZCoord=rep(0, N),stringsAsFactors=FALSE)
visited = list()
filedata <- readLines(sourcefile, n= -1)
for(i in 1: length(filedata)){
input = filedata[i]
id = substr(input,1,4)
if(id == "ATOM"){
type = substr(input,14,15)
if(type == "CA"){
resSerial = strtoi(substr(input, 7,11))
residue = substr(input,18,20)
type_of_chain = substr(input,22,22)
resSeq = strtoi(substr(input, 23,26))
altLoc = substr(input,17,17)
if(resSeq >=1){ #does not include negative residues
if(type_of_chain == chain_required && !(resSerial %in% visited) && (altLoc == " " || altLoc == "A") ){
visited <- c(visited, resSerial)
AACount <- AACount + 1
position_string =list()
position_string[[1]]= as.numeric(substr(input,31,38))
position_string[[2]] =as.numeric(substr(input,39,46))
position_string[[3]] =as.numeric(substr(input,47,54))
#print(input)
positions[AACount,]<- c(residue, resSeq, type_of_chain, position_string[[1]], position_string[[2]], position_string[[3]])
}
}
}
}
}
positions<-positions[1:AACount,]
positions[,2]<- as.numeric(positions[,2])
positions[,4]<- as.numeric(positions[,4])
positions[,5]<- as.numeric(positions[,5])
positions[,6]<- as.numeric(positions[,6])
return (positions)
}