Download scripts/stride/hydrbond.c from OneScience-Group/Chainsaw: direct link, hf CLI and curl.
- Browser
- Download file 19.4 kB
-
https://huggingface.co/OneScience-Group/Chainsaw/resolve/main/scripts/stride/hydrbond.c
- Command line
-
hf download hf://OneScience-Group/Chainsaw/scripts/stride/hydrbond.c
-
curl -L -o hydrbond.c https://huggingface.co/OneScience-Group/Chainsaw/resolve/main/scripts/stride/hydrbond.c
19.4 kB
| 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); | |
| } | |