[2] | 1 | ;+ |
---|
| 2 | ; NAME: |
---|
| 3 | ; WHERE_TAG |
---|
| 4 | ; PURPOSE: |
---|
| 5 | ; Like WHERE but works on structure tag names |
---|
| 6 | ; EXPLANATION: |
---|
| 7 | ; Obtain subscripts of elements in structure array for which |
---|
| 8 | ; a particular Tag has values in a range or matching specified values. |
---|
| 9 | ; Like the WHERE function but for use with structures |
---|
| 10 | ; CATEGORY: |
---|
| 11 | ; Structures |
---|
| 12 | ; CALLING SEQUENCE: |
---|
| 13 | ; w = where_tag( struct, [ Nfound, TAG_NAME=, TAG_NUMBER = , RANGE =, |
---|
| 14 | ; VALUES =, RANGE =, ISELECT =, /NOPRINT ] |
---|
| 15 | ; |
---|
| 16 | ; INPUTS: |
---|
| 17 | ; Struct = structure array to search. |
---|
| 18 | ; |
---|
| 19 | ; INPUT KEYWORDS: |
---|
| 20 | ; User *must* specify (1) TAG_NAME or TAG_NUMBER to search, and (2) |
---|
| 21 | ; the VALUES or RANGE to search on |
---|
| 22 | ; |
---|
| 23 | ; TAG_NAME = Scalar string specifying Tag Name |
---|
| 24 | ; TAG_NUMBER = otherwise give the Tag Number, |
---|
| 25 | ; RANGE = [min,max] range to search for in Struct, |
---|
| 26 | ; VALUES = one or array of numbers to match for in Struct, |
---|
| 27 | ; ISELECT= specifies indices to select only part of structure array, |
---|
| 28 | ; (use it to recycle subscripts from previous searches). |
---|
| 29 | ; /NOPRINT = suppress informational messages about nothing found. |
---|
| 30 | ; |
---|
| 31 | ; OUTPUTS: |
---|
| 32 | ; Nfound = # of occurences found. |
---|
| 33 | ; |
---|
| 34 | ; RESULT: |
---|
| 35 | ; Function returns subscripts (indices) to desired elements. |
---|
| 36 | ; |
---|
| 37 | ; EXAMPLES: |
---|
| 38 | ; Suppose STR is a structure with tags CAT_NO:indgen(10), and |
---|
| 39 | ; NAME:strarr(10). Find the indices where STR.CAT_NO is |
---|
| 40 | ; between 3 and 5. |
---|
| 41 | ; |
---|
| 42 | ; IDL> print, WHERE_TAG( str, TAG_NAME = 'CAT_NO', VALUE = [3,4,5] ) ;or |
---|
| 43 | ; IDL> print, WHERE_TAG( str, TAG_NUM = 0, RANGE = [3,5]) |
---|
| 44 | ; |
---|
| 45 | ; PROCEDURE: |
---|
| 46 | ; Get tag number and apply the WHERE function appropriately. |
---|
| 47 | ; |
---|
| 48 | ; MODIFICATION HISTORY: |
---|
| 49 | ; written 1990 Frank Varosi STX @ NASA/GSFC |
---|
| 50 | ; Stop printing "Tag <xxx> not found" with /NOPRINT, CD Pike 8-Jun-93 |
---|
| 51 | ;- |
---|
[97] | 52 | function where_Tag, Struct, Nfound, TAG_NAME=Tag_Name, $ |
---|
| 53 | TAG_NUMBER=Tag_Num, $ |
---|
| 54 | ISELECT=ipart, NOPRINT=noprint, $ |
---|
| 55 | RANGE=range, VALUES=values |
---|
[2] | 56 | ;First check required parameters... |
---|
[114] | 57 | ; |
---|
| 58 | compile_opt idl2, strictarrsubs |
---|
| 59 | ; |
---|
[2] | 60 | |
---|
| 61 | Ntag = N_tags( Struct ) |
---|
| 62 | |
---|
| 63 | if (Ntag LE 1) then begin |
---|
| 64 | message,"expecting a Structure Array, try again...",/CONTIN |
---|
| 65 | return,[-1] |
---|
| 66 | endif |
---|
| 67 | |
---|
| 68 | if (N_elements( Tag_Num ) NE 1) AND $ |
---|
| 69 | (N_elements( Tag_Name ) NE 1) then begin |
---|
| 70 | message,"specify TAG_NAME= or TAG_NUMBER= to search",/CONTIN |
---|
| 71 | return,[-1] |
---|
| 72 | endif |
---|
| 73 | |
---|
| 74 | Tags = Tag_names( Struct ) |
---|
| 75 | |
---|
| 76 | if N_elements( Tag_Name ) EQ 1 then begin |
---|
| 77 | Tag_Name = strupcase( Tag_Name ) |
---|
| 78 | Tag_Num = where( Tags EQ Tag_Name ) |
---|
| 79 | Tag_Num = Tag_Num[0] |
---|
| 80 | if (Tag_Num LT 0) then begin |
---|
| 81 | if NOT keyword_set( noprint ) then $ |
---|
| 82 | message,"Tag <"+Tag_Name+"> not found",/CONTIN |
---|
| 83 | return,[-2] |
---|
| 84 | endif |
---|
| 85 | endif |
---|
| 86 | |
---|
| 87 | if (Tag_Num LT 0) OR (Tag_Num GE Ntag) then begin |
---|
| 88 | message,"Tag# " + strtrim(Tag_Num,2) + " exceeds Max Tag# " $ |
---|
| 89 | + strtrim(Ntag-1,2) + " in structure",/CONTIN |
---|
| 90 | return,[-1] |
---|
| 91 | endif |
---|
| 92 | |
---|
| 93 | if N_elements( ipart ) GT 0 then begin ;check if any searching |
---|
| 94 | ;on a subset of input. |
---|
| 95 | w = where( ipart GE 0, nf ) |
---|
| 96 | if (nf LE 0) then return,[-1] |
---|
| 97 | if (nf LT N_elements( ipart )) then ipart = ipart[w] |
---|
| 98 | endif |
---|
| 99 | |
---|
| 100 | ;Now find out where for RANGE : |
---|
| 101 | |
---|
| 102 | if N_elements( range ) EQ 2 then begin |
---|
| 103 | |
---|
| 104 | if N_elements( ipart ) GT 0 then begin |
---|
| 105 | |
---|
| 106 | w = where( (Struct[ipart].(Tag_Num) GE range[0]) AND $ |
---|
| 107 | (Struct[ipart].(Tag_Num) LE range[1]), Nfound ) |
---|
| 108 | |
---|
| 109 | if (Nfound GT 0) then windex = ipart[w] else windex = w |
---|
| 110 | |
---|
| 111 | endif $ |
---|
| 112 | else windex = where( (Struct.(Tag_Num) GE range[0]) AND $ |
---|
| 113 | (Struct.(Tag_Num) LE range[1]), Nfound ) |
---|
| 114 | |
---|
| 115 | if (Nfound LE 0) AND (NOT keyword_set( noprint ) ) then begin |
---|
| 116 | strnums = strtrim( range, 2 ) |
---|
| 117 | string = strnums[0] + "," + strnums[1] |
---|
| 118 | message," NO values of <" + Tags[Tag_num] + $ |
---|
| 119 | "> found in the Range [" + string + "]",/CONTIN |
---|
| 120 | endif |
---|
| 121 | ;where Values: |
---|
| 122 | |
---|
| 123 | endif else if N_elements( values ) GE 1 then begin |
---|
| 124 | |
---|
| 125 | Nval = N_elements( values ) |
---|
| 126 | vals = [values] |
---|
| 127 | Nfound = 0 |
---|
| 128 | |
---|
| 129 | if N_elements( ipart ) GT 0 then begin |
---|
| 130 | |
---|
| 131 | for v=0,Nval-1 do begin |
---|
| 132 | w = where( Struct[ipart].(Tag_Num) EQ vals[v], Nf ) |
---|
| 133 | if (Nf GT 0) then begin |
---|
| 134 | if (Nfound GT 0) then ww = [ww,w] else ww = w |
---|
| 135 | endif |
---|
| 136 | Nfound = Nfound + Nf |
---|
| 137 | endfor |
---|
| 138 | |
---|
| 139 | if (Nfound GT 0) then windex = ipart[ww[sort( ww )]] $ |
---|
| 140 | else windex = w |
---|
| 141 | |
---|
| 142 | endif else begin |
---|
| 143 | |
---|
| 144 | for v=0,Nval-1 do begin |
---|
| 145 | w = where( Struct.(Tag_Num) EQ vals[v], Nf ) |
---|
| 146 | if (Nf GT 0) then begin |
---|
| 147 | if (Nfound GT 0) then ww = [ww,w] else ww = w |
---|
| 148 | endif |
---|
| 149 | Nfound = Nfound + Nf |
---|
| 150 | endfor |
---|
| 151 | |
---|
| 152 | if (Nfound GT 0) then windex = ww[sort( ww )] $ |
---|
| 153 | else windex = w |
---|
| 154 | |
---|
| 155 | endelse |
---|
| 156 | |
---|
| 157 | if (Nfound LE 0) AND (NOT keyword_set( noprint ) ) then begin |
---|
| 158 | strnums = strtrim( vals, 2 ) |
---|
| 159 | string = strnums[0] |
---|
| 160 | for i=1,Nval-1 do string = string + "," + strnums[i] |
---|
| 161 | message," NO values of <" + Tags[Tag_num] + $ |
---|
| 162 | "> found Equaling [" + string + "]",/CONTIN |
---|
| 163 | endif |
---|
| 164 | |
---|
| 165 | endif else begin |
---|
| 166 | |
---|
| 167 | message,"must specify a RANGE=[#,#] or VALUES=#('s)",/CONTIN |
---|
| 168 | windex=[-1] |
---|
| 169 | endelse |
---|
| 170 | |
---|
| 171 | return, windex |
---|
| 172 | end |
---|