update new files
[unres.git] / source / unres / src_MD-M-SAXS / readpdb.F.safe
1       subroutine readpdb
2 C Read the PDB file and convert the peptide geometry into virtual-chain 
3 C geometry.
4       implicit real*8 (a-h,o-z)
5       include 'DIMENSIONS'
6       include 'COMMON.LOCAL'
7       include 'COMMON.VAR'
8       include 'COMMON.CHAIN'
9       include 'COMMON.INTERACT'
10       include 'COMMON.IOUNITS'
11       include 'COMMON.GEO'
12       include 'COMMON.NAMES'
13       include 'COMMON.CONTROL'
14       include 'COMMON.DISTFIT'
15       include 'COMMON.SETUP'
16       include 'COMMON.SBRIDGE'
17       character*3 seq,atom,res
18       character*80 card
19       dimension sccor(3,20)
20       double precision e1(3),e2(3),e3(3)
21       integer rescode,iterter(maxres),cou
22       logical fail
23       bfac=0.0d0
24       do i=1,maxres
25          iterter(i)=0
26       enddo
27       ibeg=1
28       lsecondary=.false.
29       nhfrag=0
30       nbfrag=0
31       do
32         read (ipdbin,'(a80)',end=10) card
33         if (card(:5).eq.'HELIX') then
34          nhfrag=nhfrag+1
35          lsecondary=.true.
36          read(card(22:25),*) hfrag(1,nhfrag)
37          read(card(34:37),*) hfrag(2,nhfrag)
38         endif
39         if (card(:5).eq.'SHEET') then
40          nbfrag=nbfrag+1
41          lsecondary=.true.
42          read(card(24:26),*) bfrag(1,nbfrag)
43          read(card(35:37),*) bfrag(2,nbfrag)
44 crc----------------------------------------
45 crc  to be corrected !!!
46          bfrag(3,nbfrag)=bfrag(1,nbfrag)
47          bfrag(4,nbfrag)=bfrag(2,nbfrag)
48 crc----------------------------------------
49         endif
50         if (card(:3).eq.'END') then
51           goto 10
52         else if (card(:3).eq.'TER') then
53 C End current chain
54           ires_old=ires+2
55           itype(ires_old-1)=ntyp1 
56           iterter(ires_old-1)=1
57           itype(ires_old)=ntyp1
58           iterter(ires_old)=1
59           ibeg=2
60           write (iout,*) "Chain ended",ires,ishift,ires_old
61           if (unres_pdb) then
62             do j=1,3
63               dc(j,ires)=sccor(j,iii)
64             enddo
65           else 
66             call sccenter(ires,iii,sccor)
67           endif
68         endif
69 C Fish out the ATOM cards.
70         if (index(card(1:4),'ATOM').gt.0) then  
71           read (card(14:16),'(a3)') atom
72           if (atom.eq.'CA' .or. atom.eq.'CH3') then
73 C Calculate the CM of the preceding residue.
74             if (ibeg.eq.0) then
75               if (unres_pdb) then
76                 do j=1,3
77                   dc(j,ires+nres)=sccor(j,iii)
78                 enddo
79               else
80                 call sccenter(ires,iii,sccor)
81               endif
82             endif
83 C Start new residue.
84 c            write (iout,'(a80)') card
85             read (card(23:26),*) ires
86             read (card(18:20),'(a3)') res
87             if (ibeg.eq.1) then
88               ishift=ires-1
89               if (res.ne.'GLY' .and. res.ne. 'ACE') then
90                 ishift=ishift-1
91                 itype(1)=ntyp1
92               endif
93 c              write (iout,*) "ires",ires," ibeg",ibeg," ishift",ishift
94               ibeg=0          
95             else if (ibeg.eq.2) then
96 c Start a new chain
97               ishift=-ires_old+ires-1
98 c              write (iout,*) "New chain started",ires,ishift
99               ibeg=0
100             endif
101             ires=ires-ishift
102 c            write (2,*) "ires",ires," ishift",ishift
103             if (res.eq.'ACE') then
104               itype(ires)=10
105             else
106               itype(ires)=rescode(ires,res,0)
107             endif
108             read(card(31:54),'(3f8.3)') (c(j,ires),j=1,3)
109             read(card(61:66),*) bfac(ires)
110             if(me.eq.king.or..not.out1file)
111      &       write (iout,'(2i3,2x,a,3f8.3)') 
112      &       ires,itype(ires),res,(c(j,ires),j=1,3)
113             iii=1
114             do j=1,3
115               sccor(j,iii)=c(j,ires)
116             enddo
117           else if (atom.ne.'O  '.and.atom(1:1).ne.'H' .and. 
118      &             atom.ne.'N  ' .and. atom.ne.'C   ') then
119             iii=iii+1
120             read(card(31:54),'(3f8.3)') (sccor(j,iii),j=1,3)
121           endif
122         endif
123       enddo
124    10 if(me.eq.king.or..not.out1file) 
125      & write (iout,'(a,i5)') ' Nres: ',ires
126 C Calculate dummy residue coordinates inside the "chain" of a multichain
127 C system
128       nres=ires
129       do i=2,nres-1
130         write (iout,*) i,itype(i),itype(i+1)
131         if (itype(i).eq.ntyp1.and.iterter(i).eq.1) then
132          if (itype(i+1).eq.ntyp1.and.iterter(i+1).eq.1 ) then
133 C 16/01/2014 by Adasko: Adding to dummy atoms in the chain
134 C first is connected prevous chain (itype(i+1).eq.ntyp1)=true
135 C second dummy atom is conected to next chain itype(i+1).eq.ntyp1=false
136            if (unres_pdb) then
137 C 2/15/2013 by Adam: corrected insertion of the last dummy residue
138             print *,i,'tu dochodze'
139             call refsys(i-3,i-2,i-1,e1,e2,e3,fail)
140             if (fail) then
141               e2(1)=0.0d0
142               e2(2)=1.0d0
143               e2(3)=0.0d0
144             endif !fail
145             print *,i,'a tu?'
146             do j=1,3
147              c(j,i)=c(j,i-1)-1.9d0*e2(j)
148             enddo
149            else   !unres_pdb
150            do j=1,3
151              dcj=(c(j,i-2)-c(j,i-3))/2.0
152             if (dcj.eq.0) dcj=1.23591524223
153              c(j,i)=c(j,i-1)+dcj
154              c(j,nres+i)=c(j,i)
155            enddo     
156           endif   !unres_pdb
157          else     !itype(i+1).eq.ntyp1
158           if (unres_pdb) then
159 C 2/15/2013 by Adam: corrected insertion of the first dummy residue
160             call refsys(i+1,i+2,i+3,e1,e2,e3,fail)
161             if (fail) then
162               e2(1)=0.0d0
163               e2(2)=1.0d0
164               e2(3)=0.0d0
165             endif
166             do j=1,3
167               c(j,i)=c(j,i+1)-1.9d0*e2(j)
168             enddo
169           else !unres_pdb
170            do j=1,3
171             dcj=(c(j,i+3)-c(j,i+2))/2.0
172             if (dcj.eq.0) dcj=1.23591524223
173             c(j,i)=c(j,i+1)-dcj
174             c(j,nres+i)=c(j,i)
175            enddo
176           endif !unres_pdb
177          endif !itype(i+1).eq.ntyp1
178         endif  !itype.eq.ntyp1
179       enddo
180 C Calculate the CM of the last side chain.
181       if (unres_pdb) then
182         do j=1,3
183           dc(j,ires)=sccor(j,iii)
184         enddo
185       else 
186         call sccenter(ires,iii,sccor)
187       endif
188       nsup=nres
189       nstart_sup=1
190       if (itype(nres).ne.10) then
191         nres=nres+1
192         itype(nres)=ntyp1
193         if (unres_pdb) then
194 C 2/15/2013 by Adam: corrected insertion of the last dummy residue
195           call refsys(nres-3,nres-2,nres-1,e1,e2,e3,fail)
196           if (fail) then
197             e2(1)=0.0d0
198             e2(2)=1.0d0
199             e2(3)=0.0d0
200           endif
201           do j=1,3
202             c(j,nres)=c(j,nres-1)-1.9d0*e2(j)
203           enddo
204         else
205         do j=1,3
206           dcj=(c(j,nres-2)-c(j,nres-3))/2.0
207             if (dcj.eq.0) dcj=1.23591524223
208           c(j,nres)=c(j,nres-1)+dcj
209           c(j,2*nres)=c(j,nres)
210         enddo
211         endif
212       endif
213       do i=2,nres-1
214         do j=1,3
215           c(j,i+nres)=dc(j,i)
216         enddo
217       enddo
218       do j=1,3
219         c(j,nres+1)=c(j,1)
220         c(j,2*nres)=c(j,nres)
221       enddo
222       if (itype(1).eq.ntyp1) then
223         nsup=nsup-1
224         nstart_sup=2
225         if (unres_pdb) then
226 C 2/15/2013 by Adam: corrected insertion of the first dummy residue
227           call refsys(2,3,4,e1,e2,e3,fail)
228           if (fail) then
229             e2(1)=0.0d0
230             e2(2)=1.0d0
231             e2(3)=0.0d0
232           endif
233           do j=1,3
234             c(j,1)=c(j,2)-1.9d0*e2(j)
235           enddo
236         else
237         do j=1,3
238           dcj=(c(j,4)-c(j,3))/2.0
239           c(j,1)=c(j,2)-dcj
240           c(j,nres+1)=c(j,1)
241         enddo
242         endif
243       endif
244 C Calculate internal coordinates.
245       if(me.eq.king.or..not.out1file)then
246        do ires=1,nres
247         write (iout,'(2i3,2x,a,3f8.3,5x,3f8.3)') 
248      &    ires,itype(ires),restyp(itype(ires)),(c(j,ires),j=1,3),
249      &    (c(j,nres+ires),j=1,3)
250        enddo
251       endif
252 C      print *,"before int_from_cart"
253       call int_from_cart(.true.,.false.)
254       call sc_loc_geom(.true.)
255       do i=1,nres
256         thetaref(i)=theta(i)
257         phiref(i)=phi(i)
258       enddo
259       do i=1,nres-1
260         do j=1,3
261           dc(j,i)=c(j,i+1)-c(j,i)
262           dc_norm(j,i)=dc(j,i)*vbld_inv(i+1)
263         enddo
264       enddo
265       do i=2,nres-1
266         do j=1,3
267           dc(j,i+nres)=c(j,i+nres)-c(j,i)
268           dc_norm(j,i+nres)=dc(j,i+nres)*vbld_inv(i+nres)
269         enddo
270 c        write (iout,*) i,(dc(j,i+nres),j=1,3),(dc_norm(j,i+nres),j=1,3),
271 c     &   vbld_inv(i+nres)
272       enddo
273 c      call chainbuild
274 C Copy the coordinates to reference coordinates
275 C Splits to single chain if occurs
276       kkk=1
277       lll=0
278       cou=1
279       do i=1,nres
280       lll=lll+1
281 cc      write (iout,*) "spraw lancuchy",(c(j,i),j=1,3)
282       if (i.gt.1) then
283       if ((itype(i-1).eq.ntyp1).and.(i.gt.2)) then
284       chain_length=lll-1
285       kkk=kkk+1
286 c       write (iout,*) "spraw lancuchy",(c(j,i),j=1,3)
287       lll=1
288       endif
289       endif
290         do j=1,3
291           cref(j,i,cou)=c(j,i)
292           cref(j,i+nres,cou)=c(j,i+nres)
293           if (i.le.nres) then
294           chain_rep(j,lll,kkk)=c(j,i)
295           chain_rep(j,lll+nres,kkk)=c(j,i+nres)
296           endif
297          enddo
298       enddo
299       write (iout,*) chain_length
300       if (chain_length.eq.0) chain_length=nres
301       do j=1,3
302       chain_rep(j,chain_length,symetr)=chain_rep(j,chain_length,1)
303       chain_rep(j,chain_length+nres,symetr)
304      &=chain_rep(j,chain_length+nres,1)
305       enddo
306 c diagnostic
307 c       write (iout,*) "spraw lancuchy",chain_length,symetr
308 c       do i=1,4
309 c         do kkk=1,chain_length
310 c           write (iout,*) itype(kkk),(chain_rep(j,kkk,i), j=1,3)
311 c         enddo
312 c        enddo
313 c enddiagnostic       
314 C makes copy of chains
315       nperm=1
316       write (iout,*) "symetr", symetr
317        
318       if (symetr.gt.1) then
319        call permut(symetr)
320        nperm=1
321        do i=1,symetr
322        nperm=nperm*i
323        enddo
324        do i=1,nperm
325        write(iout,*) (tabperm(i,kkk),kkk=1,4)
326        enddo
327        do i=1,nperm
328         cou=0
329         do kkk=1,symetr
330          icha=tabperm(i,kkk)
331 c         write (iout,*) i,icha
332          do lll=1,chain_length
333           cou=cou+1
334            if (cou.le.nres) then
335            do j=1,3
336             kupa=mod(lll,chain_length)
337             iprzes=(kkk-1)*chain_length+lll
338             if (kupa.eq.0) kupa=chain_length
339 c            write (iout,*) "kupa", kupa
340             cref(j,iprzes,i)=chain_rep(j,kupa,icha)
341             cref(j,iprzes+nres,i)=chain_rep(j,kupa+nres,icha)
342           enddo
343           endif
344          enddo
345         enddo
346        enddo
347        endif
348 C-koniec robienia kopii
349 c diag
350       do kkk=1,nperm
351       write (iout,*) "nowa struktura", nperm
352       do i=1,nres
353         write (iout,110) restyp(itype(i)),i,cref(1,i,kkk),
354      &cref(2,i,kkk),
355      &cref(3,i,kkk),cref(1,nres+i,kkk),
356      &cref(2,nres+i,kkk),cref(3,nres+i,kkk)
357       enddo
358   100 format (//'              alpha-carbon coordinates       ',
359      &          '     centroid coordinates'/
360      1          '       ', 6X,'X',11X,'Y',11X,'Z',
361      &                          10X,'X',11X,'Y',11X,'Z')
362   110 format (a,'(',i3,')',6f12.5)
363       
364       enddo
365 cc enddiag
366       do j=1,nbfrag     
367         do i=1,4                                                       
368          bfrag(i,j)=bfrag(i,j)-ishift
369         enddo
370       enddo
371
372       do j=1,nhfrag
373         do i=1,2
374          hfrag(i,j)=hfrag(i,j)-ishift
375         enddo
376       enddo
377       return
378       end
379 c---------------------------------------------------------------------------
380       subroutine int_from_cart(lside,lprn)
381       implicit real*8 (a-h,o-z)
382       include 'DIMENSIONS'
383 #ifdef MPI
384       include "mpif.h"
385 #endif 
386       include 'COMMON.LOCAL'
387       include 'COMMON.VAR'
388       include 'COMMON.CHAIN'
389       include 'COMMON.INTERACT'
390       include 'COMMON.IOUNITS'
391       include 'COMMON.GEO'
392       include 'COMMON.NAMES'
393       include 'COMMON.CONTROL'
394       include 'COMMON.SETUP'
395       character*3 seq,atom,res
396       character*80 card
397       dimension sccor(3,20)
398       integer rescode
399       logical lside,lprn
400 #ifdef MPI
401       if(me.eq.king.or..not.out1file)then
402 #endif
403        if (lprn) then 
404         write (iout,'(/a)') 
405      &  'Internal coordinates calculated from crystal structure.'
406         if (lside) then 
407           write (iout,'(8a)') '  Res  ','       dvb','     Theta',
408      & '       Phi','    Dsc_id','       Dsc','     Alpha',
409      & '     Omega'
410         else 
411           write (iout,'(4a)') '  Res  ','       dvb','     Theta',
412      & '       Phi'
413         endif
414        endif
415 #ifdef MPI
416       endif
417 #endif
418       do i=1,nres-1
419         iti=itype(i)
420         if (iti.ne.ntyp1 .and. itype(i+1).ne.ntyp1 .and. 
421      &      (dist(i,i+1).lt.2.0D0 .or. dist(i,i+1).gt.5.0D0)) then
422           write (iout,'(a,i4)') 'Bad Cartesians for residue',i
423 ctest          stop
424         endif
425         vbld(i+1)=dist(i,i+1)
426         vbld_inv(i+1)=1.0d0/vbld(i+1)
427         if (i.gt.1) theta(i+1)=alpha(i-1,i,i+1)
428         if (i.gt.2) phi(i+1)=beta(i-2,i-1,i,i+1)
429       enddo
430 c      if (unres_pdb) then
431 c        if (itype(1).eq.21) then
432 c          theta(3)=90.0d0*deg2rad
433 c          phi(4)=180.0d0*deg2rad
434 c          vbld(2)=3.8d0
435 c          vbld_inv(2)=1.0d0/vbld(2)
436 c        endif
437 c        if (itype(nres).eq.21) then
438 c          theta(nres)=90.0d0*deg2rad
439 c          phi(nres)=180.0d0*deg2rad
440 c          vbld(nres)=3.8d0
441 c          vbld_inv(nres)=1.0d0/vbld(2)
442 c        endif
443 c      endif
444 c      print *,"A TU2"
445       if (lside) then
446         do i=2,nres-1
447           do j=1,3
448             c(j,maxres2)=0.5D0*(2*c(j,i)+(c(j,i-1)-c(j,i))*vbld_inv(i)
449      &     +(c(j,i+1)-c(j,i))*vbld_inv(i+1))
450           enddo
451           iti=itype(i)
452           di=dist(i,nres+i)
453           vbld(i+nres)=di
454           if (itype(i).ne.10) then
455             vbld_inv(i+nres)=1.0d0/di
456           else
457             vbld_inv(i+nres)=0.0d0
458           endif
459           if (iti.ne.10) then
460             alph(i)=alpha(nres+i,i,maxres2)
461             omeg(i)=beta(nres+i,i,maxres2,i+1)
462           endif
463           if(me.eq.king.or..not.out1file)then
464            if (lprn)
465      &     write (iout,'(a3,i4,7f10.3)') restyp(iti),i,vbld(i),
466      &     rad2deg*theta(i),rad2deg*phi(i),dsc(iti),vbld(nres+i),
467      &     rad2deg*alph(i),rad2deg*omeg(i)
468           endif
469         enddo
470       else if (lprn) then
471         do i=2,nres
472           iti=itype(i)
473           if(me.eq.king.or..not.out1file)
474      &     write (iout,'(a3,i4,7f10.3)') restyp(iti),i,dist(i,i-1),
475      &     rad2deg*theta(i),rad2deg*phi(i)
476         enddo
477       endif
478       return
479       end
480 c-------------------------------------------------------------------------------
481       subroutine sc_loc_geom(lprn)
482       implicit real*8 (a-h,o-z)
483       include 'DIMENSIONS'
484 #ifdef MPI
485       include "mpif.h"
486 #endif 
487       include 'COMMON.LOCAL'
488       include 'COMMON.VAR'
489       include 'COMMON.CHAIN'
490       include 'COMMON.INTERACT'
491       include 'COMMON.IOUNITS'
492       include 'COMMON.GEO'
493       include 'COMMON.NAMES'
494       include 'COMMON.CONTROL'
495       include 'COMMON.SETUP'
496       double precision x_prime(3),y_prime(3),z_prime(3)
497       logical lprn
498       do i=1,nres-1
499         do j=1,3
500           dc_norm(j,i)=vbld_inv(i+1)*(c(j,i+1)-c(j,i))
501         enddo
502       enddo
503       do i=2,nres-1
504         if (itype(i).ne.10 .and. itype(i).ne.ntyp1) then
505           do j=1,3
506             dc_norm(j,i+nres)=vbld_inv(i+nres)*(c(j,i+nres)-c(j,i))
507           enddo
508         else
509           do j=1,3
510             dc_norm(j,i+nres)=0.0d0
511           enddo
512         endif
513       enddo
514       do i=2,nres-1
515         costtab(i+1) =dcos(theta(i+1))
516         sinttab(i+1) =dsqrt(1-costtab(i+1)*costtab(i+1))
517         cost2tab(i+1)=dsqrt(0.5d0*(1.0d0+costtab(i+1)))
518         sint2tab(i+1)=dsqrt(0.5d0*(1.0d0-costtab(i+1)))
519         cosfac2=0.5d0/(1.0d0+costtab(i+1))
520         cosfac=dsqrt(cosfac2)
521         sinfac2=0.5d0/(1.0d0-costtab(i+1))
522         sinfac=dsqrt(sinfac2)
523         it=itype(i)
524         if (it.ne.10 .and. itype(i).ne.ntyp1) then
525 c
526 C  Compute the axes of tghe local cartesian coordinates system; store in
527 c   x_prime, y_prime and z_prime 
528 c
529         do j=1,3
530           x_prime(j) = 0.00
531           y_prime(j) = 0.00
532           z_prime(j) = 0.00
533         enddo
534         do j = 1,3
535           x_prime(j) = (dc_norm(j,i) - dc_norm(j,i-1))*cosfac
536           y_prime(j) = (dc_norm(j,i) + dc_norm(j,i-1))*sinfac
537         enddo
538         call vecpr(x_prime,y_prime,z_prime)
539 c
540 C Transform the unit vector of the ith side-chain centroid, dC_norm(*,i),
541 C to local coordinate system. Store in xx, yy, zz.
542 c
543         xx=0.0d0
544         yy=0.0d0
545         zz=0.0d0
546         do j = 1,3
547           xx = xx + x_prime(j)*dc_norm(j,i+nres)
548           yy = yy + y_prime(j)*dc_norm(j,i+nres)
549           zz = zz + z_prime(j)*dc_norm(j,i+nres)
550         enddo
551
552         xxref(i)=xx
553         yyref(i)=yy
554         zzref(i)=zz
555         else
556         xxref(i)=0.0d0
557         yyref(i)=0.0d0
558         zzref(i)=0.0d0
559         endif
560       enddo
561       if (lprn) then
562         do i=2,nres
563           iti=itype(i)
564 #ifdef MPI
565           if(me.eq.king.or..not.out1file)
566      &     write (iout,'(a3,i4,3f10.5)') restyp(iti),i,xxref(i),
567      &      yyref(i),zzref(i)
568 #else
569           write (iout,'(a3,i4,3f10.5)') restyp(iti),i,xxref(i),yyref(i),
570      &     zzref(i)
571 #endif
572         enddo
573       endif
574       return
575       end
576 c---------------------------------------------------------------------------
577       subroutine sccenter(ires,nscat,sccor)
578       implicit real*8 (a-h,o-z)
579       include 'DIMENSIONS'
580       include 'COMMON.CHAIN'
581       dimension sccor(3,20)
582       do j=1,3
583         sccmj=0.0D0
584         do i=1,nscat
585           sccmj=sccmj+sccor(j,i) 
586         enddo
587         dc(j,ires)=sccmj/nscat
588       enddo
589       return
590       end
591 c---------------------------------------------------------------------------
592       subroutine bond_regular
593       implicit real*8 (a-h,o-z)
594       include 'DIMENSIONS'   
595       include 'COMMON.VAR'
596       include 'COMMON.LOCAL'      
597       include 'COMMON.CALC'
598       include 'COMMON.INTERACT'
599       include 'COMMON.CHAIN'
600       do i=1,nres-1
601        vbld(i+1)=vbl
602        vbld_inv(i+1)=1.0d0/vbld(i+1)
603        vbld(i+1+nres)=dsc(iabs(itype(i+1)))
604        vbld_inv(i+1+nres)=dsc_inv(iabs(itype(i+1)))
605 c       print *,vbld(i+1),vbld(i+1+nres)
606       enddo
607       return
608       end
609