c Program to explore secondary structures of protein sequences c LSTMOD 1-5-2010 character*1 AACID(1000),RA(21),secs(1000,5) character*1 cnatv(1000),cpsip(1000),csabl(1000),csecsc(1000) character*1000 SEQ,seq0,seq1,seq2,seq3 character*200 flname1,flname2,label real amh,ams,amt real sumh(1000),sums(1000),sumt(1000),coeff(3) real ha(280),sa(280),ta(280) integer mht,mst,mtt,IR(1000),DA(84) real sumhe,sumsh,sumtu,nh(1000),ns(1000),nc(1000) real delg(1000),deld(1000),dels(1000),dell(1000) c------------------------------------------------------------------------- data RA/'A','C','D','E','F','G','H','I','K','L','M', 1'N','P','Q','R','S','T','V','W','Y','Z'/ c data coeff/1.49,1.275,1.47/ ! 65.2% data coeff/1.40,1.10,1.70/ ! 65.2% data DA/0,0,2,1,0,1,2,0,0,0,1,2,1,0,0,2,0,0,0,3, 1 0,0,3,0,0,2,0,1,2,0,1,0,1,1,0,1,3,0,0,0, 2 1,0,1,1,0,2,1,0,2,0,0,1,1,2,0,0,2,1,0,0, 3 0,1,1,1,1,1,1,0,1,0,2,0,0,3,0,0,0,1,0,2, 4 0,0,0,0/ c--------------------------------------------------------------------------------- c print *,' ' c write(6,2007) c print *,'WELCOME TO PROTEIN SECONDARY STRUCTURE CHARACTERIZATION c 1 (PROSECSC)' 50 format(a1000) 60 format(a200) 1000 format(A80) 2000 format(80A1) c write(6,2007) c write(6,2003) c write(6,2007) c read(5,60)flname1 c flname1='casp9secsc.dat' c flname1='test1.dat' flname2='prosecsc.out' open(unit=10,file=''//flname1//'',form='formatted',status= 1 'old') open(unit=11,file=''//flname2//'',form='formatted',status= 1 'unknown') c c nfile=9999 c nfile=300 nfile=1 lfile=0 pr=0 do 4000 ifile=1,nfile tp=0 do k=1,1000 c cnatv(k)='-' cpsip(k)='-' c csabl(k)='-' csecsc(k)='-' end do read(10,1000)label if (label(1:1) .eq. '>')goto 19 if (label(1:1) .eq. '$')goto 6000 if (label(1:1) .eq. ' ')goto 6000 19 read(10,50,end=6000)SEQ c read(10,1000)label c if (label(1:1) .eq. '>')goto 16 c if (label(1:1) .ne. '>')goto 6000 c16 read(10,50)SEQ0 17 read(10,1000)label if (label(1:1) .eq. '>')goto 21 if (label(1:1) .ne. '>')goto 6000 21 read(10,50)SEQ1 c read(10,1000)label c if (label(1:1) .eq. '>')goto 23 c if (label(1:1) .ne. '>')goto 6000 c23 read(10,50)SEQ2 lfile=lfile+1 NAA=0 do 10 i=1,1000 if (seq(i:i) .eq. ' ')goto 10 NAA=NAA+1 AACID(NAA)=SEQ(i:i) c cnatv(NAA)=seq0(i:i) cpsip(NAA)=seq1(i:i) c csabl(NAA)=seq2(i:i) do 20 l=1,20 if (AACID(NAA) .eq. RA(l))IR(NAA)=l 20 continue 10 continue c mht=0 mst=0 mtt=0 c do k=1,1000 secs(k,4)='-' secs(k,5)='-' sumh(k)=0 sums(k)=0 sumt(k)=0 end do c do 4010 ij=2,NAA sumhe=0 sumsh=0 sumtu=0 ib=ij-3 c do 310 m=ij,ij+8 AMH=0 AMS=0 AMT=0 ib=ib+1 if (ib .ge. 10)ib=7 l=IR(m) j=(l-1)*14+ib AMH=AMH+HA(j) AMS=AMS+SA(j) AMT=AMT+TA(j) sumh(ij)=sumh(ij)+amh*coeff(1) sums(ij)=sums(ij)+ams*coeff(2) sumt(ij)=sumt(ij)+amt*coeff(3) 310 continue sumhe=sumhe+sumh(ij) sumsh=sumsh+sums(ij) sumtu=sumtu+sumt(ij) if (sumhe .gt. sumsh .and. sumhe .gt. sumtu)mht=mht+1 if (sumsh .gt. sumhe .and. sumsh .gt. sumtu)mst=mst+1 if (sumtu .gt. sumhe .and. sumtu .gt. sumsh)mtt=mtt+1 ijp=ij+2 if (mht .gt. mst .and. mht .gt. mtt)secs(ijp,4)='H' if (mst .gt. mht .and. mst .gt. mtt)secs(ijp,4)='E' 4010 continue c---------------------------------------------------- do k=1,NAA nh(k)=0 ns(k)=0 if (secs(k,4) .eq. 'H')nh(k)=nh(k)+1 if (secs(k,4) .eq. 'E')ns(k)=ns(k)+1 end do do k=1,NAA secs(k,5)='C' if (nh(k) .gt. ns(k))secs(k,5)='H' if (ns(k) .gt. nh(k))secs(k,5)='E' end do do 315 ij=4,NAA-4 d1b=0 d2b=0 d3b=0 d4b=0 d1f=0 d2f=0 d3f=0 d4f=0 delg(ij)=0 deld(ij)=0 dels(ij)=0 dell(ij)=0 do 320 mi=ij-3,ij l=IR(mi) j=(l-1)*4+1 d1b=d1b+DA(j) d2b=d2b+DA(j+1) d3b=d3b+DA(j+2) d4b=d4b+DA(j+3) 320 continue do 325 mi=ij+1,ij+4 l=IR(mi) j=(l-1)*4+1 d1f=d1f+DA(j) d2f=d2f+DA(j+1) d3f=d3f+DA(j+2) d4f=d4f+DA(j+3) 325 continue delg(ij)=d1f-d1b deld(ij)=d2f-d2b dels(ij)=d3f-d3b dell(ij)=d4f-d4b 315 continue do k=1,NAA nh(k)=0 ns(k)=0 nc(k)=0 end do do l =1,NAA csecsc(l)='C' csecsc(l)=cpsip(l) end do do l =1,NAA if (secs(l,5) .eq. 'E' .and. csecsc(l) .eq. 'H')csecsc(l)='E' if (secs(l,5) .eq. 'E' .and. csecsc(l) .eq. 'C')csecsc(l)='E' if (secs(l,5) .eq. 'H' .and. csecsc(l) .eq. 'E')csecsc(l)='H' end do c goto 6700 c do k=1,NAA c if (cpsip(k) .eq. 'H')nh(k)=nh(k)+2 c if (csabl(k) .eq. 'H')nh(k)=nh(k)+1 c if (secs(k,5) .eq. 'H')nh(k)=nh(k)+1 c if (cpsip(k) .eq. 'E')ns(k)=ns(k)+2 c if (csabl(k) .eq. 'E')ns(k)=ns(k)+1 c if (secs(k,5) .eq. 'E')ns(k)=ns(k)+1 c if (cpsip(k) .eq. 'C')nc(k)=nc(k)+2 c if (csabl(k) .eq. 'C')nc(k)=nc(k)+1 c if (secs(k,5) .eq. 'C')nc(k)=nc(k)+1 c end do c do k=1,NAA c if ((dels(k) .lt. 0 .and. delg(k) .le. 0).and. c 1 (deld(k) .gt. 0 .and. dell(k) .gt. 0))nh(k)=nh(k)+1 c if ((dels(k) .lt. 0 .and. delg(k) .ge. 0).and. c 1 (deld(k) .lt. 0 .and. dell(k) .lt. 0))ns(k)=ns(k)+1 c if ((dels(k) .gt. 0 .and. deld(k) .ge. 0).and. c 1 (delg(k) .le. 0 .and. dell(k) .lt. 0))nc(k)=nc(k)+1 c end do do k=1,NAA if (nh(k) .gt. ns(k) .and. nh(k) .gt. nc(k))csecsc(k)='H' if (ns(k) .gt. nh(k) .and. ns(k) .gt. nc(k))csecsc(k)='E' end do 6700 continue do j=4,NAA if (csecsc(j-3) .eq. 'H' .and. csecsc(j-2) .eq. 'H' .and. 1 csecsc(j-1) .eq. 'E' .and. 1 csecsc(j) .eq. 'E' ) then csecsc(j-3)='C' csecsc(j-2)='C' csecsc(j-1)='C' csecsc(j)='C' csecsc(j+1)='C' csecsc(j+2)='C' csecsc(j+3)='C' end if end do do j=4,NAA if (csecsc(j-3) .eq. 'E' .and. csecsc(j-2) .eq. 'E' .and. 1 csecsc(j-1) .eq. 'H' .and. 1 csecsc(j) .eq. 'H' ) then csecsc(j-2)='C' csecsc(j+1)='H' csecsc(j+2)='H' csecsc(j+3)='H' end if end do do j=4,NAA-3 if (csecsc(j-3) .eq. 'H' .and. csecsc(j-2) .eq. 'H' .and. 1 csecsc(j-1) .eq. 'H' .and. 1 csecsc(j) .eq. 'C' .and. csecsc(j+1) .eq. 'H' .and. 1 csecsc(j+2) .eq. 'H' .and. csecsc(j+3) .eq. 'H')then csecsc(j+1)='C' end if end do do j=2,NAA-1 if (csecsc(j-1) .eq. 'C' .and. 1 csecsc(j) .eq. 'E' .and. csecsc(j+1) .eq. 'H' )then csecsc(j)='C' end if end do do j=2,NAA-1 if (csecsc(j-1) .eq. 'C' .and. 1 csecsc(j) .eq. 'H' .and. csecsc(j+1) .eq. 'E' )then csecsc(j)='C' end if end do do j=2,NAA-2 if (csecsc(j-1) .eq. 'C' .and. 1 csecsc(j) .eq. 'H' .and. csecsc(j+1) .eq. 'H' .and. 1 csecsc(j+2) .eq. 'C')then csecsc(j)='C' csecsc(j+1)='C' end if end do do j=2,NAA-3 if (csecsc(j-1) .eq. 'C' .and. 1 csecsc(j) .eq. 'H' .and. csecsc(j+1) .eq. 'H' .and. 1 csecsc(j+2) .eq. 'H' .and. csecsc(j+3) .eq. 'C')then csecsc(j-1)='H' csecsc(j+3)='H' csecsc(j-2)='C' end if end do c do j=2,NAA-3 c if (csecsc(j-1) .eq. 'E' .and. c 1 csecsc(j) .eq. 'C' .and. csecsc(j+1) .eq. 'E' .and. c 1 csecsc(j+2) .eq. 'E' .and. csecsc(j+3) .eq. 'C')then c csecsc(j-1)='E' c csecsc(j+3)='E' c csecsc(j)='E' c end if c end do do j=2,NAA-1 if (csecsc(j-1) .eq. 'C' .and. 1 csecsc(j) .eq. 'H' .and. csecsc(j+1) .eq. 'C' )then csecsc(j)='C' end if end do do j=2,NAA-1 if (csecsc(j-1) .eq. 'C' .and. 1 csecsc(j) .eq. 'S' .and. csecsc(j+1) .eq. 'C' )then csecsc(j)='C' end if end do c c do j=1,NAA-1 c csecsc(NAA-j)=csecsc(NAA-j-1) c end do c csecsc(1)='C' c csecsc(2)='C' c csecsc(NAA)='C' c------------------------------------- 6800 continue c------------------------------------- label='>' c write(6,1000)label c write(6,2005)(AACID(k),k=1,NAA) c write(6,2005)(cnatv(k),k=1,NAA) c write(6,2005)(cpsip(k),k=1,NAA) c write(6,2005)(csabl(k),k=1,NAA) c write(6,2005)(secs(k,5),k=1,NAA) c write(6,2005)(csecsc(k),k=1,NAA) write(11,1000)label write(11,2005)(AACID(k),k=1,NAA) write(11,1000)label c write(11,2005)(cnatv(k),k=1,NAA) c write(11,2005)(cpsip(k),k=1,NAA) c write(11,2005)(csabl(k),k=1,NAA) c write(11,2005)(secs(k,5),k=1,NAA) write(11,2005)(csecsc(k),k=1,NAA) write(11,1000)label 6900 continue mtrue=0 c do i=1,NAA c if (cnatv(i) .eq. secs(i,5))mtrue=mtrue+1 c if (cnatv(i) .eq. cpsip(i))mtrue=mtrue+1 c if (cnatv(i) .eq. csabl(i))mtrue=mtrue+1 c if (cnatv(i) .eq. csecsc(i))mtrue=mtrue+1 c end do c tp= float(mtrue)*100/float(NAA) 4001 continue 4002 continue c print *,' Prediction success rate =',tp c write(11,*)' Prediction success rate =',tp c pr=pr+tp 4000 continue 6000 continue c print *,' Total Number of Sequences=',lfile c pr=pr/float(lfile) c print *,'*********' c print *,' overall Prediction success rate =',pr c print *,'*********' c write(11,*)'*********' c write(11,*)' Total Number of Sequences=',lfile c write(11,*)' Overall Prediction success rate =',pr c write(11,*)'*********' c 2005 format (1000(a)) 2003 format(' Protein Secondary Structure Characterization: ',/, 1 ' This Program identifies a query sequence', 2 ' as a Helix or a Sheet or a Turn. ',/, 3 ' The program requires 5 flanking residues on either side', 4 ' of the query sequence',/, 4 ' in the input for better results. ',/, 5 ' The accuracy is 72% (q3) are higher if the query sequence is', 6 ' 4 residues or longer.',/) 2007 format('********************************************************* 1**********************') c write(6,2007) close(10) close(11) c stop#1 c--------------------------------------------------------------------------- data HA/144.225, 144.650, 126.442, 109.657, 190.575, 189.759, 1 188.944, 243.093, 207.139, 210.949, 177.151, 111.613, 1 130.653, 133.601, 1 28.240, 29.131, 25.087, 23.138, 17.801, 20.080, 1 24.120, 29.131, 24.132, 25.113, 32.209, 23.127, 1 22.110, 21.094, 1 115.985, 116.524, 156.547, 238.430, 129.842, 176.706, 1 149.748, 98.442, 100.553, 102.461, 99.647, 127.702, 1 135.678, 142.641, 1 126.071, 123.556, 105.368, 106.639, 124.607, 303.212, 1 203.015, 159.718, 196.078, 169.763, 121.791, 100.553, 1 125.628, 138.623, 1 84.720, 82.370, 77.270, 51.307, 73.298, 65.261, 1 91.457, 84.379, 70.387, 89.402, 86.562, 63.348, 1 77.386, 76.343, 1 178.517, 207.935, 180.632, 172.032, 114.136, 107.429, 1 89.447, 75.339, 60.331, 64.289, 241.570, 326.797, 1 183.919, 147.664, 1 51.437, 51.230, 46.161, 52.313, 41.884, 48.192, 1 46.231, 40.180, 49.270, 54.244, 59.386, 53.293, 1 49.246, 46.207, 1 108.925, 104.470, 99.347, 49.295, 89.005, 66.265, 1 102.512, 114.515, 112.619, 80.361, 76.497, 71.392, 1 104.522, 104.470, 1 108.925, 101.456, 93.326, 86.519, 124.607, 116.465, 1 107.537, 128.578, 165.912, 159.718, 132.863, 130.718, 1 133.668, 127.574, 1 171.457, 167.754, 181.635, 107.645, 176.963, 129.518, 1 207.035, 265.193, 238.310, 255.148, 206.341, 139.768, 1 165.829, 154.696, 1 38.325, 36.162, 42.147, 22.132, 33.507, 30.120, 1 43.216, 52.235, 45.248, 47.212, 45.294, 29.160, 1 31.155, 29.131, 1 86.737, 92.415, 112.393, 149.899, 54.450, 78.313, 1 72.361, 61.275, 66.365, 92.415, 123.804, 119.658, 1 95.477, 91.411, 1 108.925, 122.551, 124.435, 179.074, 230.366, 81.325, 1 42.211, 74.334, 50.276, 20.090, 3.019, 157.868, 1 160.804, 170.768, 1 69.591, 65.293, 58.203, 54.325, 76.439, 91.365, 1 107.537, 75.339, 91.503, 92.415, 88.575, 74.409, 1 67.336, 63.284, 1 101.865, 87.393, 82.288, 74.446, 98.429, 92.369, 1 93.467, 114.515, 131.724, 123.556, 111.726, 100.553, 1 95.477, 91.411, 1 125.063, 126.569, 152.533, 221.327, 123.560, 136.546, 1 96.482, 99.447, 111.613, 126.569, 132.863, 120.663, 1 113.567, 119.537, 1 113.968, 114.515, 131.460, 169.014, 85.863, 92.369, 1 99.497, 69.311, 77.425, 94.424, 82.536, 92.508, 1 94.472, 109.492, 1 139.183, 130.587, 119.417, 63.380, 108.900, 89.357, 1 132.663, 110.497, 111.613, 86.388, 82.536, 83.459, 1 120.603, 137.619, 1 28.240, 24.108, 25.087, 20.120, 38.743, 29.116, 1 30.150, 37.167, 28.154, 26.117, 20.130, 17.094, 1 25.125, 25.113, 1 69.591, 71.320, 60.210, 49.295, 67.015, 56.224, 1 72.361, 67.302, 61.337, 79.357, 75.490, 56.309, 1 67.336, 69.311/ data SA/124.623, 130.784, 121.730, 116.582, 118.712, 127.510, 1 138.763, 131.592, 130.718, 120.603, 112.506, 142.713, 1 134.605, 130.653, 1 23.115, 22.132, 24.144, 32.160, 39.235, 39.156, 1 40.221, 36.162, 41.226, 41.206, 40.180, 36.180, 1 26.117, 22.110, 1 159.798, 163.983, 182.092, 46.231, 46.277, 60.240, 1 82.453, 68.307, 46.254, 40.201, 139.628, 175.879, 1 194.876, 189.949, 1 144.723, 128.772, 108.651, 106.532, 84.507, 85.341, 1 87.481, 92.415, 81.447, 100.502, 97.438, 98.492, 1 135.610, 154.773, 1 55.276, 49.295, 57.344, 107.537, 116.700, 118.473, 1 108.597, 102.461, 125.691, 127.638, 103.465, 62.311, 1 43.194, 55.276, 1 233.165, 384.305, 274.647, 128.643, 62.374, 95.381, 1 125.691, 149.673, 111.613, 84.422, 93.420, 236.180, 1 276.243, 240.201, 1 49.246, 44.265, 47.283, 48.241, 38.229, 44.176, 1 41.226, 38.171, 39.215, 43.216, 54.244, 51.256, 1 44.198, 54.271, 1 63.316, 60.362, 66.398, 176.884, 229.376, 212.851, 1 180.995, 184.831, 215.183, 219.095, 156.705, 77.386, 1 46.207, 59.296, 1 145.728, 124.748, 134.808, 132.663, 83.500, 74.297, 1 75.414, 94.424, 74.409, 91.457, 86.388, 95.477, 1 104.470, 121.608, 1 111.557, 85.513, 94.567, 173.869, 234.406, 234.939, 1 213.172, 201.908, 223.227, 217.085, 173.782, 149.748, 1 79.357, 97.487, 1 24.120, 20.120, 25.150, 40.201, 40.241, 42.168, 1 42.232, 38.171, 42.232, 45.226, 34.153, 31.155, 1 19.085, 24.120, 1 122.613, 141.851, 128.772, 50.251, 40.241, 50.200, 1 65.359, 65.293, 41.226, 42.211, 85.384, 137.688, 1 129.583, 120.603, 1 134.673, 136.820, 161.971, 27.135, 45.271, 39.156, 1 67.370, 54.244, 40.221, 22.110, 91.411, 96.482, 1 206.931, 125.628, 1 75.376, 67.404, 69.416, 72.361, 50.301, 51.204, 1 49.270, 60.271, 50.276, 59.296, 57.257, 50.251, 1 58.262, 72.361, 1 96.482, 83.500, 106.639, 109.547, 85.513, 81.325, 1 76.420, 83.375, 78.431, 94.472, 83.375, 81.407, 1 84.379, 87.437, 1 150.753, 120.724, 114.688, 101.507, 85.513, 96.385, 1 111.613, 96.433, 88.486, 88.442, 134.605, 147.738, 1 169.763, 151.758, 1 118.592, 88.531, 107.645, 146.733, 126.760, 118.473, 1 127.702, 122.551, 117.647, 125.628, 134.605, 137.688, 1 116.524, 124.623, 1 93.467, 86.519, 95.573, 251.256, 331.991, 281.124, 1 248.366, 259.166, 305.681, 290.452, 201.908, 116.582, 1 69.311, 90.452, 1 16.080, 13.078, 24.144, 35.175, 38.229, 35.140, 1 35.193, 33.149, 42.232, 39.195, 32.144, 21.105, 1 17.076, 23.115, 1 57.286, 47.283, 54.325, 96.482, 102.615, 112.449, 1 82.453, 87.393, 104.575, 107.537, 87.393, 54.271, 1 44.198, 54.271/ data TA/188.944, 186.934, 156.547, 120.663, 122.551, 124.560, 1 129.778, 148.669, 134.673, 132.927, 117.647, 106.639, 1 162.244, 169.678, 1 30.150, 30.150, 32.112, 24.132, 21.094, 19.085, 1 21.126, 27.122, 23.115, 24.353, 21.116, 24.144, 1 21.428, 24.096, 1 67.336, 70.351, 120.421, 148.818, 176.795, 167.754, 1 135.814, 121.546, 145.728, 148.148, 173.956, 171.026, 1 85.714, 113.453, 1 146.733, 135.678, 116.407, 105.580, 126.569, 134.605, 1 145.875, 138.623, 134.673, 129.883, 110.608, 110.663, 1 152.040, 216.867, 1 97.487, 105.527, 89.312, 57.315, 58.262, 62.280, 1 69.416, 77.348, 65.326, 61.897, 62.342, 68.410, 1 90.816, 85.341, 1 68.341, 69.346, 193.677, 327.802, 251.130, 201.908, 1 195.171, 169.763, 228.140, 342.973, 230.266, 151.911, 1 86.734, 93.373, 1 41.206, 48.241, 59.207, 51.282, 48.216, 48.216, 1 45.271, 50.226, 52.261, 46.676, 45.248, 50.301, 1 35.714, 45.180, 1 170.854, 135.678, 99.347, 66.365, 72.325, 81.366, 1 94.567, 94.424, 72.361, 74.074, 83.459, 96.579, 1 162.244, 141.566, 1 124.623, 133.668, 120.421, 126.696, 122.551, 128.578, 1 112.676, 135.610, 131.658, 117.706, 119.658, 109.657, 1 103.061, 97.389, 1 256.281, 250.251, 182.639, 131.724, 122.551, 124.560, 1 136.820, 169.763, 135.678, 108.574, 133.735, 123.742, 1 209.183, 179.718, 1 46.231, 48.241, 39.136, 30.165, 26.117, 26.117, 1 29.175, 35.158, 29.145, 24.353, 35.193, 29.175, 1 7.142, 37.148, 1 51.256, 70.351, 109.382, 129.713, 120.542, 112.506, 1 99.597, 96.433, 110.552, 120.750, 119.658, 115.694, 1 41.836, 57.228, 1 23.115, 13.065, 33.115, 130.718, 170.768, 158.714, 1 145.875, 109.492, 124.623, 142.059, 161.890, 107.645, 1 147.959, 52.208, 1 74.371, 78.391, 80.280, 65.359, 62.280, 67.302, 1 65.392, 75.339, 73.366, 64.941, 62.342, 61.368, 1 61.224, 71.285, 1 109.547, 115.577, 105.368, 95.525, 92.415, 91.411, 1 89.537, 106.479, 101.507, 88.280, 93.514, 89.537, 1 89.795, 87.349, 1 97.487, 111.557, 135.474, 126.696, 139.628, 138.623, 1 131.790, 133.601, 136.683, 124.809, 129.713, 178.068, 1 95.918, 115.461, 1 88.442, 107.537, 107.375, 105.580, 107.483, 123.556, 1 120.724, 110.497, 117.587, 99.441, 116.641, 172.032, 1 107.142, 106.425, 1 204.020, 171.859, 122.428, 89.492, 87.393, 109.492, 1 144.869, 116.524, 100.502, 100.456, 107.591, 141.851, 1 225.510, 193.775, 1 32.160, 29.145, 22.077, 16.088, 17.076, 22.099, 1 25.150, 21.094, 19.095, 15.220, 22.121, 25.150, 1 36.734, 33.132, 1 81.407,88.442, 75.263, 50.276, 54.244, 57.257, 1 61.368, 62.280, 63.316, 32.470, 53.293, 66.398, 1 77.551, 79.317/ stop end c---------------------------------------------------------------------------