2017-07-21 1 views
1

J'ai écrit mon script qui est montré ci-dessous, j'ai mentionné mon attendu et aussi j'ai mentionné l'erreur que je reçois. Quelqu'un peut-il m'aider?Multiple pour les boucles en utilisant tcl

Script:

for {set x 0} {$x <= 80} {incr x [expr {+20}]} { 
    puts "pdb ./$x.a.pdb;" 
    puts "pdb ./$x.b.pdb;" 
    puts "pdb ./$x.ab.pdb;" 
    for {set i 0} {$i < 15} {incr i} { 
     puts "A$x = [measure sasa 1.4 [atomselect $i "all"]] >> 1.dat" } 
    for {set j 1} {$j < 15} {incr j} { 
     puts "B$x = [measure sasa 1.4 [atomselect $j "all"]] >> 1.dat"} 
    for {set k 2} {$k < 15} {incr k} { 
     puts "AB$x = [measure sasa 1.4 [atomselect $k "all"]] >>1.dat"} 
} 

sortie que je reçois:

invalid command name "atomselect" 
    while executing 
"atomselect $i "all"" 
    ("for" body line 6) 
    invoked from within 
"for {set x 0} {$x <= 80} {incr x [expr {+20}]} { 
    puts "pdb ./$x.a.pdb;" 
    puts "pdb ./$x.b.pdb;" 
    puts "pdb ./$x.ab.pdb;" 
    for {set i 0} {$i < 15} {incr i..." 
    (file "try.tcl" line 1) 

Résultats escomptés:

pdb ./0.a.pdb; 
pdb ./0.b.pdb; 
pdb ./0.ab.pdb; 
A0 = [measure sasa 1.4 [atomselect 0 "all"]] >> 1.dat 
B0 = [measure sasa 1.4 [atomselect 1 "all"]] >> 1.dat 
AB0 = [measure sasa 1.4 [atomselect 2 "all"]] >> 1.dat 
pdb ./20.a.pdb; 
pdb ./20.b.pdb; 
pdb ./20.ab.pdb; 
A20 = [measure sasa 1.4 [atomselect 3 "all"]] >> 1.dat 
B20 = [measure sasa 1.4 [atomselect 4 "all"]] >> 1.dat 
AB20 = [measure sasa 1.4 [atomselect 5 "all"]] >> 1.dat 
pdb ./40.a.pdb; 
pdb ./40.b.pdb; 
pdb ./40.ab.pdb; 
A40 = [measure sasa 1.4 [atomselect 6 "all"]] >> 1.dat 
B40 = [measure sasa 1.4 [atomselect 7 "all"]] >> 1.dat 
AB40 = [measure sasa 1.4 [atomselect 8 "all"]] >> 1.dat 
pdb ./60.a.pdb; 
pdb ./60.b.pdb; 
pdb ./60.ab.pdb; 
A60 = [measure sasa 1.4 [atomselect 9 "all"]] >> 1.dat 
B60 = [measure sasa 1.4 [atomselect 10 "all"]] >> 1.dat 
AB60 = [measure sasa 1.4 [atomselect 11 "all"]] >> 1.dat 

Répondre

3

Les pour les boucles ne sont pas le problème ici: Les crochets sont Tcl de " commande substitution "syntaxe (comme les backticks ou $(...) dans le shell). Vous devez échapper aux crochets ouverts (et les citations internes)

puts "A$x = \[measure sasa 1.4 \[atomselect $i \"all\"]] >> 1.dat" 

ou utilisez la commande format

puts [format {A%d = [measure sasa 1.4 [atomselect %d "all"]] >> 1.dat} $x $i] 

je accolades dans le 2ème exemple pour afficher d'autres, non interpoler de Tcl, citations (comme les guillemets simples du shell).