我的目標是要轉換的包含這四種風格條目的約束文件:約束解析用Perl
T10N-Y9C-?: (111.699, 172.003, 26.159) L23CG/L50CG(notL23CG)
?-?-L147CB: (119.779, 178.656, 42.642) D107C/A77C/D110C
T89N-V88C-?: (120.308, 175.768, 130.859) orS106C_H41CG/F26CE1
G149N-G149CA-R109CD: (105.793, 45.249, 43.114)
隨着輸出,其中每個款式輸出爲:
assign (resid 9 and name C) (resid 23 and name CG or resid 50 and name CG) 3.5 2.5 8.5 ! T10N-Y9C-?: (111.699, 172.003, 26.159) L23CG/L50CG(notL23CG)
assign (resid 107 and name C or resid 77 and name C or resid 110 and name C) (resid 147 and name CB) 3.5 2.5 8.5 ! ?-?-L147CB: (119.779, 178.656, 42.642) D107C/A77C/D110C
assign (resid 88 and name C or resid 106 C) (resid 41 and name CG or resid 26 and name CE1) 3.5 2.5 8.5 ! T89N-V88C-?: (120.308, 175.768, 130.859) orS106C_H41CG/F26CE1
assign (resid 149 and name CA) (resid 109 and name CD) 3.5 2.5 8.5 ! G149N-G149CA-R109CD: (105.793, 45.249, 43.114)
我有嘗試了很多perl解決方案,但我被卡住了。我能夠與the following perl script第一風格剋制在回答jaypal建議轉換爲my previous question:
#!/usr/bin/perl
use strict;
use warnings;
use autodie;
#
open my $fh, '<', $ARGV[0];
while (<$fh>) {
my @values = map { /.(\d+)(\w+)/; $1, $2 } split '/', (split)[-1];
my ($resid, $name) = /^[^-]+-.(\d+)(\w+)-/;
print "assign (resid $resid and name $name) (";
print join (" or ",
map { "resid $values[$_] and name $values[$_ + 1]" }
grep { not $_ % 2 } 0 .. $#values
);
print ") 3.5 2.5 8.5 ! $_";
}
Perl是首選,但是Python和awk有其他想法我有這個。請幫忙,我有一個巨大的剋制文件。
你將有很多關於該部分輸入你想翻譯成什麼,而當更具體。看起來你也有一些不平凡的邏輯。 – TLP 2014-09-12 18:47:56
'(not)'語句是實驗預測,但是限制仍然需要在'!'之前打印。這些都是我擁有的4種限制的例子。用我的Perl代碼將第一種樣式限制轉換爲輸出的第一行。但其他三種剋制風格需要轉換爲相應的輸出。 (在這種情況下,與輸出的第2行輸出一樣)。我需要讓腳本確定樣式,然後對它讀取的每一行進行適當的轉換。 – PhysicalChemist 2014-09-12 19:21:03
你需要更徹底地打破你的問題,因爲大多數人閱讀它不會知道區分約束類型的是什麼 - 你已經給出了每種約束和沒有描述的例子。如果你已經設法處理一種剋制,我相信你可以做其他的事情,或者至少做一個有教養的嘗試,你可以請求其他人幫忙完成。 – 2014-09-12 19:51:19