pro pr_uniq_hk, sttim, entim, mnem, filt=filt, outfil=outfil, $
		maxpos=maxpos, rep=rep, progver=progver,      $
		daytim=daytim, value=value
;+
;NAME:
;       pr_uniq_hk
;PURPOSE:
;       To log times and count frames and transitions that a given mnemonic or a pair of mnemonics changes state
;SAMPLE CALLING SEQUENCE:
;       pr_uniq_hk, sttim, entim, mnem, /filt
;       pr_uniq_hk, '9-oct 00:00', '9-oct 03:00', 'ikfmpos', /filt
;       pr_uniq_hk, '9-oct', '10-oct', ['ikf1pos','ikf2pos'], /filt
;HISTORY:
;       Written 30-Oct-97 by F.Zele
;V1.2	14-Nov-97 (MDM) - Added option to pass in image header info
;V1.3   18-Nov-97 (FZ)  - Reduced report width to 80 columns. Corrected filter algorithm.
;V1.4   20-Nov-97 (FZ)  - Modified frame counts
;V1.5   25-Nov-97 (FZ)  - Modified frame counts (fc=fc<5>1)
;V1.6	26-Aug-98 (MDM) - Changed FOR loop to be LONG
;V1.7   27-Aug-98 (FZ)  - Changed kntf and kf arrays to be LONG
;V1.8   21-Jul-99 (FZ)  - Added improper frame-count percent for ikqspos
;-
;
progver = 'PR_UNIQ_HK Ver 1.8'
desc=mnem
if (not keyword_set(daytim)) then begin		;Read HK for the data
    if n_elements(mnem) gt 2 then stop, 'more than 2 mnemonics'
    if n_elements(maxpos) eq 0 then maxpos=40
    out=[progver + ' Run '+ut_time()+' UT',   $
      'Processing from '+fmt_tim(sttim)+' to '+fmt_tim(entim),' ']
    info=get_hk_info([sttim,entim],['ikdpfrmn','ikmtbsy',mnem],/nostring)
    if n_elements(info.hk.value(*,0)) eq 0 then stop, 'no info'
    desc=info.hk.descr(2:n_elements(info.hk.descr)-1)
    sslast1=lindgen(n_elements(info.hk.value(*,0)))
    fc=intarr(n_elements(sslast1))+1
    if (keyword_set(filt)) then begin
        dx=[0, deriv_arr(info.hk.value(*,0))]
	sslast1=where((dx ne 0) and (info.hk.value(*,1) eq 0))
        fc=dx(sslast1)
;        fc(where((fc gt 1000) or (fc lt 0))) = 1
        fc=fc<5>1
    end
    ssfirst1=sslast1
    junk=info.hk.value(ssfirst1,2)
    daytim = info.hk.daytime
end else begin
    out=[progver + ' Run '+ut_time()+' UT',   $
      'Data input was passed in', ' ']
    junk = value
    sslast1=lindgen(n_elements(daytim))
    fc=intarr(n_elements(sslast1))+1
    ssfirst1=sslast1
end
 if n_elements(sslast1) gt 1 then ssfirst1=[0,sslast1(0:n_elements(sslast1)-2)+1]
 w1=junk
 w2=junk
 if n_elements(mnem) eq 2 then begin
   w2=info.hk.value(ssfirst1,3)
   junk=junk + 256*w2
 end
 firsttime=fmt_tim(daytim(ssfirst1))
 lasttime=fmt_tim(daytim(sslast1))
 r=sort(junk)
 junkf=junk(r)
 fc=fc(r)
 sslastf=uniq(junkf)
 kntf = lonarr(n_elements(sslastf))
 kntf(0) = sslastf(0) + 1L
 if n_elements(sslastf) gt 1 then for j=1L, n_elements(sslastf)-1 do kntf(j) = sslastf(j) - sslastf(j-1)
 kf = lonarr(n_elements(sslastf))
 for j=0L, n_elements(sslastf)-1 do begin
   kf(j)=0L
   for k=sslastf(j)-kntf(j)+1,sslastf(j) do kf(j)=kf(j) + fc(k)
 endfor
 sslast2=uniq(junk)
 ssfirst2=sslast2
 if n_elements(sslast2) gt 1 then ssfirst2=[0,sslast2(0:n_elements(sslast2)-2)+1]
 w1=w1(ssfirst2)
 w2=w2(ssfirst2)
 firsttime=firsttime(ssfirst2)
 lasttime=lasttime(sslast2)
 junk=junk(ssfirst2)
 if (n_elements(mnem) eq 1) and (n_elements(ssfirst2) gt 1) then begin
   totdis=0L
   posknt=0
   totknt=n_elements(ssfirst2)-1
   for j=1L, n_elements(ssfirst2)-1 do begin
      delta=w1(j) - w1(j-1)
      if abs(delta) gt maxpos/2 then delta=maxpos-delta
      if delta gt 0 then posknt=posknt+1
      totdis=totdis + abs(delta)
   end
 end
 r=bsort(junk)
 w1=w1(r)
 w2=w2(r)
 firsttime=firsttime(r)
 lasttime=lasttime(r)
 junkt=junk(r)
 sslast3=uniq(junkt)
 ssfirst3=sslast3
 if n_elements(sslast3) gt 1 then ssfirst3=[0,sslast3(0:n_elements(sslast3)-2)+1]
 w1=w1(ssfirst3)
 w2=w2(ssfirst3)
 firsttime=firsttime(ssfirst3)
 lasttime=lasttime(sslast3)
 kntt = intarr(n_elements(sslast3))
 kntt(0) = sslast3(0) + 1
 if n_elements(sslast3) gt 1 then for j=1, n_elements(sslast3)-1 do kntt(j) = sslast3(j) - sslast3(j-1)

 out=[out,' Unique Pos of      Frames    Transitions    First Time           Last Time'] 
if n_elements(mnem) eq 2 then begin
   out=[out,string(format='(a,1x,a)',mnem)]
endif else begin
   if desc ne mnem then out=[out,'   ('+mnem+')']
   out=[out,desc]
endelse
 if (keyword_set(filt)) then out=[out,string('Filtered by ','ikdpfrmn')]
 totkntf=0L
 totkf=0L
 proper=0L
 for j=0L, n_elements(ssfirst3)-1 do begin
    totkntf=totkntf + kntf(j)
    totkf=totkf + kf(j)
    if (n_elements(mnem) eq 1) and (mnem(0) eq 'ikqspos') then                        $
       if (w1(j) eq  1) or (w1(j) eq  2) or                                           $
          (w1(j) eq 10) or (w1(j) eq 11) or                                           $
          (w1(j) eq 19) or (w1(j) eq 20) or                                           $
          (w1(j) eq 28) or (w1(j) eq 29) then proper=proper + kf(j)
    if n_elements(mnem) eq 2 then                                                                                    $
      out=[out,string(format='(2i6,2i12,3x,a19,2x,a19)',w1(j),w2(j),kf(j),kntt(j),firsttime(j),lasttime(j))]       $
    else                                                                                                             $
      out=[out,string(format='(3i12,3x,a19,2x,a19)',w1(j),kf(j),kntt(j),firsttime(j),lasttime(j))]
 end
 out=[out,' ']
 out=[out,string('      Total positions:  ',n_elements(ssfirst3))]
 totfstring=string('      Total frames:     ',totkf)
 if totkf ne totkntf then totfstring=totfstring + ' (' + string(totkntf) + ')'
 out=[out,totfstring]
 if n_elements(totdis) ne 0 then begin
   out=[out,string('      Total distance:   ',totdis)]
   out=[out,string('      Total # of moves: ',totknt,' (pos=',posknt,' neg=',totknt-posknt,')')]
 end
 if (n_elements(mnem) eq 1) and (mnem(0) eq 'ikqspos') then                        $
   out=[out,string('      % of improper frames:  ',100.*(totkf - proper)/totkf)+'%'] 
out=[out,' ']
 prstr, out, /nomore
 rep = out
 if (keyword_set(outfil)) then prstr, out, file=outfil
 end
