You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

486 lines
18 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 FillAsnAntiPar(char *Asn1, char *Asn2, CHAIN **Chain, int Cn1, int Cn2,
PATTERN **Pat, int NPat, COMMAND *Cmd)
{
register int i, j;
int Beg1, Beg2, End1, End2;
int B1D, B1A, B2D, B2A, E1D, E1A, E2D, E2A;
char B1DCn, B1ACn, B2DCn, B2ACn, E1DCn, E1ACn, E2DCn, E2ACn, Beg1Cn, Beg2Cn;
PATTERN *CurrPat, *PrevPat;;
for( i=0; i<NPat; i++ ) {
if( Pat[i]->Nei1 != NULL && Pat[i]->Nei2 == NULL )
CurrPat = Pat[i]->Nei1;
else
if( Pat[i]->Nei2 != NULL && Pat[i]->Nei1 == NULL )
CurrPat = Pat[i]->Nei2;
else
continue;
if( Cmd->Info ) {
fprintf(stdout,"From: %c %c ",
Pat[i]->Hb1->Dnr->Chain->Id,Pat[i]->Hb2->Dnr->Chain->Id);
if( Pat[i]->Hb1->Dnr->Chain->Id == Chain[Cn1]->Id )
fprintf(stdout,"%s %s %s %s \n",
Chain[Cn1]->Rsd[Pat[i]->Hb1->Dnr->D_Res]->PDB_ResNumb,
Chain[Cn2]->Rsd[Pat[i]->Hb1->Acc->A_Res]->PDB_ResNumb,
Chain[Cn2]->Rsd[Pat[i]->Hb2->Dnr->D_Res]->PDB_ResNumb,
Chain[Cn1]->Rsd[Pat[i]->Hb2->Acc->A_Res]->PDB_ResNumb);
else
fprintf(stdout,"%s %s %s %s \n",
Chain[Cn2]->Rsd[Pat[i]->Hb1->Dnr->D_Res]->PDB_ResNumb,
Chain[Cn1]->Rsd[Pat[i]->Hb1->Acc->A_Res]->PDB_ResNumb,
Chain[Cn1]->Rsd[Pat[i]->Hb2->Dnr->D_Res]->PDB_ResNumb,
Chain[Cn2]->Rsd[Pat[i]->Hb2->Acc->A_Res]->PDB_ResNumb);
}
PrevPat = Pat[i];
while( CurrPat->Nei1 != NULL && CurrPat->Nei2 != NULL ) {
if( (CurrPat->Nei1->Nei1 == CurrPat || CurrPat->Nei1->Nei2 == CurrPat) &&
CurrPat->Nei1 != PrevPat ) {
PrevPat = CurrPat;
CurrPat = CurrPat->Nei1;
}
else
if( (CurrPat->Nei2->Nei1 == CurrPat || CurrPat->Nei2->Nei2 == CurrPat) &&
CurrPat->Nei2 != PrevPat ) {
PrevPat = CurrPat;
CurrPat = CurrPat->Nei2;
}
else {
fprintf(stdout,"Cycle Anti%s%c i = %d \n",Chain[Cn1]->File,Chain[Cn1]->Id,i);
break;
}
}
if( Cmd->Info ) {
fprintf(stdout,"To: %c %c ",
CurrPat->Hb1->Dnr->Chain->Id,CurrPat->Hb2->Dnr->Chain->Id);
if( CurrPat->Hb1->Dnr->Chain->Id == Chain[Cn1]->Id )
fprintf(stdout,"%s %s %s %s \n",
Chain[Cn1]->Rsd[CurrPat->Hb1->Dnr->D_Res]->PDB_ResNumb,
Chain[Cn2]->Rsd[CurrPat->Hb1->Acc->A_Res]->PDB_ResNumb,
Chain[Cn2]->Rsd[CurrPat->Hb2->Dnr->D_Res]->PDB_ResNumb,
Chain[Cn1]->Rsd[CurrPat->Hb2->Acc->A_Res]->PDB_ResNumb);
else
fprintf(stdout,"%s %s %s %s \n",
Chain[Cn2]->Rsd[CurrPat->Hb1->Dnr->D_Res]->PDB_ResNumb,
Chain[Cn1]->Rsd[CurrPat->Hb1->Acc->A_Res]->PDB_ResNumb,
Chain[Cn1]->Rsd[CurrPat->Hb2->Dnr->D_Res]->PDB_ResNumb,
Chain[Cn2]->Rsd[CurrPat->Hb2->Acc->A_Res]->PDB_ResNumb);
}
Alias(&B1D,&B1A,&B2D,&B2A,&B1DCn,&B1ACn,&B2DCn,&B2ACn,Pat[i]);
Alias(&E1D,&E1A,&E2D,&E2A,&E1DCn,&E1ACn,&E2DCn,&E2ACn,CurrPat);
if( (Cn1 != Cn2 || E1D - B2A < E2D - B2A ) &&
( MakeEnds(&Beg1,B1D,B2A,&Beg1Cn,B1DCn,&End1,E2A,E1D,E2ACn,&Beg2,E2D,E1A,&Beg2Cn,E2DCn,
&End2,B1A,B2D,B1ACn,Pat,NPat) ||
MakeEnds(&Beg1,B1D,B2A,&Beg1Cn,B1DCn,&End1,E1D,E2A,E1DCn,&Beg2,E1A,E2D,&Beg2Cn,E1ACn,
&End2,B1A,B2D,B1ACn,Pat,NPat) ) )
;
else
if( ( Cn1 != Cn2 || E2D - B2A < E1D - B2A ) &&
( MakeEnds(&Beg1,B1D,B2A,&Beg1Cn,B1DCn,&End1,E1A,E2D,E1ACn,&Beg2,E1D,E2A,&Beg2Cn,E1DCn,
&End2,B1A,B2D,B1ACn,Pat,NPat) ||
MakeEnds(&Beg1,B1D,B2A,&Beg1Cn,B1DCn,&End1,E2D,E1A,E2DCn,&Beg2,E2A,E1D,&Beg2Cn,E2ACn,
&End2,B1A,B2D,B1ACn,Pat,NPat) ) )
;
else
if( ( Cn1 != Cn2 || B2A - E1D < B2A - E2D ) &&
( MakeEnds(&Beg1,B1A,B2D,&Beg1Cn,B1ACn,&End1,E2D,E1A,E2DCn,&Beg2,E2A,E1D,&Beg2Cn,E2ACn,
&End2,B1D,B2A,B1DCn,Pat,NPat) ||
MakeEnds(&Beg1,B1A,B2D,&Beg1Cn,B1ACn,&End1,E1A,E2D,E1ACn,&Beg2,E1D,E2A,&Beg2Cn,E1DCn,
&End2,B1D,B2A,B1DCn,Pat,NPat) ) )
;
else
if( ( Cn1 != Cn2 || B2A - E2D < B2A - E1D ) &&
( MakeEnds(&Beg1,B1A,B2D,&Beg1Cn,B1ACn,&End1,E1D,E2A,E1DCn,&Beg2,E1A,E2D,&Beg2Cn,E1ACn,
&End2,B1D,B2A,B1DCn,Pat,NPat) ||
MakeEnds(&Beg1,B1A,B2D,&Beg1Cn,B1ACn,&End1,E2A,E1D,E2ACn,&Beg2,E2D,E1A,&Beg2Cn,E2DCn,
&End2,B1D,B2A,B1DCn,Pat,NPat) ) )
;
else
if( ( Cn1 != Cn2 || B1D - E2A < B2D - E2A ) &&
( MakeEnds(&Beg1,E1D,E2A,&Beg1Cn,E1DCn,&End1,B2A,B1D,B2ACn,&Beg2,B2D,B1A,&Beg2Cn,B2DCn,
&End2,E1A,E2D,E1ACn,Pat,NPat) ||
MakeEnds(&Beg1,E1D,E2A,&Beg1Cn,E1DCn,&End1,B1D,B2A,B1DCn,&Beg2,B1A,B2D,&Beg2Cn,B1ACn,
&End2,E1A,E2D,E1ACn,Pat,NPat) ) )
;
else
if( ( Cn1 != Cn2 || B2D - E2A < B1D - E2A ) &&
( MakeEnds(&Beg1,E1D,E2A,&Beg1Cn,E1DCn,&End1,B1A,B2D,B1ACn,&Beg2,B1D,B2A,&Beg2Cn,B1DCn,
&End2,E1A,E2D,E1ACn,Pat,NPat) ||
MakeEnds(&Beg1,E1D,E2A,&Beg1Cn,E1DCn,&End1,B2D,B1A,B2DCn,&Beg2,B2A,B1D,&Beg2Cn,B2ACn,
&End2,E1A,E2D,E1ACn,Pat,NPat) ) )
;
else
if( ( Cn1 != Cn2 || E2A - B1D < E2A - B2D ) &&
( MakeEnds(&Beg1,E1A,E2D,&Beg1Cn,E1ACn,&End1,B2D,B1A,B2DCn,&Beg2,B2A,B1D,&Beg2Cn,B2ACn,
&End2,E1D,E2A,E1DCn,Pat,NPat) ||
MakeEnds(&Beg1,E1A,E2D,&Beg1Cn,E1ACn,&End1,B1A,B2D,B1ACn,&Beg2,B1D,B2A,&Beg2Cn,B1DCn,
&End2,E1D,E2A,E1DCn,Pat,NPat) ) )
;
else
if( ( Cn1 != Cn2 || E2A - B2D < E2A - B1D ) &&
( MakeEnds(&Beg1,E1A,E2D,&Beg1Cn,E1ACn,&End1,B1D,B2A,B1DCn,&Beg2,B1A,B2D,&Beg2Cn,B1ACn,
&End2,E1D,E2A,E1DCn,Pat,NPat) ||
MakeEnds(&Beg1,E1A,E2D,&Beg1Cn,E1ACn,&End1,B2A,B1D,B2ACn,&Beg2,B2D,B1A,&Beg2Cn,B2DCn,
&End2,E1D,E2A,E1DCn,Pat,NPat) ) )
;
else {
/* fprintf(stdout,"Ne tot variant.. Anti.. %s%c\n",Chain[Cn1]->File,Chain[Cn1]->Id);*/
continue;
}
if( Beg1Cn == Chain[Cn1]->Id ) {
for( j=Beg1; j<=End1; j++ )
Asn1[j] = 'N';
for( j=Beg2; j<=End2; j++ )
Asn2[j] = 'N';
}
else {
for( j=Beg1; j<=End1; j++ )
Asn2[j] = 'N';
for( j=Beg2; j<=End2; j++ )
Asn1[j] = 'N';
}
Pat[i]->Nei1 = NULL;
Pat[i]->Nei2 = NULL;
CurrPat->Nei1 = NULL;
CurrPat->Nei2 = NULL;
}
}
void FillAsnPar(char *Asn1, char *Asn2, CHAIN **Chain, int Cn1, int Cn2,
PATTERN **Pat, int NPat, COMMAND *Cmd)
{
register int i, j;
int Beg1, Beg2, End1, End2;
int B1D, B1A, B2D, B2A, E1D, E1A, E2D, E2A;
char B1DCn, B1ACn, B2DCn, B2ACn, E1DCn, E1ACn, E2DCn, E2ACn, Beg1Cn, Beg2Cn;
PATTERN *CurrPat, *PrevPat;;
for( i=0; i<NPat; i++ ) {
if( Pat[i]->Nei1 != NULL && Pat[i]->Nei2 == NULL )
CurrPat = Pat[i]->Nei1;
else
if( Pat[i]->Nei2 != NULL && Pat[i]->Nei1 == NULL )
CurrPat = Pat[i]->Nei2;
else
continue;
if( Cmd->Info ) {
fprintf(stdout,"From: %c %c ",
Pat[i]->Hb1->Dnr->Chain->Id,Pat[i]->Hb2->Dnr->Chain->Id);
if( Pat[i]->Hb1->Dnr->Chain->Id == Chain[Cn1]->Id )
fprintf(stdout,"%s %s %s %s \n",
Chain[Cn1]->Rsd[Pat[i]->Hb1->Dnr->D_Res]->PDB_ResNumb,
Chain[Cn2]->Rsd[Pat[i]->Hb1->Acc->A_Res]->PDB_ResNumb,
Chain[Cn2]->Rsd[Pat[i]->Hb2->Dnr->D_Res]->PDB_ResNumb,
Chain[Cn1]->Rsd[Pat[i]->Hb2->Acc->A_Res]->PDB_ResNumb);
else
fprintf(stdout,"%s %s %s %s \n",
Chain[Cn2]->Rsd[Pat[i]->Hb1->Dnr->D_Res]->PDB_ResNumb,
Chain[Cn1]->Rsd[Pat[i]->Hb1->Acc->A_Res]->PDB_ResNumb,
Chain[Cn1]->Rsd[Pat[i]->Hb2->Dnr->D_Res]->PDB_ResNumb,
Chain[Cn2]->Rsd[Pat[i]->Hb2->Acc->A_Res]->PDB_ResNumb);
}
PrevPat = Pat[i];
while( CurrPat->Nei1 != NULL && CurrPat->Nei2 != NULL ) {
if( (CurrPat->Nei1->Nei1 == CurrPat || CurrPat->Nei1->Nei2 == CurrPat) &&
CurrPat->Nei1 != PrevPat ) {
PrevPat = CurrPat;
CurrPat = CurrPat->Nei1;
}
else {
PrevPat = CurrPat;
CurrPat = CurrPat->Nei2;
}
}
if( Cmd->Info ) {
fprintf(stdout,"To: %c %c ",
CurrPat->Hb1->Dnr->Chain->Id,CurrPat->Hb2->Dnr->Chain->Id);
if( CurrPat->Hb1->Dnr->Chain->Id == Chain[Cn1]->Id )
fprintf(stdout,"%s %s %s %s \n",
Chain[Cn1]->Rsd[CurrPat->Hb1->Dnr->D_Res]->PDB_ResNumb,
Chain[Cn2]->Rsd[CurrPat->Hb1->Acc->A_Res]->PDB_ResNumb,
Chain[Cn2]->Rsd[CurrPat->Hb2->Dnr->D_Res]->PDB_ResNumb,
Chain[Cn1]->Rsd[CurrPat->Hb2->Acc->A_Res]->PDB_ResNumb);
else
fprintf(stdout,"%s %s %s %s \n",
Chain[Cn2]->Rsd[CurrPat->Hb1->Dnr->D_Res]->PDB_ResNumb,
Chain[Cn1]->Rsd[CurrPat->Hb1->Acc->A_Res]->PDB_ResNumb,
Chain[Cn1]->Rsd[CurrPat->Hb2->Dnr->D_Res]->PDB_ResNumb,
Chain[Cn2]->Rsd[CurrPat->Hb2->Acc->A_Res]->PDB_ResNumb);
}
Alias(&B1D,&B1A,&B2D,&B2A,&B1DCn,&B1ACn,&B2DCn,&B2ACn,Pat[i]);
Alias(&E1D,&E1A,&E2D,&E2A,&E1DCn,&E1ACn,&E2DCn,&E2ACn,CurrPat);
if( ( Cn1 != Cn2 || abs(E1D-B2A) < abs(E2D-B2A) ) &&
( MakeEnds(&Beg1,B1D,B2A,&Beg1Cn,B1DCn,&End1,E2A,E1D,E2ACn,&Beg2,B1A,B2D,&Beg2Cn,B1ACn,
&End2,E2D,E1A,E2DCn,Pat,NPat) ||
MakeEnds(&Beg1,B1D,B2A,&Beg1Cn,B1DCn,&End1,E1D,E2A,E1DCn,&Beg2,B1A,B2D,&Beg2Cn,B1ACn,
&End2,E1A,E2D,E1ACn,Pat,NPat) ) )
;
else
if( ( Cn1 != Cn2 || abs(E2D-B2A) < abs(E1D-B2A) ) &&
( MakeEnds(&Beg1,B1D,B2A,&Beg1Cn,B1DCn,&End1,E1A,E2D,E1ACn,&Beg2,B1A,B2D,&Beg2Cn,B1ACn,
&End2,E1D,E2A,E1DCn,Pat,NPat) ||
MakeEnds(&Beg1,B1D,B2A,&Beg1Cn,B1DCn,&End1,E2D,E1A,E2DCn,&Beg2,B1A,B2D,&Beg2Cn,B1ACn,
&End2,E2A,E1D,E2ACn,Pat,NPat) ) )
;
else
if( ( Cn1 != Cn2 || abs(B2A-E1D) < abs(B2A-E2D) ) &&
( MakeEnds(&Beg1,B1A,B2D,&Beg1Cn,B1ACn,&End1,E2D,E1A,E2DCn,&Beg2,B1D,B2A,&Beg2Cn,B1DCn,
&End2,E2A,E1D,E2ACn,Pat,NPat) ||
MakeEnds(&Beg1,B1A,B2D,&Beg1Cn,B1ACn,&End1,E1A,E2D,E1ACn,&Beg2,B1D,B2A,&Beg2Cn,B1DCn,
&End2,E1D,E2A,E1DCn,Pat,NPat) ) )
;
else
if( ( Cn1 != Cn2 || abs(B2A-E2D) < abs(B2A-E1D) ) &&
( MakeEnds(&Beg1,B1A,B2D,&Beg1Cn,B1ACn,&End1,E1D,E2A,E1DCn,&Beg2,B1D,B2A,&Beg2Cn,B1DCn,
&End2,E1A,E2D,E1ACn,Pat,NPat) ||
MakeEnds(&Beg1,B1A,B2D,&Beg1Cn,B1ACn,&End1,E2A,E1D,E2ACn,&Beg2,B1D,B2A,&Beg2Cn,B1DCn,
&End2,E2D,E1A,E2DCn,Pat,NPat) ) )
;
else
if( ( Cn1 != Cn2 || abs(B1D-E2A) < abs(B2D-E2A) ) &&
( MakeEnds(&Beg1,E1D,E2A,&Beg1Cn,E1DCn,&End1,B2A,B1D,B2ACn,&Beg2,E1A,E2D,&Beg2Cn,E1ACn,
&End2,B2D,B1A,B2DCn,Pat,NPat) ||
MakeEnds(&Beg1,E1D,E2A,&Beg1Cn,E1DCn,&End1,B1D,B2A,B1DCn,&Beg2,E1A,E2D,&Beg2Cn,E1ACn,
&End2,B1A,B2D,B1ACn,Pat,NPat) ) )
;
else
if( ( Cn1 != Cn2 || abs(B2D-E2A) < abs(B1D-E2A) ) &&
( MakeEnds(&Beg1,E1D,E2A,&Beg1Cn,E1DCn,&End1,B1A,B2D,B1ACn,&Beg2,E1A,E2D,&Beg2Cn,E1ACn,
&End2,B1D,B2A,B1DCn,Pat,NPat) ||
MakeEnds(&Beg1,E1D,E2A,&Beg1Cn,E1DCn,&End1,B2D,B1A,B2DCn,&Beg2,E1A,E2D,&Beg2Cn,E1ACn,
&End2,B2A,B1D,B2ACn,Pat,NPat) ) )
;
else
if( ( Cn1 != Cn2 || abs(E2A-B1D) < abs(E2A-B2D) ) &&
( MakeEnds(&Beg1,E1A,E2D,&Beg1Cn,E1ACn,&End1,B2D,B1A,B2DCn,&Beg2,E1D,E2A,&Beg2Cn,E1DCn,
&End2,B2A,B1D,B2ACn,Pat,NPat) ||
MakeEnds(&Beg1,E1A,E2D,&Beg1Cn,E1ACn,&End1,B1A,B2D,B1ACn,&Beg2,E1D,E2A,&Beg2Cn,E1DCn,
&End2,B1D,B2A,B1DCn,Pat,NPat) ) )
;
else
if( ( Cn1 != Cn2 || abs(E2A-B2D) < abs(E2A-B1D) ) &&
( MakeEnds(&Beg1,E1A,E2D,&Beg1Cn,E1ACn,&End1,B1D,B2A,B1DCn,&Beg2,E1D,E2A,&Beg2Cn,E1DCn,
&End2,B1A,B2D,B1ACn,Pat,NPat) ||
MakeEnds(&Beg1,E1A,E2D,&Beg1Cn,E1ACn,&End1,B2A,B1D,B2ACn,&Beg2,E1D,E2A,&Beg2Cn,E1DCn,
&End2,B2D,B1A,B2DCn,Pat,NPat) ) )
;
else {
/* fprintf(stdout,"Ne tot variant.. Par %s%c\n",Chain[Cn1]->File,Chain[Cn1]->Id);*/
continue;
}
if( Beg1Cn == Chain[Cn1]->Id ) {
for( j=Beg1; j<=End1; j++ ) Asn1[j] = 'P';
for( j=Beg2; j<=End2; j++ ) Asn2[j] = 'P';
}
else {
for( j=Beg1; j<=End1; j++ ) Asn2[j] = 'P';
for( j=Beg2; j<=End2; j++ ) Asn1[j] = 'P';
}
Pat[i]->Nei1 = NULL;
Pat[i]->Nei2 = NULL;
CurrPat->Nei1 = NULL;
CurrPat->Nei2 = NULL;
}
}
int MakeEnds(int *Beg1, int ResBeg1, int NeiBeg1, char *Beg1Cn, char ResBeg1Cn, int *End1,
int ResEnd1, int NeiEnd1, char ResEnd1Cn, int *Beg2, int ResBeg2, int NeiBeg2,
char *Beg2Cn, char ResBeg2Cn, int *End2, int ResEnd2, int NeiEnd2,
char ResEnd2Cn, PATTERN **Pat, int NPat)
{
register int i;
int Flag1 = 0, Flag2 = 0;
if( ResBeg1 <= NeiBeg1 && NeiBeg1 <= NeiEnd1 && NeiEnd1 <= ResEnd1 &&
ResBeg2 <= NeiBeg2 && NeiBeg2 <= NeiEnd2 && NeiEnd2 <= ResEnd2 &&
ResBeg1Cn == ResEnd1Cn && ResBeg2Cn == ResEnd2Cn ) {
*Beg1 = ResBeg1;
*End1 = ResEnd1;
*Beg2 = ResBeg2;
*End2 = ResEnd2;
*Beg1Cn = ResBeg1Cn;
*Beg2Cn = ResBeg2Cn;
for( i=0; i<NPat && (Flag1 == 0 || Flag2 == 0); i++ ) {
if( ( (Pat[i]->Hb1->Dnr->D_Res == (*Beg1)
&& Pat[i]->Hb1->Acc->A_Res == (*End2)
&& Pat[i]->Hb1->Dnr->Chain->Id == (*Beg1Cn)
&& Pat[i]->Hb1->Acc->Chain->Id == (*Beg2Cn) )
||
(Pat[i]->Hb1->Acc->A_Res == (*Beg1)
&& Pat[i]->Hb1->Dnr->D_Res == (*End2)
&& Pat[i]->Hb1->Acc->Chain->Id == (*Beg1Cn)
&& Pat[i]->Hb1->Dnr->Chain->Id == (*Beg2Cn) ) )
&& Pat[i]->Hb1->Dnr->D_Res == Pat[i]->Hb2->Acc->A_Res
&& Pat[i]->Hb2->Dnr->D_Res == Pat[i]->Hb1->Acc->A_Res )
Flag1 = 1;
if( ( (Pat[i]->Hb1->Dnr->D_Res == (*Beg2)
&& Pat[i]->Hb1->Acc->A_Res == (*End1)
&& Pat[i]->Hb1->Dnr->Chain->Id == (*Beg2Cn)
&& Pat[i]->Hb1->Acc->Chain->Id == (*Beg1Cn) )
||
(Pat[i]->Hb1->Acc->A_Res == (*Beg2)
&& Pat[i]->Hb1->Dnr->D_Res == (*End1)
&& Pat[i]->Hb1->Acc->Chain->Id == (*Beg2Cn)
&& Pat[i]->Hb1->Dnr->Chain->Id == (*Beg1Cn) ) )
&& Pat[i]->Hb1->Dnr->D_Res == Pat[i]->Hb2->Acc->A_Res
&& Pat[i]->Hb2->Dnr->D_Res == Pat[i]->Hb1->Acc->A_Res )
Flag2 = 1;
}
if( !Flag1 ) {
if( *Beg1 != NeiBeg1 ) (*Beg1)++;
if( *End2 != NeiEnd2 ) (*End2)--;
}
if( !Flag2 ) {
if( *End1 != NeiEnd1 ) (*End1)--;
if( *Beg2 != NeiBeg2 ) (*Beg2)++;
}
return(SUCCESS);
}
return(FAILURE);
}
void FilterAntiPar(PATTERN **Pat, int NPat)
{
register int i, j;
int I1A, I1D, I2A, I2D, J1A, J1D, J2A, J2D;
char I1ACn, I1DCn, I2ACn, I2DCn, J1ACn, J1DCn, J2ACn, J2DCn;
for( i=0; i<NPat; i++ ) {
if( !Pat[i]->ExistPattern ) continue;
Alias(&I1D,&I1A,&I2D,&I2A,&I1DCn,&I1ACn,&I2DCn,&I2ACn,Pat[i]);
for( j=0; j<NPat; j++ ) {
if( j == i || !Pat[j]->ExistPattern ) continue;
Alias(&J1D,&J1A,&J2D,&J2A,&J1DCn,&J1ACn,&J2DCn,&J2ACn,Pat[j]);
if( J1D == J2A && J2D == J1A && I1D != I2A && I2D != I1A &&
( (J1D == I1D && J1A == I1A) || (J1D == I1A && J1A == I1D) ||
(J1D == I2A && J1A == I2D) || (J1D == I2D && J1A == I2A) ) ) continue;
if( ( ( I1D < I2A || I2D < I1A ) &&
( (J1A <= I2A && J1A >= I1D && J2D <= I2A && J2D >= I1D && J2DCn == I1DCn &&
J2A <= I1A && J2A >= I2D && J1D <= I1A && J1D >= I2D && J1DCn == I2DCn) ||
(J2A <= I2A && J2A >= I1D && J1D <= I2A && J1D >= I1D && J1DCn == I1DCn &&
J1A <= I1A && J1A >= I2D && J2D <= I1A && J2D >= I2D && J2DCn == I2DCn) ) ) ||
( ( I1D > I2A || I2D > I1A ) &&
( (J1A >= I2A && J1A <= I1D && J2D >= I2A && J2D <= I1D && J2DCn == I1DCn &&
J2A >= I1A && J2A <= I2D && J1D >= I1A && J1D <= I2D && J1DCn == I2DCn) ||
(J2A >= I2A && J2A <= I1D && J1D >= I2A && J1D <= I1D && J1DCn == I1DCn &&
J1A >= I1A && J1A <= I2D && J2D >= I1A && J2D <= I2D && J2DCn == I2DCn) ) ) ) {
Pat[j]->ExistPattern = NO;
}
}
}
}
void FilterPar(PATTERN **Pat, int NPat)
{
register int i, j;
int I1A, I1D, I2A, I2D, J1A, J1D, J2A, J2D;
char I1ACn, I1DCn, I2ACn, I2DCn, J1ACn, J1DCn, J2ACn, J2DCn;
for( i=0; i<NPat; i++ ) {
if( !Pat[i]->ExistPattern ) continue;
Alias(&I1D,&I1A,&I2D,&I2A,&I1DCn,&I1ACn,&I2DCn,&I2ACn,Pat[i]);
for( j=0; j<NPat; j++ ) {
if( j == i || !Pat[j]->ExistPattern ) continue;
Alias(&J1D,&J1A,&J2D,&J2A,&J1DCn,&J1ACn,&J2DCn,&J2ACn,Pat[j]);
if( ( ( I1A >= I2D && I1D >= I2A ) &&
( (J1A >= I2A && J1A <= I1D && J2D >= I2A && J2D <= I1D && J2DCn == I1DCn &&
J2A <= I1A && J2A >= I2D && J1D <= I1A && J1D >= I2D && J1DCn == I2DCn) ||
(J2A >= I2A && J2A <= I1D && J1D >= I2A && J1D <= I1D && J1DCn == I1DCn &&
J1A <= I1A && J1A >= I2D && J2D <= I1A && J2D >= I2D && J2DCn == I2DCn) ) ) ||
( I2A >= I1D && I2D >= I1A &&
( (J1A <= I2A && J1A >= I1D && J2D <= I2A && J2D >= I1D && J2DCn == I1DCn &&
J2A >= I1A && J2A <= I2D && J1D >= I1A && J1D <= I2D && J1DCn == I2DCn) ||
(J2A <= I2A && J2A >= I1D && J1D <= I2A && J1D >= I1D && J1DCn == I1DCn &&
J1A >= I1A && J1A <= I2D && J2D >= I1A && J2D <= I2D && J2DCn == I2DCn) ) ) ) {
Pat[j]->ExistPattern = NO;
}
}
}
}
void Alias(int *D1,int *A1,int *D2,int *A2,char *D1Cn,char *A1Cn,char *D2Cn,char *A2Cn,
PATTERN *Pat)
{
*D1 = Pat->Hb1->Dnr->D_Res;
*A1 = Pat->Hb1->Acc->A_Res;
*D2 = Pat->Hb2->Dnr->D_Res;
*A2 = Pat->Hb2->Acc->A_Res;
*D1Cn = Pat->Hb1->Dnr->Chain->Id;
*A1Cn = Pat->Hb1->Acc->Chain->Id;
*D2Cn = Pat->Hb2->Dnr->Chain->Id;
*A2Cn = Pat->Hb2->Acc->Chain->Id;
}