Viewing contents of file '../idllib/ssw/allpro/array_match.pro'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Document name: array_match.pro
; Created by:    Liyun Wang, GSFC/ARC, August 23, 1994
;
; Last Modified: Thu Sep 22 14:37:08 1994 (lwang@orpheus.gsfc.nasa.gov)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
FUNCTION ARRAY_MATCH, a, b, column=column
;+
; Project     :	SOHO - CDS
;
; Name        :	ARRAY_MATCH()
;
; Purpose     : Detect if a vector matches any row or column of a 2D array
;
; Explanation : Search through a 2D array to see if any row (or column, if
;               keyword COLUMN is set) of it is identical to (or matches) 
;               a given vector.
;
;               This routine is called by XCDS to check if the current
;               study has been selected previously.
;
; Use         : Result = array_match(A, B [,/column])
;               IF (array_match(a,b [,/column])) THEN ...
;
; Inputs      : A -- a 2D array with n x m elements
;               B -- a vector with n elements (or m elements if keyword COLUMN
;                    is to be set)
; Opt. Inputs : None.
;
; Outputs     : Result -- 1 if vector B matches either row (or column when
;                         COLUMN is set) of array A; 0 otherwise
;
; Opt. Outputs: None.
;
; Keywords    : COLUMN -- If set, comparison is made through column of A
;
; Calls       : None.
;
; Common      : None.
;
; Restrictions: Number of elements of vector B must be equal to the column
;               number (or row number, if the keyword COLUMN is set) of
;               array A
;
; Side effects: None.
;
; Category    : Utilities, array manipulation
;
; Prev. Hist. : None.
;
; Written     :	Liyun Wang, GSFC/ARC, August 23, 1994
;
; Modified    : Liyun Wang, GSFC/ARC, August 24, 1994
;                  Fixed a bug that only checks for a maximum of two rows
;               Liyun Wang, GSFC/ARC, August 30, 1994
;                  Added keyword COLUMN to allow comparison of one vector with
;                  each column of a 2D array.
;
; Version     : Version 1.0, August 30, 1994
;-
;
   ON_ERROR, 2
   IF (N_PARAMS() LT 2) THEN BEGIN
      PRINT, 'ARRAY_MATCH Usage:   Result = array_match(A, B [,/column])'
      PRINT, '   where A is a 2D array, and B is a vector which has the'
      PRINT, '   same number of elements as the column (row) number of'
      PRINT, '   array A if keyword COLUMN is (not) set.'
      PRINT, ' '
      RETURN, 0
   ENDIF
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;  Test to see if arrays A and B are valid for comparison
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   size_a = SIZE(a) &  size_b = SIZE(b)
   IF (size_a(0) GT 2 OR size_a(0) EQ 0) THEN BEGIN
      PRINT, 'ARRAY_MATCH -- Sorry, only one or two dimensional arrays'
      PRINT, '               can be used.'
      PRINT, ' '
      RETURN, 0
   ENDIF
   IF size_b(0) NE 1 THEN BEGIN
      PRINT, 'ARRAY_MATCH -- The second parameter must be a vector.'
      PRINT, ' '
      RETURN, 0
   ENDIF

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;  Test to see if both arrays are comparable
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   IF (NOT KEYWORD_SET(column)) THEN BEGIN
      IF (size_b(1) NE size_a(1)) THEN BEGIN
         PRINT, 'ARRAY_MATCH -- The two input arrays are not comparable.'
         PRINT, ' '
         RETURN, 0
      ENDIF
   ENDIF ELSE BEGIN
      IF (size_b(1) NE size_a(2)) THEN BEGIN
         PRINT, 'ARRAY_MATCH -- The two input arrays are not comparable.'
         PRINT, ' '
         RETURN, 0
      ENDIF
   ENDELSE

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;  Now begin to make comparison of each row of array A with vector B.
;  Whenever a match is found, return to the calling program
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   IF (size_a(0) EQ 1) THEN BEGIN ; Both arrays are 1D
      index = WHERE(a EQ b, count)
      IF (count EQ size_b(1)) THEN RETURN, 1
   ENDIF ELSE BEGIN             ; array A is two dimensional
      IF KEYWORD_SET(column) THEN BEGIN
         FOR i = 0, size_a(1)-1 DO BEGIN
            c = a(i,*)
            index = WHERE(c EQ b, count)
            IF (count EQ size_b(1)) THEN RETURN, 1
         ENDFOR
      ENDIF ELSE BEGIN
         FOR i = 0, size_a(2)-1 DO BEGIN
            c = a(*,i)
            index = WHERE(c EQ b, count)
            IF (count EQ size_b(1)) THEN RETURN, 1
         ENDFOR
      ENDELSE
   ENDELSE
   RETURN, 0
END

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; End of 'array_match.pro'.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;