1 subroutine chain_symmetry(nchain,nres,itype,chain_border,
2 & chain_length,npermchain,tabpermchain)
4 c Determine chain symmetry. nperm is the number of permutations and
5 c tabperchain contains the allowed permutations of the chains.
9 include "DIMENSIONS.ZSCOPT"
10 include "COMMON.IOUNITS"
11 integer nchain,nres,itype(nres),chain_border(2,maxchain),
12 & chain_length(nchain),
13 & npermchain,tabpermchain(maxchain,maxperm),
14 & tabperm(maxchain,maxperm),
15 & iequiv(maxchain,maxres),iflag(maxres)
16 integer i,j,k,l,ii,nchain_group,nequiv(maxchain),iieq,
21 c print*,"npermchain",npermchain," tabpermchain",tabpermchain(1,1)
25 c Look for equivalent chains
28 write(iout,*) "nchain",nchain
30 write(iout,*) "chain",i," from",chain_border(1,i),
31 & " to",chain_border(2,i)
33 & "sequence ",(itype(j),j=chain_border(1,i),chain_border(2,i))
41 if (iflag(i).gt.0) cycle
43 nchain_group=nchain_group+1
45 iequiv(iieq,nchain_group)=i
47 if (iflag(j).gt.0.or.chain_length(i).ne.chain_length(j)) cycle
49 do while(k.lt.chain_length(i) .and.
50 & itype(chain_border(1,i)+k).eq.itype(chain_border(1,j)+k))
53 if (k.lt.chain_length(i)) cycle
56 iequiv(iieq,nchain_group)=j
58 nequiv(nchain_group)=iieq
60 write(iout,*) "Number of equivalent chain groups:",nchain_group
61 write(iout,*) "Equivalent chain groups"
63 write(iout,*) "group",i," #members",nequiv(i)," chains",
64 & (iequiv(j,i),j=1,nequiv(i))
68 call permut(nequiv(i),nperm,tabperm)
74 tabpermchain(k,j)=iequiv(tabperm(k,j),i)
79 npermchain=npermchain*nperm
85 tabpermchain(l,ind)=tabpermchain(l,j)
88 tabpermchain(ii+l,ind)=iequiv(tabperm(l,k),i)
95 write(iout,*) "Number of chain permutations",npermchain
96 write(iout,*) "Permutations"
98 write(iout,*) (tabpermchain(j,i),j=1,nchain)