/* * 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" void Report(CHAIN **Chain, int NChain, HBOND **HBond, COMMAND *Cmd) { FILE *Out; if( !strlen(Cmd->OutFile) ) Out = stdout; else if( !(Out = fopen(Cmd->OutFile,"w")) ) die("Can not open output file %s\n",Cmd->OutFile); if( !Cmd->ReportSummaryOnly ) ReportGeneral(Chain,Out); ReportSummary(Chain,NChain,Out,Cmd); ReportShort(Chain,NChain,Out,Cmd); ReportTurnTypes(Chain,NChain,Out,Cmd); ReportSSBonds(Chain,Out); if( !Cmd->ReportSummaryOnly ) ReportDetailed(Chain,NChain,Out,Cmd); if( Cmd->ReportBonds ) ReportHydrBonds(Chain,NChain,HBond,Out,Cmd); if( Cmd->Measure ) { Measure(Chain,NChain,0,Cmd,Out); Measure(Chain,NChain,1,Cmd,Out); } if( Out != stdout ) fclose(Out); } void ReportGeneral(CHAIN **Chain, FILE *Out) { register int i; BUFFER Bf, Tmp; if( !Chain[0]->NInfo ) return; PrepareBuffer(Bf,Chain); Glue(Bf,"REM --------------------------------------------------------------------",Out); Glue(Bf,"REM",Out); Glue(Bf,"REM STRIDE: Knowledge-based secondary structure assignment",Out); Glue(Bf,"REM Please cite: D.Frishman & P.Argos, Proteins XX, XXX-XXX, 1995",Out); Glue(Bf,"REM",Out); Glue(Bf,"REM Residue accessible surface area calculation",Out); Glue(Bf,"REM Please cite: F.Eisenhaber & P.Argos, J.Comp.Chem. 14, 1272-1280, 1993 ",Out); Glue(Bf,"REM F.Eisenhaber et al., J.Comp.Chem., 1994, submitted",Out); Glue(Bf,"REM",Out); sprintf(Tmp,"REM ------------------------ "); strcat(Tmp,"General information"); strcat(Tmp," -----------------------"); Glue(Bf,Tmp,Out); Glue(Bf,"REM",Out); for( i=0; iNInfo; i++ ) { strcpy(Tmp,Chain[0]->Info[i]); Tmp[66] = '\0'; Replace(Tmp,'\n',' '); Glue(Bf,Tmp,Out); } Glue(Bf,"REM",Out); } void ReportSummary(CHAIN **Chain, int NChain, FILE *Out, COMMAND *Cmd) { int Cn, Width, CurrWidth, NBlocks, Tail, i, j, From, To; BUFFER Bf, Tmp, Tmp1; PrepareBuffer(Bf,Chain); sprintf(Tmp,"REM -------------------- "); strcat(Tmp,"Secondary structure summary"); strcat(Tmp," -------------------"); Glue(Bf,Tmp,Out); for( Cn=0; CnValid ) continue; Width = 50; Glue(Bf,"REM",Out); strncpy(Tmp1,Chain[Cn]->File,40); Tmp1[40] = '\0'; sprintf(Tmp,"CHN %s %c",Tmp1,SpaceToDash(Chain[Cn]->Id)); Glue(Bf,Tmp,Out); NBlocks = Chain[Cn]->NRes/Width; Tail = Chain[Cn]->NRes % Width; if( Tail ) NBlocks++; for( i=0; iRsd[j]->ResType)); else sprintf(Tmp1," "); strcat(Tmp,Tmp1); } sprintf(Tmp1," %4d",To); strcat(Tmp,Tmp1); Glue(Bf,Tmp,Out); sprintf(Tmp,"STR "); for( j=From; jRsd[j]->Prop->Asn == 'C' ) sprintf(Tmp1," "); else sprintf(Tmp1,"%c",Chain[Cn]->Rsd[j]->Prop->Asn); strcat(Tmp,Tmp1); } strcat(Tmp," "); Glue(Bf,Tmp,Out); } } } void ReportDetailed(CHAIN **Chain, int NChain, FILE *Out, COMMAND *Cmd) { register int i, Cn; RESIDUE *p; BUFFER Bf, Tmp, Tmp1; PrepareBuffer(Bf,Chain); Glue(Bf,"REM",Out); sprintf(Tmp,"REM --------------- "); strcat(Tmp,"Detailed secondary structure assignment"); strcat(Tmp,"-------------"); Glue(Bf,Tmp,Out); Glue(Bf,"REM",Out); Glue(Bf,"REM |---Residue---| |--Structure--| |-Phi-| |-Psi-| |-Area-| ",Out); for( Cn=0; CnValid ) continue; for( i=0; iNRes; i++ ) { p = Chain[Cn]->Rsd[i]; sprintf(Tmp,"ASG %3s %c %4s %4d %c %11s %7.2f %7.2f %7.1f", p->ResType,SpaceToDash(Chain[Cn]->Id),p->PDB_ResNumb,i+1, p->Prop->Asn,Translate(p->Prop->Asn),p->Prop->Phi, p->Prop->Psi,p->Prop->Solv); if( Cmd->BrookhavenAsn ) { Tmp[26] = p->Prop->PdbAsn; Tmp[25] = ' '; Tmp[27] = ' '; } if( Cmd->DsspAsn ) { Tmp[28] = p->Prop->DsspAsn; Tmp[27] = ' '; Tmp[29] = ' '; sprintf(Tmp1," %6.1f ",p->Prop->DsspSolv); strcat(Tmp,Tmp1); } Glue(Bf,Tmp,Out); } } } void ReportHydrBonds(CHAIN **Chain, int NChain, HBOND **HBond, FILE *Out, COMMAND *Cmd) { register int i, k, Cn; int Cnt, Res; BUFFER Bf, Tmp, Tmp1; HBOND *p; RESIDUE *r; PrepareBuffer(Bf,Chain); Glue(Bf,"REM",Out); sprintf(Tmp,"REM ------------------ "); strcat(Tmp,"Mainchain hydrogen bonds"); strcat(Tmp," ------------------------"); Glue(Bf,Tmp,Out); Glue(Bf,"REM",Out); Glue(Bf,"REM Definition of Stickle et al., J.Mol.Biol. 226:1143-1159, 1992",Out); Glue(Bf,"REM A1 is the angle between the planes of donor complex and O..N-C",Out); Glue(Bf,"REM A2 is the angle between the planes of acceptor complex and N..O=C",Out); Glue(Bf,"REM",Out); sprintf(Tmp,"HBT %-6d",Chain[0]->NHydrBondTotal); Glue(Bf,Tmp,Out); sprintf(Tmp,"HBI %-6d",Chain[0]->NHydrBondInterchain); Glue(Bf,Tmp,Out); for( Cn=0; CnValid ) { sprintf(Tmp,"HBC %-6d %s %c %4d", Chain[Cn]->NHydrBond,Chain[Cn]->File,SpaceToDash(Chain[Cn]->Id),Chain[Cn]->NRes); Glue(Bf,Tmp,Out); } Glue(Bf,"REM",Out); Glue(Bf,"REM |--Residue 1--| |--Residue 2--| N-O N..O=C O..N-C A1 A2",Out); for( Cn=0; CnValid ) continue; for( i=0; iNRes; i++ ) { r = Chain[Cn]->Rsd[i]; Cnt = 0; for( k=0; kInv->NBondDnr; k++ ) { p = HBond[r->Inv->HBondDnr[k]]; if( p->ExistHydrBondRose ) { Res = p->Acc->A_Res; sprintf(Tmp,"DNR %4s %c %4s %4d -> ", r->ResType,SpaceToDash(Chain[Cn]->Id),r->PDB_ResNumb,i); sprintf(Tmp1,"%4s %c %4s %4d %4.1f %6.1f %6.1f %6.1f %6.1f ", p->Acc->Chain->Rsd[Res]->ResType, /* patch replace SpaceToDash(Chain[Cn]->Id), */ SpaceToDash(p->Acc->Chain->Id), p->Acc->Chain->Rsd[Res]->PDB_ResNumb,Res,p->AccDonDist,p->AccAng, p->DonAng,p->AccDonAng,p->DonAccAng); strcat(Tmp,Tmp1); Glue(Bf,Tmp,Out); Cnt++; } } Cnt = 0; for( k=0; kInv->NBondAcc; k++ ) { p = HBond[r->Inv->HBondAcc[k]]; if( p->ExistHydrBondRose ) { Res = p->Dnr->D_Res; sprintf(Tmp,"ACC %4s %c %4s %4d -> ", r->ResType,SpaceToDash(Chain[Cn]->Id),r->PDB_ResNumb,i); sprintf(Tmp1,"%4s %c %4s %4d %4.1f %6.1f %6.1f %6.1f %6.1f ", p->Dnr->Chain->Rsd[Res]->ResType, /* patch replace SpaceToDash(Chain[Cn]->Id), */ SpaceToDash(p->Dnr->Chain->Id), p->Dnr->Chain->Rsd[Res]->PDB_ResNumb,Res,p->AccDonDist, p->AccAng,p->DonAng,p->AccDonAng,p->DonAccAng); strcat(Tmp,Tmp1); Glue(Bf,Tmp,Out); Cnt++; } } } } } void ReportSSBonds(CHAIN **Chain, FILE *Out) { register int i; BUFFER Bf, Tmp; SSBOND *s; if( !Chain[0]->NBond ) return; PrepareBuffer(Bf,Chain); for( i=0; iNBond; i++ ) { s = Chain[0]->SSbond[i]; sprintf(Tmp,"LOC Disulfide CYS %4s %c CYS %4s %c ", s->PDB_ResNumb1,SpaceToDash(s->ChainId1), s->PDB_ResNumb2,SpaceToDash(s->ChainId2)); if( s->AsnSource == Pdb ) strcat(Tmp," PDB"); else strcat(Tmp,"STRIDE\n"); Glue(Bf,Tmp,Out); } } void ReportTurnTypes(CHAIN **Chain, int NChain, FILE *Out, COMMAND *Cmd) { register int Cn, Tn; BUFFER Bf, Tmp; TURN *t; Tn = 0; for( Cn=0; CnValid ) Tn += Chain[Cn]->NAssignedTurn; if( !Tn ) return; PrepareBuffer(Bf,Chain); for( Cn=0; CnValid ) continue; for( Tn=0; TnNAssignedTurn; Tn++ ) { t = Chain[Cn]->AssignedTurn[Tn]; sprintf(Tmp,"LOC %-11s %3s %4s %c %3s %4s %c", Translate(t->TurnType),t->Res1,t->PDB_ResNumb1, SpaceToDash(Chain[Cn]->Id),t->Res2, t->PDB_ResNumb2,SpaceToDash(Chain[Cn]->Id)); Glue(Bf,Tmp,Out); } } } void ReportShort(CHAIN **Chain, int NChain, FILE *Out, COMMAND *Cmd) { register int Cn, i; BUFFER Bf, Tmp; char *Asn; static char *StrTypes = "HGIE"; int Bound[MAX_ASSIGN][2], NStr; if( !ExistsSecStr(Chain,NChain) ) return; PrepareBuffer(Bf,Chain); Glue(Bf,"REM",Out); Glue(Bf,"REM",Out); Glue(Bf,"REM",Out); for( ; *StrTypes!= '\0'; StrTypes++ ) { for( Cn=0; CnValid ) continue; Asn = (char *)ckalloc(Chain[Cn]->NRes*sizeof(char)); ExtractAsn(Chain,Cn,Asn); NStr = Boundaries(Asn,Chain[Cn]->NRes,(*StrTypes),Bound); for( i=0; iRsd[Bound[i][0]]->ResType, Chain[Cn]->Rsd[Bound[i][0]]->PDB_ResNumb, SpaceToDash(Chain[Cn]->Id), Chain[Cn]->Rsd[Bound[i][1]]->ResType, Chain[Cn]->Rsd[Bound[i][1]]->PDB_ResNumb, SpaceToDash(Chain[Cn]->Id)); Glue(Bf,Tmp,Out); } free(Asn); } } } void PrepareBuffer(BUFFER Bf, CHAIN **Chain) { memset(Bf,' ',OUTPUTWIDTH); strcpy(Bf+OUTPUTWIDTH-5,Chain[0]->PdbIdent); Bf[OUTPUTWIDTH] = '\0'; Bf[OUTPUTWIDTH-1] = '\n'; } void Glue(char *String1, char *String2, FILE *Out) { BUFFER Bf; strcpy(Bf,String1); strncpy(Bf,String2,(int)strlen(String2)); fprintf(Out,"%s",Bf); }