📄 group.pro
字号:
PRO GROUP, X, Y, RCRIT, NGROUP;+; NAME:; GROUP; PURPOSE:; Assign stars with non-overlapping PSF profiles into distinct groups; EXPLANATION:; Part of the IDL-DAOPHOT sequence;; CALLING SEQUENCE:; GROUP, X, Y, RCRIT, NGROUP;; INPUTS:; X - vector, giving X coordinates of a set of stars.; Y - vector, giving Y coordinates of a set of stars.; If X and Y are input as integers, then they will be converted to ; floating point; RCRIT - scalar, giving minimum distance between stars of two; distinct groups. Stars less than this distance from; each other are always in the same group. Stetson suggests; setting the critical distance equal to the PSF radius +; the Fitting radius.;; OUTPUTS:; NGROUP - integer vector, same number of elements as X and Y,; giving a group number for each star position. Group; numbering begins with 0.;; METHOD:; Each position is initially given a unique group number. The distance; of each star is computed against every other star. Those distances; less than RCRIT are assigned the minimum group number of the set. A; check is then made to see if any groups have merged together.;; PROCEDURES USED:; REM_DUP();; REVISION HISTORY:; Written W. Landsman STX April, 1988; Major revision to properly merge groups together W. Landsman Sep 1991; Work for more than 32767 points W. Landsman March 1997; Converted to IDL V5.0 W. Landsman September 1997; Avoid overflow if X and Y are integers W. Landsman Feb. 1999 ;- On_error,2 ;Return to caller if N_params() LT 4 then begin print,'Syntax - group, x, y, rcrit, ngroup' print,' x,y - Input position vectors' print,' rcrit - Minimum radius between stars of different groups' print,' ngroup - Output vector of group indices' return endif rcrit2 = rcrit^2 ;Don't bother taking square roots npts = min( [N_elements(x), N_elements(y)] ) ;Number of stars if npts LT 2 then message, $ 'ERROR - Input position X,Y vectors must contain at least 2 points x = 1.0*x & y = 1.0*y ;Make sure at least floating point ngroup = lindgen(npts) ;Initially each star in a separate group; Whenever the positions between two stars are less than the critical; distance, assign both stars the minimum group id. The tricky part; is to recognize when distinct groups have merged together. for i = 0l,npts-2 do begin dis2 = (x[i] - x[i+1:*])^2 + (y[i] - y[i+1:*])^2 good = where( dis2 LE rcrit2, ngood) if ngood GT 0 then begin ;Any stars within critical radius? good = [i,good+i+1] groupval = ngroup[good] mingroup = min( groupval ) if ( mingroup LT i ) then begin ;Any groups merge? groupval = groupval[ where( groupval LT i, nval) ] if nval GT 1 then $ groupval = groupval[ rem_dup(groupval) ] nval = N_elements(groupval) if nval GE 2 then for j= 1, nval-1 do begin redo = where ( ngroup EQ groupval[j], ndo ) if ndo GT 0 then ngroup[redo] = mingroup endfor endif ngroup[good] = mingroup endifendfor;; Star are now placed in distinct groups, but they are not ordered; consecutively. Remove gaps in group ordering; if max(ngroup) EQ 0 then return ;All stars in one group ? ghist = histogram(ngroup,min=0) gmax = max(ghist) val = where(ghist GE 1, ngood) if ( ngood GT 0 ) then $ for i = 0, ngood-1 do ngroup[ where( ngroup EQ val[i] ) ] = i message,'Number of Groups: '+ strtrim(ngood,2), /INF message,'Largest group size '+ strtrim(gmax,2) + ' stars',/INF return end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -