      program difcal
c
c calculate differential magnitudes
c written 9-April-1997 aah
c this version outputs an unsorted file
c
      PARAMETER (MAXSTARS=10000)
      PARAMETER (XINDEF=99.999,XCHECK=99.0)
      real*8 ra(MAXSTARS),dec(MAXSTARS),hjd(MAXSTARS)
      real*4 smag(MAXSTARS,2),xmag(MAXSTARS,3)
      integer i,n,nmast
      character flist*80,fname*80,fout*80
      common /blka/ ra,dec,hjd,smag,xmag,nmast
c
      print *,'Enter input filelist: '
      read (5,'(a)') flist
      open (unit=1,file=flist,status='old')
      print *,'Enter master star filename: '
      read (5,'(a)') fname
      open (unit=2,file=fname,status='old')
      read (2,*)
      i = 1
100   continue
      read (2,900,end=200) ra(i),dec(i),smag(i,1),n,smag(i,2)
900   format (f8.4,1x,f9.4,16x,f7.3,7x,i4,2x,f7.3)
      if (n.lt.3) goto 100
      i=i+1
      goto 100
200   continue
      nmast = i - 1
      write(6,905) nmast
905   format (i5,' Stars with at least 3 observations.')
      close(2)
      print *,'Enter output filename: '
      read (5,'(a)') fout
      open (unit=3,file=fout,status='new')
300   continue
      read (1,'(a)',end=400) fname
      open (unit=2,file=fname,status='old')
      write (6,901) fname
901   format ('Processing file: ',a)
      call readfile
      call formdif
      close(2)
      goto 300
400   continue
      stop
      end

      subroutine readfile
c
      PARAMETER (MAXSTARS=10000)
      PARAMETER (XINDEF=99.999,XCHECK=99.0)
      real*8 ra(MAXSTARS),dec(MAXSTARS),hjd(MAXSTARS)
      real*8 rax,decx,hjd1,hjd2,hjd3
      real*4 dra,ddec,fwhmx1,fwhmx2,fwhmx3,xmag1,
     $       xmag2,xmag3,dmag1,dmag2,dmag3,x1,x2,x3,
     $       y1,y2,y3,err,minerr
      real*4 smag(MAXSTARS,2),xmag(MAXSTARS,3)
      integer i,j,nmast
      common /blka/ ra,dec,hjd,smag,xmag,nmast
c
      minerr = (15./3600.)**2
      do i=1,nmast
        xmag(i,1) = XINDEF
        xmag(i,2) = XINDEF
        xmag(i,3) = XINDEF
      enddo
      read (2,*)
      read (2,*)
100   continue
         read (2,902,end=200) rax,decx,dra,ddec,
     $  hjd1,fwhmx1,fwhmy1,xmag1,dmag1,x1,y1,
     $  hjd2,fwhmx2,fwhmy2,xmag2,dmag2,x2,y2,
     $  hjd3,fwhmx3,fwhmy3,xmag3,dmag3,x3,y3
902     format (4f9.4,f11.4,6f7.3/
     $    5x,f11.4,6f7.3/
     $    5x,f11.4,6f7.3)
        if (xmag1.gt.XCHECK.or.((xmag2.gt.XCHECK).and.
     $     (xmag3.gt.XCHECK))) goto 100
        do i=1,nmast
           err = (ra(i)-rax)**2 + (dec(i)-decx)**2
           if (err.lt.minerr) then
              xmag(i,1) = xmag1
              xmag(i,2) = xmag2
              xmag(i,3) = xmag3
              hjd(i) = hjd1
              goto 100
           endif
         enddo
         goto 100
200   continue
      return
      end

      subroutine formdif
c
c calculate differential magnitudes for all objects
c
      PARAMETER (MAXSTARS=10000)
      PARAMETER (XINDEF=99.999,XCHECK=99.0)
      real*8 sum1,sum2,ra(MAXSTARS),dec(MAXSTARS),hjd(MAXSTARS)
      real*4 x(100),smag(MAXSTARS,2),xmag(MAXSTARS,3)
      integer indx(100),i,ii,j,k,n1,n2,nmast,j1,j2
      common /blka/ ra,dec,hjd,smag,xmag,nmast
c
      do i=1,nmast
        if (xmag(i,1).lt.XCHECK) then
           j1 = max(1,i-50)
           j2 = min(nmast,j1+100)
           k=0
           do j=j1,j2
             if (j.ne.i) then
               k = k+1
c              x(k) = abs(dec(i)-dec(j))
               x(k) = smag(j,1)
               indx(k) = j
             endif
           enddo
           call sort (k,x,indx)
           n1 = 0
           n2 = 0
           sum1 = 0.
           sum2 = 0.
           do j=1,10
             ii = indx(j)
             if (xmag(ii,1).lt.XCHECK) then
               sum1 = sum1 + (xmag(i,1)-xmag(ii,1))+smag(ii,1)
               n1 = n1 + 1
             endif
             if (xmag(ii,2).lt.XCHECK.and.xmag(i,2).lt.XCHECK
     $         .and.smag(ii,2).lt.XCHECK) then
               sum2 = sum2 + (xmag(i,2)-xmag(ii,2))+smag(ii,2)
               n2 = n2 + 1
             endif
             if (xmag(ii,3).lt.XCHECK.and.xmag(i,3).lt.XCHECK
     $         .and.smag(ii,2).lt.XCHECK) then
               sum2 = sum2 + (xmag(i,3)-xmag(ii,3))+smag(ii,2)
               n2 = n2 + 1
             endif
           enddo
           if (n1.gt.0) then
              sum1 = sum1 / float(n1)
           else
              sum1 = XINDEF
           endif
           if (n2.gt.0) then
              sum2 = sum2 / float(n2)
           else
              sum2 = XINDEF
           endif
           write (3,900) i,ra(i),dec(i),hjd(i),sum1,sum2
900        format (i5,1x,f8.4,2x,f9.4,f11.4,2f7.3)
        endif
      enddo
      return
      end

      SUBROUTINE SORT (n,x,index)
c
c heapsort of array x with corresponding index array index
c from numerical recipies
c note: for real*4 values
c
      DIMENSION x(n),index(n)
      k = n/2+1
      ir = n
10    continue
      IF (k.gt.1) THEN
        k = k-1
        xx = x(k)
        ii = index(k)
      ELSE
        xx = x(ir)
        ii = index(ir)
        x(ir) = x(1)
        index(ir) = index(1)
        ir = ir-1
        IF (ir.eq.1) THEN
          x(1) = xx
          index(1) = ii
          RETURN
        ENDIF
      ENDIF
      i = k
      j = k+k
20    IF (j.le.ir) THEN
        IF (j.lt.ir) THEN
          IF (x(j).lt.x(j+1)) j = j+1
        ENDIF
        IF (xx.lt.x(j)) THEN
          x(i) = x(j)
          index(i) = index(j)
          i = j
          j = j+j
        ELSE
          j = ir+1
        ENDIF
      GOTO 20
      ENDIF
      x(i) = xx
      index(i) = ii
      GOTO 10
      END

