442 lines
11 KiB
C
442 lines
11 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"
|
|
|
|
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; i<Chain[0]->NInfo; 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; Cn<NChain; Cn++ ) {
|
|
|
|
if( !Chain[Cn]->Valid )
|
|
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; i<NBlocks; i++ ) {
|
|
|
|
Glue(Bf,"REM",Out);
|
|
From = i*Width;
|
|
if( i == NBlocks-1 && Tail )
|
|
CurrWidth = Tail;
|
|
else
|
|
CurrWidth = Width;
|
|
To = From+CurrWidth;
|
|
|
|
sprintf(Tmp,"REM ");
|
|
for( j=0; j<CurrWidth; j++ )
|
|
if( j && (j+1)%10 == 0 )
|
|
strcat(Tmp,".");
|
|
else
|
|
strcat(Tmp," ");
|
|
Glue(Bf,Tmp,Out);
|
|
|
|
sprintf(Tmp,"SEQ %-4d ",From+1);
|
|
for( j=From; j<From+Width; j++ ) {
|
|
if( j < To )
|
|
sprintf(Tmp1,"%c",ThreeToOne(Chain[Cn]->Rsd[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; j<To; j++ ) {
|
|
if( Chain[Cn]->Rsd[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; Cn<NChain; Cn++ ) {
|
|
|
|
if( !Chain[Cn]->Valid )
|
|
continue;
|
|
|
|
for( i=0; i<Chain[Cn]->NRes; 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; Cn<NChain; Cn++ )
|
|
if( Chain[Cn]->Valid ) {
|
|
|
|
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; Cn<NChain; Cn++ ) {
|
|
|
|
if( !Chain[Cn]->Valid )
|
|
continue;
|
|
|
|
for( i=0; i<Chain[Cn]->NRes; i++ ) {
|
|
|
|
r = Chain[Cn]->Rsd[i];
|
|
|
|
Cnt = 0;
|
|
for( k=0; k<r->Inv->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; k<r->Inv->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; i<Chain[0]->NBond; 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; Cn<NChain; Cn++ )
|
|
if( Chain[Cn]->Valid )
|
|
Tn += Chain[Cn]->NAssignedTurn;
|
|
|
|
if( !Tn ) return;
|
|
|
|
PrepareBuffer(Bf,Chain);
|
|
|
|
for( Cn=0; Cn<NChain; Cn++ ) {
|
|
if( !Chain[Cn]->Valid )
|
|
continue;
|
|
for( Tn=0; Tn<Chain[Cn]->NAssignedTurn; 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; Cn<NChain; Cn++ ) {
|
|
|
|
if( !Chain[Cn]->Valid )
|
|
continue;
|
|
|
|
Asn = (char *)ckalloc(Chain[Cn]->NRes*sizeof(char));
|
|
ExtractAsn(Chain,Cn,Asn);
|
|
NStr = Boundaries(Asn,Chain[Cn]->NRes,(*StrTypes),Bound);
|
|
|
|
for( i=0; i<NStr; i++ ) {
|
|
sprintf(Tmp,"LOC %-10s %3s %4s %c %3s %4s %c",Translate(*StrTypes),
|
|
Chain[Cn]->Rsd[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);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|