2
*----------------------------------------------------------------------*
3
* $Id: pfscale.f 183 2003-11-28 11:53:33Z vflegel $
4
*----------------------------------------------------------------------*
5
* Function: Fits paramters of an extreme value distribution to a
6
* profile score distribution. Input: sorted score list.
7
* Author: Philipp Bucher
8
* Contact: pftools@isb-sib.ch
9
* Version: File under developpment for release 2.3
10
*----------------------------------------------------------------------*
12
*----------------------------------------------------------------------*
14
* array sizes, I/O units
23
* function return types
28
* Parameters and options
61
*----------------------------------------------------------------------*
63
*----------------------------------------------------------------------*
71
Call Repar(FSCL,FPRF,LLLT,DL,NN,RP,RQ,LMNB,IMNB,IRC)
74
* ''pfscale 2.3 revision 4'',//
75
* ''Usage: pfscale [ -lhLMNPQ ] [ score-list | - ] ''
76
* ''[ profile-file ] [ parameters ]'',/
80
* '' -h: print usage help text.'',/
81
* '' -l: do not impose limit on line length.'',/
83
* '' logarithmic base of parameters (default: 10).'',/
85
* '' profile mode number to scale.'',/
87
* '' database size (default: 14147368).'',/
89
* '' upper threshold of probability range (default:'',
92
* '' lower threshold of probability range (default:'',
96
* '' valid (but deprecated) parameters are:'',/,
97
* '' [L=log-base] use option -L instead'',/,
98
* '' [M=mode-nb] use option -M instead'',/,
99
* '' [N=db-size] use option -N instead'',/,
100
* '' [P=upper-threshold] use option -P instead'',/
101
* '' [Q=lower-threshold] use option -Q instead'',/
106
If(FSCL.NE.' '.AND.FSCL.NE.'-') then
108
Open(MSCL,File=FSCL,Status='OLD',Err=900)
115
RDBS=RL*LOG(Real(NN))
124
Read(MSCL,*,End= 10,Err=901) XSCO(I1)
125
XFRQ(I1)=RDBS-RL*LOG(I1-0.5)
130
If(NSCO.LT.1) Go to 904
136
If(XFRQ(I1).GE.EMIN.AND.XFRQ(I1).LE.EMAX) then
137
XSM=XSM+XWGT(I1)*XSCO(I1)
138
XFM=XFM+XWGT(I1)*XFRQ(I1)
150
If(XFRQ(I1).GE.EMIN.AND.XFRQ(I1).LE.EMAX) then
151
XSV=XSV+XWGT(I1)*( (XSCO(I1)-XSM)**2 )
152
XFV=XFV+XWGT(I1)*( (XFRQ(I1)-XFM)**2 )
153
XCO=XCO+XWGT(I1)*(XFRQ(I1)-XFM)*(XSCO(I1)-XSM)
158
XCO=(XCO/XWM)/(XFV*XSV)
163
If(FPRF.NE.' ') Go to 50
165
* Case 1: no profile input file - print list
168
* '(''# -LogP ='',F8.4,'' + '',F12.8,'' * raw-score'')') XA,XB
170
Write(NOUT,'(''#'')')
171
Write(NOUT,'(''# rank raw-score -logFreq -logProb'')')
172
Write(NOUT,'(''#'')')
176
Write(NOUT,'(I8,F10.2,F10.4,F10.4)')
177
* I1,XSCO(I1),XFRQ(I1),XPRE
181
* Case 2: Modify profile input file
187
* CPID,CPAC,CPDT,CPDE,LHDR,CHDR,LFTR,CFTR,NABC,CABC,LPRF,LPCI,
189
* CDIS,JDIP,MDIS,NDIP,
190
* CNOR,JNOP,JNOR,MNOR,NNOR,NNPR,CNTX,RNOP,
191
* JCUT,MCLE,CCUT,ICUT,JCNM,RCUT,MCUT,
192
* IDMP,CHIP,IIPP,CHMP,IMPP,CHIL,IIPL,ILIP,
193
* CHID,IIPD,CHMD,IMPD,
194
* INBP,LEOF,.FALSE.,IRC)
196
If(IRC.NE.0) go to 100
198
* Check normalization modes (Lowest priority mode will be updated)
202
If(NNOR(I1).EQ.IMNB) then
212
If(NNPR(I1).LT.K1) then
220
If(MNOR(J1).NE.1) go to 902
222
* add normalisation parameters:
231
If(MCUT(I2,I1).EQ.NNOR(J1)) then
233
* (RCUT(I2,I1),ICUT(I1),RNOP,KNPM,MAXN,J1,1,LSEQ,RAVE)
243
If(LFTR.GT.1024) LFTR=1024
248
CFTR(1)='CC /RESCALED_BY="'
249
Call Recmd(CFTR(1)(21:130))
257
* CPID,CPAC,CPDT,CPDE,LHDR,CHDR,LFTR,CFTR,NABC,CABC,LPRF,LPCI,
258
* CDIS,JDIP,MDIS,NDIP,
259
* CNOR,JNOP,JNOR,MNOR,NNOR,NNPR,CNTX,RNOP,
260
* JCUT,MCLE,CCUT,ICUT,JCNM,RCUT,MCUT,
261
* IDMP,CHIP,IIPP,CHMP,IMPP,
263
* CHID,IIPD,CHMD,IMPD,
270
900 Write(NERR,*) 'Error: Unable to open score file'//
271
* ' ''',FSCL(1:Lblnk(FSCL)),'''.'
274
901 Write(NERR,*) 'Error: Unable to read score value.'
277
902 Write(NERR,*) 'Error: Normalization mode number',NNOR(J1),
278
* ' is not linear. Scaling impossible.'
281
903 Write(NERR,*) 'Error: Normalization mode number',IMNB,
282
* ' is not defined in profile.'
285
904 Write(NERR,*) 'Error: Score list does not contain any ',
291
*----------------------------------------------------------------------*
292
Subroutine Repar(FSCL,FPRF,LLLT,DL,NN,RP,RQ,LMNB,IMNB,IRC)
322
* interpret command line arguments
330
If (CARG(1:1).EQ.'-'.AND.CARG(2:2).NE.' ') then
331
If(Index(CARG,'l').NE.0) LLLT=.FALSE.
332
If(Index(CARG,'h').NE.0) go to 900
333
If(Index(CARG,'L').NE.0) then
334
If(CARG(3:3).NE.' ') then
335
If(CARG(3:3).EQ.'e'.OR.CARG(3:3).EQ.'E') then
338
Read(CARG(3:),*,Err=900) DL
343
If(CARG(1:1).EQ.'e'.OR.CARG(1:1).EQ.'E') then
346
Read(CARG,*,Err=900) DL
350
If(Index(CARG,'N').NE.0) then
351
If(CARG(3:3).NE.' ') then
352
Read(CARG(3:),*,Err=900) NN
356
Read(CARG,*,Err=900) NN
359
If(Index(CARG,'P').NE.0) then
360
If(CARG(3:3).NE.' ') then
361
Read(CARG(3:),*,Err=900) RP
365
Read(CARG,*,Err=900) RP
368
If(Index(CARG,'Q').NE.0) then
369
If(CARG(3:3).NE.' ') then
370
Read(CARG(3:),*,Err=900) RQ
374
Read(CARG,*,Err=900) RQ
377
If(Index(CARG,'M').NE.0) then
378
If(CARG(3:3).NE.' ') then
379
Read(CARG(3:),*,Err=900) IMNB
384
Read(CARG,*,Err=900) IMNB
389
Else if(CARG(1:3).EQ.'L=e'.OR.CARG(1:3).EQ.'L=E') then
391
Else if(CARG(1:2).EQ.'L=') then
392
Read(CARG(3:),*,Err=900) DL
393
Else if(CARG(1:2).EQ.'N=') then
394
Read(CARG(3:),*,Err=900) NN
395
Else if(CARG(1:2).EQ.'P=') then
396
Read(CARG(3:),*,Err=900) RP
397
Else if(CARG(1:2).EQ.'Q=') then
398
Read(CARG(3:),*,Err=900) RQ
399
Else if(CARG(1:2).EQ.'M=') then
400
Read(CARG(3:),*,Err=900) IMNB
402
Else if(K1.LE.1) then
406
Else if(K1.EQ.2) then
413
If(I2.GT.N1) Go to 20
416
20 If(DL.LE.1) Go to 901
417
If(NN.LT.1) Go to 902
418
If(RP.LT.0.OR.RP.GT.1) Go to 903
419
If(RQ.LT.0.OR.RQ.GT.1) Go to 904
420
If(LMNB.AND.IMNB.LT.1) Go to 905
424
901 Write(NERR,*) 'Error: Value of option -L is out of bound.'
427
902 Write(NERR,*) 'Error: Value of option -N is out of bound.'
430
903 Write(NERR,*) 'Error: Value of option -P is out of bound.'
433
904 Write(NERR,*) 'Error: Value of option -Q is out of bound.'
436
905 Write(NERR,*) 'Warning: Mode numbers should be greater or ',
440
*----------------------------------------------------------------------*