SUBROUTINE WCI1_READ( NARG, ARGS, OARG, STATUS )
*+
*  Name:
*     WCI1_READ

*  Purpose:
*     Read in the WCS info from an HDS file

*  Language:
*     Starlink Fortran

*  Invocation:
*     CALL WCI1_READ( NARG, ARGS, OARG, STATUS )

*  Description:
*     Constructs the data objects required by WCI from the supplied HDS
*     dataset. This may be any Starlink NDF, but if an ASTERIX dataset
*     is supplied then additional astrometic information can be extracted.

*  Arguments:
*     NARG = INTEGER (given)
*        Number of method arguments
*     ARGS(*) = INTEGER (given)
*        ADI identifier of method arguments
*     OARG = INTEGER (returned) 
*        Output data
*     STATUS = INTEGER (given and returned)
*        The global status.

*  Examples:
*     {routine_example_text}
*        {routine_example_description}

*  Pitfalls:
*     {pitfall_description}...

*  Notes:
*     {routine_notes}...

*  Prior Requirements:
*     {routine_prior_requirements}...

*  Side Effects:
*     Creates a PSF_SLOT property on the property list of the first
*     argument if one is not already present.

*  Algorithm:
*     {algorithm_description}...

*  Accuracy:
*     {routine_accuracy}

*  Timing:
*     {routine_timing}

*  External Routines Used:
*     SLA:
*        SLA_EPJ	- MJD to Julian epoch conversion

*  Implementation Deficiencies:
*     {routine_deficiencies}...

*  References:
*     WCI Subroutine Guide : http://www.sr.bham.ac.uk/asterix-docs/Programmer/Guides/wci.html

*  Keywords:
*     package:wci, usage:private

*  Copyright:
*     Copyright (C) University of Birmingham, 1995

*  Authors:
*     DJA: David J. Allan (Jet-X, University of Birmingham)
*     {enter_new_authors_here}

*  History:
*     14 Feb 1995 (DJA):
*        Original version.
*     {enter_changes_here}

*  Bugs:
*     {note_any_bugs_here}

*-
      
*  Type Definitions:
      IMPLICIT NONE              ! No implicit typing

*  Global Constants:
      INCLUDE 'SAE_PAR'          			! SAE constants
      INCLUDE 'ADI_PAR'					! ADI constants
      INCLUDE 'DAT_PAR'					! HDS constants
      INCLUDE 'WCI_PAR'					! WCI constants

*  Arguments Given:
      INTEGER			NARG, ARGS(*)

*  Arguments Returned:
      INTEGER			OARG			! Returned data

*  Status:
      INTEGER 			STATUS             	! Global status

*  External References:
      EXTERNAL			SLA_EPJ
        DOUBLE PRECISION	SLA_EPJ	

*  Local Variables:
      CHARACTER*(DAT__SZLOC)	HLOC			! Object header
      CHARACTER*80		LABEL			! X,Y axis labels
      CHARACTER*3		PRJ			! Projection name
      CHARACTER*3		SYS			! Coord system name
      CHARACTER*40		UNITS(2)		! X,Y axis units

      DOUBLE PRECISION		BUTC			! Value of BASE_UTC
      DOUBLE PRECISION		EPOCH			! Epoch
      DOUBLE PRECISION		MJD			! Observation time
      DOUBLE PRECISION		NPOINT(2)		! Nominal RA, DEC
      DOUBLE PRECISION		PA			! Position angle
      DOUBLE PRECISION		SPOINT(2)		! RA, DEC

      REAL			BASE(2), SCALE(2)	! Axis values 
      REAL			EQNX			! Equinox
      REAL			TOR			! Radian conversion

      INTEGER			DIMS(2)			! Axis dimensions
      INTEGER			FARG			! File argument
      INTEGER			IMJD			! Value of BASE_MJD
      INTEGER			IPSF			! Psf system handle
      INTEGER			NDIM			! Dimensionality
      INTEGER			PIXID			! Pixellation object
      INTEGER			PRJID			! Projection object
      INTEGER			PTR(2)			! Axis data pointers
      INTEGER			SYSID			! CoordSystem object
      INTEGER			X_AX,Y_AX,E_AX,T_AX	! Axis numbers

      LOGICAL			EQOK, EPOK		! Equinox & epoch ok?
      LOGICAL			FRAOK, FDECOK		! Nominal pointing ok?
      LOGICAL			HASPIX			! Spatial axes exist?
      LOGICAL			ISPRIM			! Input is primitive?
      LOGICAL			RAOK, DECOK, PAOK       ! Found ok flags
      LOGICAL			REG(2)			! Axes regular
      LOGICAL			PRJOK, SYSOK		! Projection/system ok?
      LOGICAL			UTCOK			! BASE_UTC found?
