635 lines
20 KiB
C
635 lines
20 KiB
C
/*
|
|
* Copyright (C) 1992-1994 Dmitrij Frishman <d.frishman at wzw.tum.de>
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
* of this software and associated documentation files (the "Software"), to deal
|
|
* in the Software without restriction, including without limitation the rights
|
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
* copies of the Software, and to permit persons to whom the Software is
|
|
* furnished to do so, subject to the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be included in
|
|
* all copies or substantial portions of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
* THE SOFTWARE.
|
|
*/
|
|
|
|
|
|
#include "stride.h"
|
|
|
|
int FindDnr(CHAIN *Chain, DONOR **Dnr, int *NDnr, COMMAND *Cmd)
|
|
{
|
|
|
|
int Res, dc;
|
|
char Rsd[RES_FIELD];
|
|
|
|
dc = *NDnr;
|
|
|
|
for( Res=0; Res<Chain->NRes; Res++ ) {
|
|
|
|
strcpy(Rsd,Chain->Rsd[Res]->ResType);
|
|
|
|
DefineDnr(Chain,Dnr,&dc,Res,Nsp2,Peptide,1.90,0);
|
|
|
|
if( !Cmd->SideChainHBond ) continue;
|
|
|
|
if( !strcmp(Rsd,"TRP") )
|
|
DefineDnr(Chain,Dnr,&dc,Res,Nsp2,Trp,1.90,0);
|
|
else if( !strcmp(Rsd,"ASN") ) DefineDnr(Chain,Dnr,&dc,Res,Nsp2,Asn,1.90,0);
|
|
else if( !strcmp(Rsd,"GLN") ) DefineDnr(Chain,Dnr,&dc,Res,Nsp2,Gln,1.90,0);
|
|
else if( !strcmp(Rsd,"ARG") ) {
|
|
DefineDnr(Chain,Dnr,&dc,Res,Nsp2,Arg,1.90,1);
|
|
DefineDnr(Chain,Dnr,&dc,Res,Nsp2,Arg,1.90,2);
|
|
DefineDnr(Chain,Dnr,&dc,Res,Nsp2,Arg,1.90,3);
|
|
}
|
|
else if( !strcmp(Rsd,"HIS") ) {
|
|
DefineDnr(Chain,Dnr,&dc,Res,Nsp2,His,1.90,1);
|
|
DefineDnr(Chain,Dnr,&dc,Res,Nsp2,His,1.90,2);
|
|
}
|
|
else if( !strcmp(Rsd,"LYS") ) DefineDnr(Chain,Dnr,&dc,Res,Nsp3,Lys,2.10,0);
|
|
else if( !strcmp(Rsd,"SER") ) DefineDnr(Chain,Dnr,&dc,Res,Osp3,Ser,1.70,0);
|
|
else if( !strcmp(Rsd,"THR") ) DefineDnr(Chain,Dnr,&dc,Res,Osp3,Thr,1.70,0);
|
|
else if( !strcmp(Rsd,"TYR") ) DefineDnr(Chain,Dnr,&dc,Res,Osp2,Tyr,1.70,0);
|
|
}
|
|
|
|
*NDnr = dc;
|
|
return(dc);
|
|
}
|
|
|
|
int DefineDnr(CHAIN *Chain, DONOR **Dnr, int *dc, int Res, enum HYBRID Hybrid, enum GROUP Group,
|
|
float HB_Radius, int N)
|
|
{
|
|
|
|
Dnr[*dc] = (DONOR *)ckalloc(sizeof(DONOR));
|
|
|
|
Dnr[*dc]->Chain = Chain;
|
|
Dnr[*dc]->D_Res = Res;
|
|
if( Group != Peptide )
|
|
Dnr[*dc]->DD_Res = Res;
|
|
else
|
|
Dnr[*dc]->DD_Res = Res-1;
|
|
Dnr[*dc]->DDI_Res = Res;
|
|
Dnr[*dc]->Hybrid = Hybrid;
|
|
Dnr[*dc]->Group = Group;
|
|
Dnr[*dc]->HB_Radius = HB_Radius;
|
|
|
|
if( Group == Peptide ) {
|
|
if( Res != 0 ) {
|
|
FindAtom(Chain,Res,"N",&Dnr[*dc]->D_At);
|
|
FindAtom(Chain,Res-1,"C",&Dnr[*dc]->DD_At);
|
|
}
|
|
else {
|
|
Dnr[*dc]->D_At = ERR;
|
|
Dnr[*dc]->DD_At = ERR;
|
|
}
|
|
FindAtom(Chain,Res,"CA",&Dnr[*dc]->DDI_At);
|
|
FindAtom(Chain,Res,"H",&Dnr[*dc]->H);
|
|
}
|
|
else if( Group == Trp ) {
|
|
FindAtom(Chain,Res,"NE1",&Dnr[*dc]->D_At);
|
|
FindAtom(Chain,Res,"CE2",&Dnr[*dc]->DD_At);
|
|
FindAtom(Chain,Res,"CD1",&Dnr[*dc]->DDI_At);
|
|
}
|
|
else if( Group == Asn ) {
|
|
FindAtom(Chain,Res,"ND1",&Dnr[*dc]->D_At);
|
|
FindAtom(Chain,Res,"CG",&Dnr[*dc]->DD_At);
|
|
FindAtom(Chain,Res,"CB",&Dnr[*dc]->DDI_At);
|
|
}
|
|
else if( Group == Gln ) {
|
|
FindAtom(Chain,Res,"NE2",&Dnr[*dc]->D_At);
|
|
FindAtom(Chain,Res,"CD",&Dnr[*dc]->DD_At);
|
|
FindAtom(Chain,Res,"CG",&Dnr[*dc]->DDI_At);
|
|
}
|
|
else if( Group == Arg ) {
|
|
if( N == 1 ) {
|
|
FindAtom(Chain,Res,"NE",&Dnr[*dc]->D_At);
|
|
FindAtom(Chain,Res,"CZ",&Dnr[*dc]->DD_At);
|
|
FindAtom(Chain,Res,"CD",&Dnr[*dc]->DDI_At);
|
|
}
|
|
else
|
|
if( N == 2 ) {
|
|
FindAtom(Chain,Res,"NH1",&Dnr[*dc]->D_At);
|
|
FindAtom(Chain,Res,"CZ",&Dnr[*dc]->DD_At);
|
|
FindAtom(Chain,Res,"NE",&Dnr[*dc]->DDI_At);
|
|
}
|
|
else
|
|
if( N == 3 ) {
|
|
FindAtom(Chain,Res,"NH2",&Dnr[*dc]->D_At);
|
|
FindAtom(Chain,Res,"CZ",&Dnr[*dc]->DD_At);
|
|
FindAtom(Chain,Res,"NE",&Dnr[*dc]->DDI_At);
|
|
}
|
|
}
|
|
else if( Group == His ) {
|
|
if( N == 1 ) {
|
|
FindAtom(Chain,Res,"ND1",&Dnr[*dc]->D_At);
|
|
FindAtom(Chain,Res,"CG",&Dnr[*dc]->DD_At);
|
|
FindAtom(Chain,Res,"CE1",&Dnr[*dc]->DDI_At);
|
|
}
|
|
else if( N == 2 ) {
|
|
FindAtom(Chain,Res,"NE2",&Dnr[*dc]->D_At);
|
|
FindAtom(Chain,Res,"CE1",&Dnr[*dc]->DD_At);
|
|
FindAtom(Chain,Res,"CD2",&Dnr[*dc]->DDI_At);
|
|
}
|
|
}
|
|
else if( Group == Tyr ) {
|
|
FindAtom(Chain,Res,"OH",&Dnr[*dc]->D_At);
|
|
FindAtom(Chain,Res,"CZ",&Dnr[*dc]->DD_At);
|
|
FindAtom(Chain,Res,"CE1",&Dnr[*dc]->DDI_At);
|
|
}
|
|
else if( Group == Lys ) {
|
|
FindAtom(Chain,Res,"NZ",&Dnr[*dc]->D_At);
|
|
FindAtom(Chain,Res,"CE",&Dnr[*dc]->DD_At);
|
|
}
|
|
else if( Group == Ser ) {
|
|
FindAtom(Chain,Res,"OG",&Dnr[*dc]->D_At);
|
|
FindAtom(Chain,Res,"CB",&Dnr[*dc]->DD_At);
|
|
}
|
|
else if( Group == Thr ) {
|
|
FindAtom(Chain,Res,"OG1",&Dnr[*dc]->D_At);
|
|
FindAtom(Chain,Res,"CB",&Dnr[*dc]->DD_At);
|
|
}
|
|
|
|
if( Dnr[*dc]->H == ERR || Dnr[*dc]->D_At == ERR || Dnr[*dc]->DD_At == ERR ||
|
|
(Dnr[*dc]->DDI_At == ERR && (Hybrid == Nsp2 || Hybrid == Osp2 )) ) {
|
|
free(Dnr[*dc]); return(FAILURE);
|
|
}
|
|
else (*dc)++;
|
|
return(SUCCESS);
|
|
}
|
|
|
|
|
|
int FindAcc(CHAIN *Chain, ACCEPTOR **Acc, int *NAcc, COMMAND *Cmd)
|
|
{
|
|
|
|
int Res, ac;
|
|
char Rsd[RES_FIELD];
|
|
|
|
ac = *NAcc;
|
|
|
|
for( Res=0; Res<Chain->NRes; Res++ ) {
|
|
strcpy(Rsd,Chain->Rsd[Res]->ResType);
|
|
|
|
DefineAcceptor(Chain,Acc,&ac,Res,Osp2,Peptide,1.60,0);
|
|
|
|
if( !Cmd->SideChainHBond ) continue;
|
|
|
|
if( !strcmp(Rsd,"HIS") ) {
|
|
DefineAcceptor(Chain,Acc,&ac,Res,Nsp2,His,1.60,0);
|
|
DefineAcceptor(Chain,Acc,&ac,Res,Nsp2,His,1.60,0);
|
|
}
|
|
else if( !strcmp(Rsd,"SER") ) DefineAcceptor(Chain,Acc,&ac,Res,Osp3,Ser,1.70,0);
|
|
else if( !strcmp(Rsd,"THR") ) DefineAcceptor(Chain,Acc,&ac,Res,Osp3,Thr,1.70,0);
|
|
else if( !strcmp(Rsd,"ASN") ) DefineAcceptor(Chain,Acc,&ac,Res,Osp2,Asn,1.60,0);
|
|
else if( !strcmp(Rsd,"GLN") ) DefineAcceptor(Chain,Acc,&ac,Res,Osp2,Gln,1.60,0);
|
|
else if( !strcmp(Rsd,"ASP") ) {
|
|
DefineAcceptor(Chain,Acc,&ac,Res,Osp2,Asp,1.60,1);
|
|
DefineAcceptor(Chain,Acc,&ac,Res,Osp2,Asp,1.60,2);
|
|
}
|
|
else if( !strcmp(Rsd,"GLU") ) {
|
|
DefineAcceptor(Chain,Acc,&ac,Res,Osp2,Glu,1.60,1);
|
|
DefineAcceptor(Chain,Acc,&ac,Res,Osp2,Glu,1.60,2);
|
|
}
|
|
else if( !strcmp(Rsd,"TYR") ) DefineAcceptor(Chain,Acc,&ac,Res,Osp2,Tyr,1.70,0);
|
|
else if( !strcmp(Rsd,"MET") ) DefineAcceptor(Chain,Acc,&ac,Res,Ssp3,Met,1.95,0);
|
|
else if( !strcmp(Rsd,"CYS") ) DefineAcceptor(Chain,Acc,&ac,Res,Ssp3,Cys,1.70,0);
|
|
}
|
|
|
|
*NAcc = ac;
|
|
return(ac);
|
|
}
|
|
|
|
|
|
int DefineAcceptor(CHAIN *Chain, ACCEPTOR **Acc, int *ac, int Res, enum HYBRID Hybrid,
|
|
enum GROUP Group, float HB_Radius, int N)
|
|
{
|
|
|
|
Acc[*ac] = (ACCEPTOR *)ckalloc(sizeof(ACCEPTOR));
|
|
|
|
Acc[*ac]->Chain = Chain;
|
|
Acc[*ac]->A_Res = Res;
|
|
Acc[*ac]->AA_Res = Res;
|
|
Acc[*ac]->AA2_Res = Res;
|
|
Acc[*ac]->Hybrid = Hybrid;
|
|
Acc[*ac]->Group = Group;
|
|
Acc[*ac]->HB_Radius = HB_Radius;
|
|
|
|
if( Group == Peptide ) {
|
|
if( Res != Chain->NRes-1 ) {
|
|
FindAtom(Chain,Res,"O",&Acc[*ac]->A_At);
|
|
FindAtom(Chain,Res,"C",&Acc[*ac]->AA_At);
|
|
}
|
|
else {
|
|
Acc[*ac]->A_At = ERR;
|
|
Acc[*ac]->AA_At = ERR;
|
|
}
|
|
FindAtom(Chain,Res,"CA",&Acc[*ac]->AA2_At);
|
|
}
|
|
else if( Group == His ) {
|
|
if( N == 1 ) {
|
|
FindAtom(Chain,Res,"ND1",&Acc[*ac]->A_At);
|
|
FindAtom(Chain,Res,"CG",&Acc[*ac]->AA_At);
|
|
FindAtom(Chain,Res,"CE1",&Acc[*ac]->AA2_At);
|
|
}
|
|
else if( N == 2 ) {
|
|
FindAtom(Chain,Res,"NE2",&Acc[*ac]->A_At);
|
|
FindAtom(Chain,Res,"CE1",&Acc[*ac]->AA_At);
|
|
FindAtom(Chain,Res,"CD2",&Acc[*ac]->AA2_At);
|
|
}
|
|
}
|
|
else if( Group == Asn ) {
|
|
FindAtom(Chain,Res,"OD1",&Acc[*ac]->A_At);
|
|
FindAtom(Chain,Res,"CG",&Acc[*ac]->AA_At);
|
|
FindAtom(Chain,Res,"CB",&Acc[*ac]->AA2_At);
|
|
}
|
|
else if( Group == Gln ) {
|
|
FindAtom(Chain,Res,"OE1",&Acc[*ac]->A_At);
|
|
FindAtom(Chain,Res,"CD",&Acc[*ac]->AA_At);
|
|
FindAtom(Chain,Res,"CG",&Acc[*ac]->AA2_At);
|
|
}
|
|
else if( Group == Asp ) {
|
|
if( N == 1 ) {
|
|
FindAtom(Chain,Res,"OD1",&Acc[*ac]->A_At);
|
|
FindAtom(Chain,Res,"CG",&Acc[*ac]->AA_At);
|
|
FindAtom(Chain,Res,"CB",&Acc[*ac]->AA2_At);
|
|
}
|
|
else if( N == 2 ) {
|
|
FindAtom(Chain,Res,"ND2",&Acc[*ac]->A_At);
|
|
FindAtom(Chain,Res,"CG",&Acc[*ac]->AA_At);
|
|
FindAtom(Chain,Res,"CB",&Acc[*ac]->AA2_At);
|
|
}
|
|
}
|
|
else if( Group == Glu ) {
|
|
if( N == 1 ) {
|
|
FindAtom(Chain,Res,"OE1",&Acc[*ac]->A_At);
|
|
FindAtom(Chain,Res,"CD",&Acc[*ac]->AA_At);
|
|
FindAtom(Chain,Res,"CG",&Acc[*ac]->AA2_At);
|
|
}
|
|
else if( N == 2 ) {
|
|
FindAtom(Chain,Res,"NE2",&Acc[*ac]->A_At);
|
|
FindAtom(Chain,Res,"CD",&Acc[*ac]->AA_At);
|
|
FindAtom(Chain,Res,"CG",&Acc[*ac]->AA2_At);
|
|
}
|
|
}
|
|
else if( Group == Tyr ) {
|
|
FindAtom(Chain,Res,"OH",&Acc[*ac]->A_At);
|
|
FindAtom(Chain,Res,"CZ",&Acc[*ac]->AA_At);
|
|
FindAtom(Chain,Res,"CE1",&Acc[*ac]->AA2_At);
|
|
}
|
|
else if( Group == Ser ) {
|
|
FindAtom(Chain,Res,"OG",&Acc[*ac]->A_At);
|
|
FindAtom(Chain,Res,"CB",&Acc[*ac]->AA_At);
|
|
}
|
|
else if( Group == Thr ) {
|
|
FindAtom(Chain,Res,"OG1",&Acc[*ac]->A_At);
|
|
FindAtom(Chain,Res,"CB",&Acc[*ac]->AA_At);
|
|
}
|
|
else if( Group == Met ) {
|
|
FindAtom(Chain,Res,"SD",&Acc[*ac]->A_At);
|
|
FindAtom(Chain,Res,"CG",&Acc[*ac]->AA_At);
|
|
}
|
|
else if( Group == Cys ) {
|
|
FindAtom(Chain,Res,"SG",&Acc[*ac]->A_At);
|
|
FindAtom(Chain,Res,"CB",&Acc[*ac]->AA_At);
|
|
}
|
|
|
|
if( Acc[*ac]->A_At == ERR || Acc[*ac]->AA_At == ERR ||
|
|
(Acc[*ac]->AA2_At == ERR && (Hybrid == Nsp2 || Hybrid == Osp2 )) ) {
|
|
free(Acc[*ac]); return(FAILURE);
|
|
}
|
|
else (*ac)++;
|
|
return(SUCCESS);
|
|
}
|
|
|
|
|
|
int FindHydrogenBonds(CHAIN **Chain, int NChain, HBOND **HBond, COMMAND *Cmd)
|
|
{
|
|
DONOR **Dnr;
|
|
ACCEPTOR **Acc;
|
|
BOOLEAN *BondedDonor, *BondedAcceptor;
|
|
int NDnr=0, NAcc=0;
|
|
int dc, ac, ccd, cca, cc, hc=0, i;
|
|
void (*HBOND_Energy)();
|
|
BUFFER Text;
|
|
|
|
Dnr = (DONOR **)ckalloc(MAXDONOR*sizeof(DONOR *));
|
|
Acc = (ACCEPTOR **)ckalloc(MAXACCEPTOR*sizeof(ACCEPTOR *));
|
|
|
|
for( cc=0; cc<NChain; cc++ ) {
|
|
FindDnr(Chain[cc],Dnr,&NDnr,Cmd);
|
|
FindAcc(Chain[cc],Acc,&NAcc,Cmd);
|
|
}
|
|
|
|
BondedDonor = (BOOLEAN *)ckalloc(NDnr*sizeof(BOOLEAN));
|
|
BondedAcceptor = (BOOLEAN *)ckalloc(NAcc*sizeof(BOOLEAN));
|
|
for( i=0; i<NDnr; i++ )
|
|
BondedDonor[i] = NO;
|
|
for( i=0; i<NAcc; i++ )
|
|
BondedAcceptor[i] = NO;
|
|
|
|
if( Cmd->EnergyType == 'D' )
|
|
HBOND_Energy = DSSP_Energy;
|
|
else
|
|
HBOND_Energy = GRID_Energy;
|
|
|
|
for( dc=0; dc<NDnr; dc++ ) {
|
|
|
|
if( Dnr[dc]->Group != Peptide && !Cmd->SideChainHBond ) continue;
|
|
|
|
for( ac=0; ac<NAcc; ac++ ) {
|
|
|
|
if( abs(Acc[ac]->A_Res - Dnr[dc]->D_Res) < 2 && Acc[ac]->Chain->Id == Dnr[dc]->Chain->Id )
|
|
continue;
|
|
|
|
if( Acc[ac]->Group != Peptide && !Cmd->SideChainHBond ) continue;
|
|
|
|
if( hc == MAXHYDRBOND )
|
|
die("Number of hydrogen bonds exceeds current limit of %d in %s\n",
|
|
MAXHYDRBOND,Chain[0]->File);
|
|
HBond[hc] = (HBOND *)ckalloc(sizeof(HBOND));
|
|
|
|
HBond[hc]->ExistHydrBondRose = NO;
|
|
HBond[hc]->ExistHydrBondBaker = NO;
|
|
HBond[hc]->ExistPolarInter = NO;
|
|
|
|
if( (HBond[hc]->AccDonDist =
|
|
Dist(Dnr[dc]->Chain->Rsd[Dnr[dc]->D_Res]->Coord[Dnr[dc]->D_At],
|
|
Acc[ac]->Chain->Rsd[Acc[ac]->A_Res]->Coord[Acc[ac]->A_At]) ) <=
|
|
Cmd->DistCutOff ) {
|
|
|
|
|
|
if( Cmd->MainChainPolarInt && Dnr[dc]->Group == Peptide &&
|
|
Acc[ac]->Group == Peptide && Dnr[dc]->H != ERR) {
|
|
HBOND_Energy(Acc[ac]->Chain->Rsd[Acc[ac]->AA2_Res]->Coord[Acc[ac]->AA2_At],
|
|
Acc[ac]->Chain->Rsd[Acc[ac]->AA_Res]->Coord[Acc[ac]->AA_At],
|
|
Acc[ac]->Chain->Rsd[Acc[ac]->A_Res]->Coord[Acc[ac]->A_At],
|
|
Dnr[dc]->Chain->Rsd[Dnr[dc]->D_Res]->Coord[Dnr[dc]->H],
|
|
Dnr[dc]->Chain->Rsd[Dnr[dc]->D_Res]->Coord[Dnr[dc]->D_At],
|
|
Cmd,HBond[hc]);
|
|
|
|
if( HBond[hc]->Energy < -10.0 &&
|
|
( (Cmd->EnergyType == 'G' && fabs(HBond[hc]->Et) > Eps &&
|
|
fabs(HBond[hc]->Ep) > Eps ) || Cmd->EnergyType != 'G' ) )
|
|
HBond[hc]->ExistPolarInter = YES;
|
|
}
|
|
|
|
if( Cmd->MainChainHBond &&
|
|
(HBond[hc]->OHDist =
|
|
Dist(Dnr[dc]->Chain->Rsd[Dnr[dc]->D_Res]->Coord[Dnr[dc]->H],
|
|
Acc[ac]->Chain->Rsd[Acc[ac]->A_Res]->Coord[Acc[ac]->A_At])) <= 2.5 &&
|
|
(HBond[hc]->AngNHO =
|
|
Ang(Dnr[dc]->Chain->Rsd[Dnr[dc]->D_Res]->Coord[Dnr[dc]->D_At],
|
|
Dnr[dc]->Chain->Rsd[Dnr[dc]->D_Res]->Coord[Dnr[dc]->H],
|
|
Acc[ac]->Chain->Rsd[Acc[ac]->A_Res]->Coord[Acc[ac]->A_At])) >= 90.0 &&
|
|
HBond[hc]->AngNHO <= 180.0 &&
|
|
(HBond[hc]->AngCOH =
|
|
Ang(Acc[ac]->Chain->Rsd[Acc[ac]->AA_Res]->Coord[Acc[ac]->AA_At],
|
|
Acc[ac]->Chain->Rsd[Acc[ac]->A_Res]->Coord[Acc[ac]->A_At],
|
|
Dnr[dc]->Chain->Rsd[Dnr[dc]->D_Res]->Coord[Dnr[dc]->H])) >= 90.0 &&
|
|
|
|
HBond[hc]->AngCOH <= 180.0 )
|
|
HBond[hc]->ExistHydrBondBaker = YES;
|
|
|
|
if( Cmd->MainChainHBond &&
|
|
HBond[hc]->AccDonDist <= Dnr[dc]->HB_Radius+Acc[ac]->HB_Radius ) {
|
|
|
|
HBond[hc]->AccAng =
|
|
Ang(Dnr[dc]->Chain->Rsd[Dnr[dc]->D_Res]->Coord[Dnr[dc]->D_At],
|
|
Acc[ac]->Chain->Rsd[Acc[ac]->A_Res]->Coord[Acc[ac]->A_At],
|
|
Acc[ac]->Chain->Rsd[Acc[ac]->AA_Res]->Coord[Acc[ac]->AA_At]);
|
|
|
|
if( ( ( Acc[ac]->Hybrid == Nsp2 || Acc[ac]->Hybrid == Osp2 ) &&
|
|
( HBond[hc]->AccAng >= MINACCANG_SP2 &&
|
|
HBond[hc]->AccAng <= MAXACCANG_SP2 ) ) ||
|
|
( ( Acc[ac]->Hybrid == Ssp3 || Acc[ac]->Hybrid == Osp3 ) &&
|
|
( HBond[hc]->AccAng >= MINACCANG_SP3 &&
|
|
HBond[hc]->AccAng <= MAXACCANG_SP3 ) ) ) {
|
|
|
|
HBond[hc]->DonAng =
|
|
Ang(Acc[ac]->Chain->Rsd[Acc[ac]->A_Res]->Coord[Acc[ac]->A_At],
|
|
Dnr[dc]->Chain->Rsd[Dnr[dc]->D_Res]->Coord[Dnr[dc]->D_At],
|
|
Dnr[dc]->Chain->Rsd[Dnr[dc]->DD_Res]->Coord[Dnr[dc]->DD_At]);
|
|
|
|
if( ( ( Dnr[dc]->Hybrid == Nsp2 || Dnr[dc]->Hybrid == Osp2 ) &&
|
|
( HBond[hc]->DonAng >= MINDONANG_SP2 &&
|
|
HBond[hc]->DonAng <= MAXDONANG_SP2 ) ) ||
|
|
( ( Dnr[dc]->Hybrid == Nsp3 || Dnr[dc]->Hybrid == Osp3 ) &&
|
|
( HBond[hc]->DonAng >= MINDONANG_SP3 &&
|
|
HBond[hc]->DonAng <= MAXDONANG_SP3 ) ) ) {
|
|
|
|
if( Dnr[dc]->Hybrid == Nsp2 || Dnr[dc]->Hybrid == Osp2 ) {
|
|
HBond[hc]->AccDonAng =
|
|
fabs(Torsion(Dnr[dc]->Chain->Rsd[Dnr[dc]->DDI_Res]->Coord[Dnr[dc]->DDI_At],
|
|
Dnr[dc]->Chain->Rsd[Dnr[dc]->D_Res]->Coord[Dnr[dc]->D_At],
|
|
Dnr[dc]->Chain->Rsd[Dnr[dc]->DD_Res]->Coord[Dnr[dc]->DD_At],
|
|
Acc[ac]->Chain->Rsd[Acc[ac]->A_Res]->Coord[Acc[ac]->A_At]));
|
|
|
|
if( HBond[hc]->AccDonAng > 90.0 && HBond[hc]->AccDonAng < 270.0 )
|
|
HBond[hc]->AccDonAng = fabs(180.0 - HBond[hc]->AccDonAng);
|
|
|
|
}
|
|
|
|
if( Acc[ac]->Hybrid == Nsp2 || Acc[ac]->Hybrid == Osp2 ) {
|
|
HBond[hc]->DonAccAng =
|
|
fabs(Torsion(Dnr[dc]->Chain->Rsd[Dnr[dc]->D_Res]->Coord[Dnr[dc]->D_At],
|
|
Acc[ac]->Chain->Rsd[Acc[ac]->A_Res]->Coord[Acc[ac]->A_At],
|
|
Acc[ac]->Chain->Rsd[Acc[ac]->AA_Res]->Coord[Acc[ac]->AA_At],
|
|
Acc[ac]->Chain->Rsd[Acc[ac]->AA2_Res]->Coord[Acc[ac]->AA2_At]));
|
|
|
|
if(HBond[hc]->DonAccAng > 90.0 && HBond[hc]->DonAccAng < 270.0)
|
|
HBond[hc]->DonAccAng = fabs(180.0 - HBond[hc]->DonAccAng);
|
|
|
|
}
|
|
|
|
if( ( Dnr[dc]->Hybrid != Nsp2 && Dnr[dc]->Hybrid != Osp2 &&
|
|
Acc[ac]->Hybrid != Nsp2 && Acc[ac]->Hybrid != Osp2 ) ||
|
|
( Acc[ac]->Hybrid != Nsp2 && Acc[ac]->Hybrid != Osp2 &&
|
|
( Dnr[dc]->Hybrid == Nsp2 || Dnr[dc]->Hybrid == Osp2 ) &&
|
|
HBond[hc]->AccDonAng <= ACCDONANG ) ||
|
|
( Dnr[dc]->Hybrid != Nsp2 && Dnr[dc]->Hybrid != Osp2 &&
|
|
( Acc[ac]->Hybrid == Nsp2 || Acc[ac]->Hybrid == Osp2 ) &&
|
|
HBond[hc]->DonAccAng <= DONACCANG ) ||
|
|
( ( Dnr[dc]->Hybrid == Nsp2 || Dnr[dc]->Hybrid == Osp2 ) &&
|
|
( Acc[ac]->Hybrid == Nsp2 || Acc[ac]->Hybrid == Osp2 ) &&
|
|
HBond[hc]->AccDonAng <= ACCDONANG &&
|
|
HBond[hc]->DonAccAng <= DONACCANG ) )
|
|
HBond[hc]->ExistHydrBondRose = YES;
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
if( (HBond[hc]->ExistPolarInter && HBond[hc]->Energy < 0.0)
|
|
|| HBond[hc]->ExistHydrBondRose || HBond[hc]->ExistHydrBondBaker ) {
|
|
HBond[hc]->Dnr = Dnr[dc];
|
|
HBond[hc]->Acc = Acc[ac];
|
|
BondedDonor[dc] = YES;
|
|
BondedAcceptor[ac] = YES;
|
|
if( (ccd = FindChain(Chain,NChain,Dnr[dc]->Chain->Id)) != ERR ) {
|
|
if( Chain[ccd]->Rsd[Dnr[dc]->D_Res]->Inv->NBondDnr < MAXRESDNR )
|
|
Chain[ccd]->Rsd[Dnr[dc]->D_Res]->Inv->
|
|
HBondDnr[Chain[ccd]->Rsd[Dnr[dc]->D_Res]->Inv->NBondDnr++] = hc;
|
|
else
|
|
fprintf(stderr,"Residue %s %s of chain %s%c is involved in %d hydrogen bonds (%d are allowed)\n",
|
|
Chain[ccd]->Rsd[Dnr[dc]->D_Res]->ResType,
|
|
Chain[ccd]->Rsd[Dnr[dc]->D_Res]->PDB_ResNumb,
|
|
Chain[ccd]->File,SpaceToDash(Chain[ccd]->Id),
|
|
Chain[ccd]->Rsd[Dnr[dc]->D_Res]->Inv->NBondDnr,MAXRESDNR-1);
|
|
}
|
|
if( (cca = FindChain(Chain,NChain,Acc[ac]->Chain->Id)) != ERR ) {
|
|
if( Chain[cca]->Rsd[Acc[ac]->A_Res]->Inv->NBondAcc < MAXRESACC )
|
|
Chain[cca]->Rsd[Acc[ac]->A_Res]->Inv->
|
|
HBondAcc[Chain[cca]->Rsd[Acc[ac]->A_Res]->Inv->NBondAcc++] = hc;
|
|
else
|
|
fprintf(stderr,"Residue %s %s of chain %s%c is involved in %d hydrogen bonds (%d are allowed)\n",
|
|
Chain[cca]->Rsd[Acc[ac]->A_Res]->ResType,
|
|
Chain[cca]->Rsd[Acc[ac]->A_Res]->PDB_ResNumb,
|
|
Chain[cca]->File,SpaceToDash(Chain[cca]->Id),
|
|
Chain[cca]->Rsd[Acc[ac]->A_Res]->Inv->NBondAcc,MAXRESACC-1);
|
|
}
|
|
if( ccd != cca && ccd != ERR ) {
|
|
Chain[ccd]->Rsd[Dnr[dc]->D_Res]->Inv->InterchainHBonds = YES;
|
|
Chain[cca]->Rsd[Acc[ac]->A_Res]->Inv->InterchainHBonds = YES;
|
|
if( HBond[hc]->ExistHydrBondRose ) {
|
|
Chain[0]->NHydrBondInterchain++;
|
|
Chain[0]->NHydrBondTotal++;
|
|
}
|
|
}
|
|
else
|
|
if( ccd == cca && ccd != ERR && HBond[hc]->ExistHydrBondRose ) {
|
|
Chain[ccd]->NHydrBond++;
|
|
Chain[0]->NHydrBondTotal++;
|
|
}
|
|
hc++;
|
|
}
|
|
else
|
|
free(HBond[hc]);
|
|
}
|
|
}
|
|
if( Cmd->Info )
|
|
for( i=0; i<hc; i++ ) {
|
|
if( HBond[i]->Energy < 0.0 ) {
|
|
sprintf(Text,"%3d ",i);
|
|
PrintHydrBond(Text,HBond[i]);
|
|
}
|
|
}
|
|
|
|
for( i=0; i<NDnr; i++ )
|
|
if( !BondedDonor[i] )
|
|
free(Dnr[i]);
|
|
for( i=0; i<NAcc; i++ )
|
|
if( !BondedAcceptor[i] )
|
|
free(Acc[i]);
|
|
|
|
if( NDnr )
|
|
free(BondedDonor);
|
|
if( NAcc )
|
|
free(BondedAcceptor);
|
|
|
|
return(hc);
|
|
}
|
|
|
|
void PrintHydrBond(char *Text, HBOND *HBond)
|
|
{
|
|
|
|
fprintf(stdout,"HB %s %20s %3s %4s %4d %c <> %3s %4s %4d %c ",Text,
|
|
HBond->Dnr->Chain->File,
|
|
HBond->Dnr->Chain->Rsd[HBond->Dnr->D_Res]->ResType,
|
|
HBond->Dnr->Chain->Rsd[HBond->Dnr->D_Res]->PDB_ResNumb,
|
|
HBond->Dnr->D_Res,HBond->Dnr->Chain->Id,
|
|
HBond->Acc->Chain->Rsd[HBond->Acc->A_Res]->ResType,
|
|
HBond->Acc->Chain->Rsd[HBond->Acc->A_Res]->PDB_ResNumb,
|
|
HBond->Acc->A_Res,HBond->Acc->Chain->Id);
|
|
|
|
fprintf(stdout," %7.1f ",HBond->AccDonDist);
|
|
if( HBond->ExistPolarInter )
|
|
fprintf(stdout,"%7.1f ",HBond->Energy);
|
|
else
|
|
fprintf(stdout,"XXXXXXX ");
|
|
|
|
if( HBond->ExistHydrBondRose )
|
|
fprintf(stdout,"YES ");
|
|
else
|
|
fprintf(stdout,"NO ");
|
|
|
|
if( HBond->ExistHydrBondBaker )
|
|
fprintf(stdout,"YES\n");
|
|
else
|
|
fprintf(stdout,"NO\n");
|
|
|
|
|
|
|
|
}
|
|
|
|
int FindPolInt(HBOND **HBond, RESIDUE *Res1, RESIDUE *Res2)
|
|
{
|
|
|
|
register int i, j, hb;
|
|
INVOLVED *p1, *p2;
|
|
|
|
p1 = Res1->Inv;
|
|
p2 = Res2->Inv;
|
|
|
|
if( p1->NBondDnr && p2->NBondAcc ) {
|
|
for( i=0; i<p1->NBondDnr; i++ ) {
|
|
hb = p1->HBondDnr[i];
|
|
for( j=0; j<p2->NBondAcc; j++ )
|
|
if( hb == p2->HBondAcc[j] && HBond[hb]->ExistPolarInter )
|
|
return(hb);
|
|
}
|
|
}
|
|
|
|
return(ERR);
|
|
}
|
|
|
|
int FindBnd(HBOND **HBond, RESIDUE *Res1, RESIDUE *Res2)
|
|
{
|
|
|
|
register int i, j, hb;
|
|
INVOLVED *p1, *p2;
|
|
|
|
p1 = Res1->Inv;
|
|
p2 = Res2->Inv;
|
|
|
|
if( p1->NBondDnr && p2->NBondAcc ) {
|
|
for( i=0; i<p1->NBondDnr; i++ ) {
|
|
hb = p1->HBondDnr[i];
|
|
for( j=0; j<p2->NBondAcc; j++ )
|
|
if( hb == p2->HBondAcc[j] && HBond[hb]->ExistHydrBondRose )
|
|
return(hb);
|
|
}
|
|
}
|
|
|
|
return(ERR);
|
|
}
|
|
|
|
int NoDoubleHBond(HBOND **HBond, int NHBond)
|
|
{
|
|
|
|
int i, j, NExcl=0;
|
|
|
|
for( i=0; i<NHBond-1; i++ )
|
|
for( j=i+1; j<NHBond; j++ )
|
|
if( HBond[i]->Dnr->D_Res == HBond[j]->Dnr->D_Res &&
|
|
HBond[i]->Dnr->Chain->Id == HBond[j]->Dnr->Chain->Id &&
|
|
HBond[i]->ExistPolarInter && HBond[j]->ExistPolarInter ) {
|
|
if( HBond[i]->Energy < 5.0*HBond[j]->Energy ) {
|
|
HBond[j]->ExistPolarInter = NO;
|
|
NExcl++;
|
|
}
|
|
else
|
|
if( HBond[j]->Energy < 5.0*HBond[i]->Energy ) {
|
|
HBond[i]->ExistPolarInter = NO;
|
|
NExcl++;
|
|
}
|
|
}
|
|
|
|
return(NExcl);
|
|
}
|
|
|