/* * Copyright (C) 1992-1994 Dmitrij Frishman * * 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; ResNRes; 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; ResNRes; 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; ccEnergyType == 'D' ) HBOND_Energy = DSSP_Energy; else HBOND_Energy = GRID_Energy; for( dc=0; dcGroup != Peptide && !Cmd->SideChainHBond ) continue; for( ac=0; acA_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; iEnergy < 0.0 ) { sprintf(Text,"%3d ",i); PrintHydrBond(Text,HBond[i]); } } for( i=0; i %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; iNBondDnr; i++ ) { hb = p1->HBondDnr[i]; for( j=0; jNBondAcc; 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; iNBondDnr; i++ ) { hb = p1->HBondDnr[i]; for( j=0; jNBondAcc; 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; iDnr->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); }