// Program 6 - Assemble triads into dimers molecule gettriad( string mname ) { molecule m; point p1, p2, p3, pc; matrix mat; //triad if( mname == "a" ){ m = getpdb( "ata_min.pdb" ); setpoint( m, "A:DA:C1'", p1 ); setpoint( m, "B:DT:C1'", p2 ); setpoint( m, "C:DA:C1'", p3 ); }else if( mname == "c" ){ m = getpdb( "cgc.triad.min.pdb" ); setpoint( m, "A:DC:C1'", p1 ); setpoint( m, "B:DG:C1'", p2 ); setpoint( m, "C:DC:C1'", p3 ); }else if( mname == "g" ){ m = getpdb( "gcg_min.pdb" ); setpoint( m, "A:DG:C1'", p1 ); setpoint( m, "B:DC:C1'", p2 ); setpoint( m, "C:DG:C1'", p3 ); }else if( mname == "t" ){ m = getpdb( "tat.triad.min.pdb" ); setpoint( m, "A:DT:C1'", p1 ); setpoint( m, "B:DA:C1'", p2 ); setpoint( m, "C:DT:C1'", p3 ); }else if( mname == "p" ){ //p stands for the protonated cytosine m = getpdb( "cgc+.pdb" ); setpoint( m, "A:DC:C1'", p1 ); setpoint( m, "B:DG:C1'", p2 ); setpoint( m, "C:DP:C1'", p3 ); } circle( p1, p2, p3, pc ); mat = newtransform( -pc.x, -pc.y, -pc.z, 0.0, 0.0, 0.0 ); transformmol( mat, m, NULL ); setreskind( m, NULL, "DNA" ); return( m ); }; int mk_dimer( string t ) { molecule mi, mj, mk, mn; matrix mat; float ri, tw; string ifname, sfname, mfname, namei, name3, name5, ti, tj, tk, tn; int n, i; ri = 3.2; //rise tw = 25; //twist n = length( t ); //n is the strand length ti = substr( t, 1, 1); mi = gettriad( ti ); mat = newtransform( 0.0, 0.0, ri, 0.0, 0.0, -tw ); transformmol( mat, mi, NULL ); for( i = 1; i <= n-1; i = i + 1 ){ tj = substr( t, i+1, 1); mj = gettriad( tj ); mat = newtransform( 0.0, 0.0, ri+3*i, 0.0, 0.0, -(tw+tw*i) ); transformmol( mat, mj, NULL ); mergestr( mi, "A", "last", mj, "A", "first" ); mergestr( mi, "B", "first", mj, "B", "last" ); mergestr( mi, "C", "last", mj, "C", "first" ); connectres( mi, "A", 1, "O3'", 2, "P" ); connectres( mi, "B", 1, "O3'", 2, "P" ); connectres( mi, "C", 1, "O3'", 2, "P" ); } sfname = sprintf( "david_%s.pdb", t ); putpdb( sfname, mi ); // starting coords }; string t; scanf( "%s", t ); mk_dimer( t );