[bionet.software] Bug in program PROFILESCAN

gribskov@FCRFV1.NCIFCRF.GOV ("Gribskov, Michael") (09/06/90)

BUG REPORT:

PROGRAM: ProfileScan

SOURCE: Michael Gribskov
        GRIBSKOV @ NCIFCRF.GOV

DESCRIPTION:  ProfileScan compares a sequence to a library of known 
sequence and structural motifs.  In the version distributed by GCG in 
the incremental release 6.2, and in versions distributed by myself 
numbered version 4.40 or lower, the bug causes ProfileScan to skip the 
library entry immediately following any entry that finds a match.  Such 
successive matches are rare, so this should not have caused serious 
problems.  

FIX: Modify the module ProfMalign as follows.  You will be less likely 
to make a mistake if you first get a listing of the module with line 
numbers as follows: $fortran/lis ProfMalign.  Line numbers are given 
below for both the GCG release 6.2 version (GCG) and version 4.30
obtained directly from me (MRG).  All line numbers are in terms of the 
unmodified code.

There are two parts to the fix:  Part 1) is essential and corrects the
problem described above. Part 2) is an enhancement that ensures that the
multiple alignments will be "distinct" at a certain level.  These
changes are optional, but prevent the generation of alignments that
differ by only a few residues. 
--------------------------------------------------------------------------------
Part 1)  At line 133-147 (GCG) or 130-144 (MRG) remove the following code

	If ( ListPos .gt. 0 ) then
	  MaxQual = QMax( Order(ListPos) )
	  Do while ( ListPos .gt. 0 .and.
     &		     .not.ProfTraceMPath( Profile, S1, S2, Ns1, Ns2, 
     &			  Path, RowBase, Threshold, Offset1, Offset2, 
     &			  XMax(Order(ListPos)), YMax(Order(ListPos)), 
     &			  Ngaps, QMax(Order(ListPos)), NAbort ) )
	    ListPos = ListPos - 1
	    If ( ListPos .gt. 0 ) MaxQual = QMax( Order(ListPos) )
	  End do
	  If ( ListPos .gt. 0) ProfMAlign = .true.
	  ListPos = ListPos - 1
	Else
	  HavePath = .False.
	End if

and replace it with

	If ( ListPos .le. 0 ) then
	  HavePath = .False.
	  Return
	End if
C
	MaxQual = QMax( Order(ListPos) )
	CutOff = Min( Threshold, Distinct*QMax(Order(ListPos)) )       !*
	Do while ( ListPos .gt. 0 .and.
     .             MaxQual .gt. Threshold .and.
     .		   .not.TraceMPath( Profile, S1, S2, Ns1, Ns2, 
     .			  Path, RowBase, CutOff, Offset1, Offset2,     !*
     .			  XMax(Order(ListPos)), YMax(Order(ListPos)),  
     .			  Ngaps, QMax(Order(ListPos)), NAbort ) )
	  ListPos = ListPos - 1
	  If ( ListPos .gt. 0 ) MaxQual = QMax( Order(ListPos) )
	End do
C
	If ( ListPos .gt. 0 ) then
	  ProfMAlign = .true.
	Else
	  HavePath = .False.
	End if
C
	ListPos = ListPos - 1
--------------------------------------------------------------------------------
Part(2)  At line 55 (GCG) or line 52 (MRG) insert the following. 

	Real Distinct
	Parameter ( Distinct = 0.5 )

         At line 72 (GCG) or line 69 (MRG) insert

	Real CutOff

if you decide NOT to implement Part 2) you must change the two lines
marked with !* in Part 1).  Simply delete the first, and in the second
change "Cutoff"  to "Threshold".