*.

*  Check inherited global status.
      IF ( STATUS .NE. SAI__OK ) RETURN

*  Initialise flags
      EPOK = .FALSE.
      EQOK = .FALSE.
      DECOK = .FALSE.
      RAOK = .FALSE.
      PAOK = .FALSE.
      PRJOK = .FALSE.
      SYSOK = .FALSE.

*  Introduce the dataset to the PSF system
      FARG = ARGS(1)
      IF ( FARG .EQ. ADI__NULLID ) FARG = ARGS(2)
      CALL PSF_INTRO( FARG, IPSF, STATUS )
      IF ( STATUS .EQ. SAI__OK ) THEN
        HASPIX = .TRUE.
      ELSE
        CALL ERR_ANNUL( STATUS )
        HASPIX = .FALSE.
      END IF

*  Extract axis info
      IF ( HASPIX ) THEN
        CALL PSF_QAXES( IPSF, X_AX, Y_AX, E_AX, T_AX, STATUS )
        IF ( (X_AX.LT.1) .AND. (Y_AX.LT.1) ) THEN
          X_AX = 1
          Y_AX = 2
        END IF        
        IF ( (X_AX .LT. 1) .OR. (Y_AX.LT.1) ) THEN
          CALL ADI_DERVD( FARG, 'Array', ISPRIM, STATUS )
          IF ( ISPRIM ) THEN
            CALL BDI_GETSHP( FARG, 2, DIMS, NDIM, STATUS )
            REG(1) = .TRUE.
            REG(2) = .TRUE.
            UNITS(1) = 'arcmin'
            UNITS(2) = 'arcmin'
            BASE(1) = REAL(DIMS(1)-1)/2.0
            SCALE(1) = -1.0
            BASE(2) = - REAL(DIMS(2)-1)/2.0
            SCALE(2) = 1.0
          ELSE
            HASPIX = .FALSE.
          END IF
        ELSE
          CALL PSF_QAXIS( IPSF, X_AX, DIMS(1), REG(1), PTR(1), BASE(1),
     :                SCALE(1), LABEL, UNITS(1), TOR, STATUS )
          CALL PSF_QAXIS( IPSF, Y_AX, DIMS(2), REG(2), PTR(2), BASE(2),
     :                SCALE(2), LABEL, UNITS(2), TOR, STATUS )
          BASE(1) = BASE(1) / TOR
          SCALE(1) = SCALE(1) / TOR
          BASE(2) = BASE(2) / TOR
          SCALE(2) = SCALE(2) / TOR
        END IF
      END IF

*  Look for ASTERIX header data
      CALL ADI1_LOCHEAD( ARGS(2), .FALSE., HLOC, STATUS )
      IF ( STATUS .EQ. SAI__OK ) THEN

