#include "stride.h" /************************************************************************* ** ** ** Remove short stretches of secondary structure from the assignment ** ** ** ** INPUT: *Asn String with one letter secondary structure ** ** assignment ** ** Length Length of the string ** ** SecStrType Type of the secondary structure to which this ** ** operation should be applied ** ** EditChar Character to be used instead of removed symbols ** ** MaxLength Maximal length of secondary struture segments to ** ** be removed ** ** ** ** OUTPUT: *Asn Edited secondary structure assignment ** ** ** *************************************************************************/ void CorrectAsn(char *Asn, int Length, char SecStrType, char EditChar, int MaxLength) { int NStr = 0, Res, Flag = 0, Bound[MAX_ASSIGN][2], i; for( Res=0; Res 0 && Res < Length-1 && Asn1[Res-1] != SecStrType && Asn2[Res-1] != SecStrType && Asn1[Res+1] != SecStrType && Asn2[Res+1] != SecStrType) ) ) Asn1[Res] = Asn2[Res] = EditChar; } /************************************************************************* ** ** ** Calculate the number of true positives, true negatives, false ** ** negatives and false positives resulting from comparison of test and ** ** known secondary structure assignments for a particular secondary ** ** structure type ** ** ** ** INPUT: *TestAsn String with one letter test secondary structure ** ** assignment ** ** *KnownAsn String with one letter known secondary structure ** ** assignment ** ** Length Length of the assignment ** ** SecStrType Type of the secondary structure to which this ** ** operation should be applied ** ** ** ** OUTPUT: *Quality Pointer to the structure with quality assessment ** ** ** *************************************************************************/ int Difference(char *TestAsn, char *KnownAsn, int Length, char SecStrType, QUALITY *Qual) { register int Res; Qual->TP = Qual->TN = Qual->FP = Qual->FN = 0; for( Res=0; ResTP++; else if( KnownAsn[Res] != SecStrType && TestAsn[Res] != SecStrType ) Qual->TN++; else if( KnownAsn[Res] != SecStrType && TestAsn[Res] == SecStrType ) Qual->FP++; else if( KnownAsn[Res] == SecStrType && TestAsn[Res] != SecStrType ) Qual->FN++; } } if( Qual->TP == 0 && Qual->TN == 0 && Qual->FP == 0 && Qual->FN == 0 ) { Qual->Perc = 0.0; return(FAILURE); } Qual->Perc = ((float)Qual->TP+(float)Qual->TN)/ ((float)Qual->TP+(float)Qual->TN+(float)Qual->FP+(float)Qual->FN); return(SUCCESS); } /************************************************************************* ** ** ** Calculate percent of the correctly assigned residues ** ** ** ** INPUT: *TestAsn String with one letter test secondary structure ** ** assignment ** ** *KnownAsn String with one letter known secondary structure ** ** assignment ** ** Length Length of the assignment ** ** ** ** RETURNS: Percent correct ** ** ** *************************************************************************/ float PercentCorrect(char *TestAsn, char *KnownAsn, int Length) { int Res, Count=0;; for( Res=0; ResCorr Correlation coefficient between the two ** ** assignments as suggested by B.Matthews ** ** (1975) Biochim. Biophys. Acta, 405, 442-451 ** ** Quality->Perc Percent correct ** ** ** *************************************************************************/ int AssessCorr(QUALITY *Qual) { float TP, TN, FP, FN; if( (Qual->TP == 0 && Qual->FN == 0) || (Qual->TP == 0 && Qual->FP == 0) ) return(FAILURE); else { TP = (float)Qual->TP; TN = (float)Qual->TN; FP = (float)Qual->FP; FN =(float)Qual->FN; Qual->Corr = (TP*TN - FN*FP)/sqrt((TN+FN)*(TN+FP)*(TP+FN)*(TP+FP)); return(SUCCESS); } } int AssessPerc(QUALITY *Qual) { float TP, TN, FP, FN; TP = (float)Qual->TP; TN = (float)Qual->TN; FP = (float)Qual->FP; FN =(float)Qual->FN; Qual->Perc = (TP+TN)/(TP+TN+FP+FN); return(SUCCESS); } void ExcludeObvious(char *Asn1, char *Asn2, char *KnownAsn, int Length) { register int i; for( i=0; i