SUBROUTINE EVSORT( STATUS )
*+
* Name:
* EVSORT
* Purpose:
* Reorder an event list on the values in a particular list
* Language:
* Starlink Fortran
* Type of Module:
* ASTERIX task
* Invocation:
* CALL EVSORT( STATUS )
* Arguments:
* STATUS = INTEGER (Given and Returned)
* The global status.
* Description:
* The events in the input dataset are sorted into order by the value
* of one of the lists.
* Usage:
* evsort {parameter_usage}
* Environment Parameters:
* INP = CHAR (read)
* Input dataset
* OUT = CHAR (read)
* Input dataset
* Examples:
* {routine_example_text}
* {routine_example_description}
* Pitfalls:
* {pitfall_description}...
* Notes:
* {routine_notes}...
* Prior Requirements:
* {routine_prior_requirements}...
* Side Effects:
* {routine_side_effects}...
* Algorithm:
* {algorithm_description}...
* Accuracy:
* {routine_accuracy}
* Timing:
* {routine_timing}
* Implementation Status:
* {routine_implementation_status}
* External Routines Used:
* {name_of_facility_or_package}:
* {routine_used}...
* Implementation Deficiencies:
* {routine_deficiencies}...
* References:
* {task_references}...
* Keywords:
* evsort, usage:public
* Copyright:
* Copyright (C) University of Birmingham, 1995
* Authors:
* DJA: David J. Allan (Jet-X, University of Birmingham)
* {enter_new_authors_here}
* History:
* 11 May 1993 V1.7-0 (DJA):
* Original version.
* 24 Nov 1994 V1.8-0 (DJA):
* Now use USI for user interface
* 14 Aug 1995 V1.8-1 (DJA):
* Started ADI conversion
* 18 Aug 1995 V2.0-0 (DJA):
* Full ADI port
* {enter_changes_here}
* Bugs:
* {note_any_bugs_here}
*-
* Type Definitions:
IMPLICIT NONE ! No implicit typing
* Global Constants:
INCLUDE 'SAE_PAR' ! Standard SAE constants
* Status:
INTEGER STATUS ! Global status
* Local Constants:
INTEGER MXLIN ! Max amount of history
PARAMETER ( MXLIN = 8 )
CHARACTER*30 VERSION
PARAMETER ( VERSION = 'EVSORT Version V2.0-0' )
* Local Variables:
CHARACTER*20 MTYPE ! List mapping type
CHARACTER*20 NAME ! Any old list name
CHARACTER*20 SLIST ! Sort list name
CHARACTER*80 TXT(MXLIN) ! History text
CHARACTER*20 TYPE ! List data type
INTEGER I ! Loop counters
INTEGER IFID ! Input dataset
INTEGER ILID ! Input list id
INTEGER LLEN ! List length
INTEGER IPTR, OPTR ! I/p and o/p list data
INTEGER IDPTR ! Sort index
INTEGER NLIN ! # text lines used
INTEGER NLIST ! # lists in input
INTEGER OFID ! Output dataset
LOGICAL ASCEND ! Sort in ascending order?
*.
* Check inherited global status.
IF ( STATUS .NE. SAI__OK ) RETURN
* Version id
CALL MSG_PRNT( VERSION )
* Initialise ASTERIX
CALL AST_INIT()
* Obtain data objects
CALL USI_ASSOC( 'INP', 'EventDS', 'READ', IFID, STATUS )
CALL USI_CLONE( 'INP', 'OUT', 'EventDS', OFID, STATUS )
IF ( STATUS .NE. SAI__OK ) GOTO 99
* Get number of lists and events
CALL EDI_GETNS( IFID, LLEN, NLIST, STATUS )
* Tell user if there aren't any
IF ( NLIST .EQ. 0 ) THEN
STATUS = SAI__ERROR
CALL ERR_REP( ' ', 'There are no lists to print', STATUS )
END IF
IF ( STATUS .NE. SAI__OK ) GOTO 99
* Define the default to the SLIST parameter
CALL EDI_DEFLD( IFID, 'SLIST', 'T', 'name', STATUS )
* Locate list to be sorted
CALL EDI_SELCTN( IFID, 'SLIST', SLIST, STATUS )
* Ascending order?
CALL USI_GET0L( 'ASCEND', ASCEND, STATUS )
IF ( STATUS .NE. SAI__OK ) GOTO 99
* Map input list
CALL EDI_MAPD( IFID, SLIST, 'READ', 0, 0, IPTR, STATUS )
* Create index array
CALL DYN_MAPI( 1, LLEN, IDPTR, STATUS )
CALL ARR_REG1I( 1, 1, LLEN, %VAL(IDPTR), STATUS )
* Sort the index
CALL MSG_SETC( 'SL', SLIST )
CALL MSG_PRNT( 'Sorting by ^SL...' )
CALL SORT_IDXD( LLEN, %VAL(IPTR), ASCEND, %VAL(IDPTR), STATUS )
* Unmap sort list
CALL EDI_UNMAP( IFID, SLIST, STATUS )
* Move data using index for each output list
DO I = 1, NLIST
* Locate input list
CALL EDI_IDX( IFID, I, ILID, STATUS )
CALL ADI_CGET0C( ILID, 'TYPE', TYPE, STATUS )
* Get the name of this list
CALL ADI_CGET0C( ILID, 'Name', NAME, STATUS )
* Choose mapping type
CALL EDI_MTYPE( ILID, MTYPE, STATUS )
* Map input and output lists
CALL EDI_MAP( IFID, NAME, MTYPE, 'READ', 0, 0, IPTR, STATUS )
CALL EDI_MAP( OFID, NAME, MTYPE, 'WRITE', 0, 0, OPTR, STATUS )
* Move the data using the index
CALL SORT_MVIDXT( LLEN, MTYPE, %VAL(IPTR), %VAL(IDPTR),
: %VAL(OPTR), STATUS )
* Unmap the lists
CALL EDI_UNMAP( IFID, NAME, STATUS )
CALL EDI_UNMAP( OFID, NAME, STATUS )
* Free the list
CALL ADI_ERASE( ILID, STATUS )
END DO
* Free the index array
CALL DYN_UNMAP( IDPTR, STATUS )
* Write history
CALL HSI_ADD( OFID, VERSION, STATUS )
TXT(1) = 'Input evds {INP}'
CALL MSG_SETC( 'L', SLIST )
IF ( ASCEND ) THEN
CALL MSG_SETC( 'O', 'ascending' )
ELSE
CALL MSG_SETC( 'O', 'descending' )
END IF
CALL MSG_SETC( 'L', SLIST )
TXT(2) = 'Sorted by list ^L in ^O order'
NLIN = MXLIN
CALL USI_TEXT( 3, TXT, NLIN, STATUS )
CALL HSI_PTXT( OFID, NLIN, TXT, STATUS )
* Exit
99 CALL AST_CLOSE()
CALL AST_ERR( STATUS )
END