*    Extract data from header if present
*     Pointing and orientation
        CALL ADI1_CGET0D( HLOC, 'AXIS_RA', RAOK, SPOINT(1), STATUS )
        CALL ADI1_CGET0D( HLOC, 'AXIS_DEC', DECOK, SPOINT(2), STATUS )
        CALL ADI1_CGET0D( HLOC, 'FIELD_RA', FRAOK, NPOINT(1), STATUS )
        CALL ADI1_CGET0D( HLOC, 'FIELD_DEC', FDECOK, NPOINT(2), STATUS )
        CALL ADI1_CGET0D( HLOC, 'POSITION_ANGLE', PAOK, PA, STATUS )
        IF ( PAOK ) THEN
          PA = - PA
        ELSE
          PA = 0D0
        END IF

*     Equinox
        CALL ADI1_CGET0R( HLOC, 'EQUINOX', EQOK, EQNX, STATUS )

*     Epoch of observation. Composed of the BASE_MJD and BASE_UTC header
*     components
        CALL ADI1_CGET0I( HLOC, 'BASE_MJD', EPOK, IMJD, STATUS )
        IF ( EPOK ) THEN
          CALL ADI1_CGET0D( HLOC, 'BASE_UTC', UTCOK, BUTC, STATUS )
          IF ( UTCOK ) THEN
            MJD = DBLE(IMJD) + BUTC / 86400D0
          ELSE
            MJD = DBLE(IMJD)
          END IF
          EPOCH = SLA_EPJ( MJD )
        END IF
        
*     ASTERIX is always TAN projection
        PRJ = 'TAN'
        PRJOK = .TRUE.

*     ASTERIX doesn't specify the system in the header, but the only FK4
*      data is the SL2 stuff where the equinox was 1950
        IF ( EQOK ) THEN
          IF ( NINT(EQNX) .EQ. 1950 ) THEN
            SYS = 'FK4'
          ELSE
            SYS = 'FK5'
          END IF
          SYSOK = .TRUE.
        END IF

      ELSE
        CALL ERR_ANNUL( STATUS )

      END IF

*  Create the CoordSystem object. Define suitable defaults for missing data
      IF ( .NOT. SYSOK ) SYS = 'FK5'
      IF ( .NOT. EQOK ) EQNX = 2000.0
      IF ( .NOT. EPOK ) EPOCH = WCI__FLAG
      CALL WCI_NEWSYS( SYS, EQNX, EPOCH, SYSID, STATUS )

*  Create the Projection object, providing defaults
      IF ( .NOT. PRJOK ) PRJ = 'TAN'
      IF ( .NOT. RAOK ) SPOINT(1) = 0D0
      IF ( .NOT. DECOK ) SPOINT(2) = 0D0
      CALL WCI_NEWPRJ( PRJ, 0, 0.0, SPOINT, 180D0, PRJID, STATUS )
      IF ( FRAOK .AND. FDECOK ) THEN
        CALL ADI_CPUT1D( PRJID, 'NPOINT', 2, NPOINT, STATUS )
      END IF

*  Create the pixellation object, providing defaults
      IF ( HASPIX ) THEN
        IF ( .NOT. PAOK ) PA = 0D0
        IF ( REG(1) .AND. REG(2) ) THEN
          CALL WCI_NEWPX( DIMS, BASE, SCALE, UNITS, PA, PIXID, STATUS )
          IF ( STATUS .NE. SAI__OK ) THEN
            CALL ERR_ANNUL( STATUS )
            HASPIX = .FALSE.
          END IF
        ELSE
c  	  PRINT *, 'Irregular axes, not yet!'
        END IF
      END IF

*  Create the output structure
      CALL ADI_NEW0( 'STRUC', OARG, STATUS )
      IF ( HASPIX ) THEN
        CALL ADI_CPUTID( OARG, 'Pix', PIXID, STATUS )
      END IF
      CALL ADI_CPUTID( OARG, 'Proj', PRJID, STATUS )
      CALL ADI_CPUTID( OARG, 'Sys', SYSID, STATUS )
      
*  Report any errors
      IF ( STATUS .NE. SAI__OK ) THEN
        CALL AST_REXIT( 'WCI1_READ', STATUS )
      END IF

      END