; docformat = 'idl' ;+ ; NAME: ; ajs_vmax_ngals_multiplot_4d ; ; PURPOSE: ; This procedure provides a visualisation of a four-dimensional ; space density (number of galaxies per unit volume per unit A, B, C, ; D - absolute magnitudes, etc.). For a four-dimensional parameter ; space (luminosities, SBs, ; etc), fixing the value of two of these parameters, plot ; contours of constant Vmax along with the number of objects in ; each bin, for the other two parameters. Do this for all ; combinations of parameters and all bins (six plots in all). ; ; CATEGORY: ; ; CALLING SEQUENCE: ; ajs_vmax_ngals_multiplot_4d, $ ; plotfile_base, axis_labels, varmin, varmax, $ ; nbins, $ ; bincentres1, bincentres2, bincentres3, bincentres4 ; ; INPUTS: ; plotfile_base : E.g., '/Users/.../vmax_ngalx_multiplot_' ; Appends '01.eps' etc. ; axis_labels : ['M_K', 'K SB', 'log10(R_K)', 'M_r'] ; varmin : [4] Minimum values of the four parameters ; varmax : [4] Maximum values of the four parameters ; nbins : [4] Number of bins for ngalsall for each parameter ; bincentres<n> : [nbins[<n-1>]] Value of parameter at bin centre ; ; OPTIONAL INPUTS: ; ; KEYWORD PARAMETERS: ; phi_arr : [nbins[0] , ... , nbins[3]] Phi in each bin ; ngalsall : [nbins[0] , ... , nbins[3]] number in each bin ; vmax_arr : [nbinsvmax[0] , ...] Vmax in each bin ; nbinsvmax : [4] Number of bins for vmax_arr for each parameter ; (Must be an integer multiple of nbins) ; bincentresvmax<n> : [nbinsvmax[<n-1>]] Value of parameter at bincentre ; show_plots : Open plot files for viewing ; ; OUTPUTS: ; Six plots (EPS files) ; ; OPTIONAL OUTPUTS: ; ; COMMON BLOCKS: ; ; SIDE EFFECTS: ; Resets multiplot settings (multiplot,/default) ; ; RESTRICTIONS: ; Parameters 1, 2 & 4 reversed to give faint -> bright ; Parameter 3 not reversed (radius) ; ; PROCEDURE: ; ; EXAMPLE: ; Use calling sequence verbatim ; ; MODIFICATION HISTORY: ; 23 Nov 2007 : Created, Anthony Smith ;- PRO ajs_vmax_ngals_multiplot_4d, $ plotfile_base, axis_labels, varmin, varmax, $ nbins, $ bincentres1, bincentres2, bincentres3, bincentres4, $ phi_arr=phi_arr, ngalsall=ngalsall, $ vmax_arr=vmax_arr, nbinsvmax=nbinsvmax, $ bincentresvmax1=bincentresvmax1, bincentresvmax2=bincentresvmax2, $ bincentresvmax3=bincentresvmax3, bincentresvmax4=bincentresvmax4, $ show_plots=show_plots compile_opt idl2 plot_ngals = keyword_set(ngalsall) ; Plot ngals? plot_vmax = keyword_set(vmax_arr) ; Plot vmax? plot_phi = keyword_set(phi_arr) ; Plot phi? IF plot_vmax THEN BEGIN fine = nbinsvmax[0] / nbins[0] levels = [1, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9] c_annotation = ['1e0', '1e1', '1e2', '1e3', '1e4', '1e5', $ '1e6', '1e7', '1e8', '1e9'] ENDIF IF plot_phi THEN BEGIN levels_phi_min_log = alog10(min(phi_arr[where(phi_arr GT 0)])) levels_phi_range_log = alog10(max(phi_arr)) - levels_phi_min_log levels_phi = 10 ^ (findgen(256) / 255 * levels_phi_range_log $ + levels_phi_min_log) c_colors_phi = indgen(256) ENDIF set_plot,'ps' ; device for graphics output charsizetemp = !P.charsize ;; Loop over six massive plots FOR px = 0, 2 DO BEGIN FOR py = px + 1, 3 DO BEGIN ;; Put four parameters in correct order p_others = ([0,1,2,3])[where([0,1,2,3] NE px AND [0,1,2,3] NE py)] r = execute('bc1 = bincentres' + string(px + 1, format='(I0)')) r = execute('bc2 = bincentres' + string(py + 1, format='(I0)')) r = execute('bc3 = bincentres' + string(p_others[0] + 1, $ format='(I0)')) r = execute('bc4 = bincentres' + string(p_others[1] + 1, $ format='(I0)')) IF plot_vmax THEN BEGIN r = execute('bcvm1 = bincentresvmax' + string(px + 1, $ format='(I0)')) r = execute('bcvm2 = bincentresvmax' + string(py + 1, $ format='(I0)')) r = execute('bcvm3 = bincentresvmax' + string(p_others[0] + 1, $ format='(I0)')) r = execute('bcvm4 = bincentresvmax' + string(p_others[1] + 1, $ format='(I0)')) ENDIF ;; Setup postscript file multiplotfile = $ plotfile_base + string(px, format='(I0)') $ + string(py, format='(I0)') $ + '.eps' device,filename=multiplotfile,/col,/encapsulated !P.charsize = 0.5 ;; Start new multiplot, label axes/title erase multiplot, $ [nbins[p_others[0]],nbins[p_others[1]]], gap=0, $ mXtitle=axis_labels[p_others[0]], $ mYtitle=axis_labels[p_others[1]], $ mTitle= $ 'Volume probed (h!U-3!N Mpc!U3!N) and number of galaxies, ' $ + 'varying ' + axis_labels[p_others[0]] + ' AND ' $ + axis_labels[p_others[1]], $ mTitSize=0.5, mxTitSize=0.5, myTitSize=0.5, $ mTitOffset=-0.7, mxTitOffset=-1.7, myTitOffset=-2 !P.charsize=0.2 ;; Loop over each of the subplots FOR i = 0, nbins[p_others[0]] * nbins[p_others[1]] - 1 DO BEGIN ;; Which plot is this? Convert i to (j, k) IF p_others[0] EQ 2 THEN $ ;; Left to right j = i - i / nbins[p_others[0]] * nbins[p_others[0]] $ ELSE $ ;; Right to left (reverse) j = nbins[p_others[0]] - 1 $ - (i - i / nbins[p_others[0]] * nbins[p_others[0]]) IF p_others[1] EQ 2 THEN $ ;; Bottom to top (reverse) k = nbins[p_others[1]] - 1 - (i / nbins[p_others[0]]) $ ELSE $ ;; Top to bottom k = (i / nbins[p_others[0]]) ;; Make arrays of the two parameters to be varied in subplot IF plot_ngals THEN BEGIN CASE px*10 + py OF 01: ngalsall_temp = ngalsall[*, *, j, k] 02: ngalsall_temp = ngalsall[*, j, *, k] 03: ngalsall_temp = ngalsall[*, j, k, *] 12: ngalsall_temp = ngalsall[j, *, *, k] 13: ngalsall_temp = ngalsall[j, *, k, *] 23: ngalsall_temp = ngalsall[j, k, *, *] ENDCASE ngalsall_temp = reform(ngalsall_temp, nbins[px], nbins[py]) ENDIF IF plot_phi THEN BEGIN CASE px*10 + py OF 01: phi_arr_temp = phi_arr[*, *, j, k] 02: phi_arr_temp = phi_arr[*, j, *, k] 03: phi_arr_temp = phi_arr[*, j, k, *] 12: phi_arr_temp = phi_arr[j, *, *, k] 13: phi_arr_temp = phi_arr[j, *, k, *] 23: phi_arr_temp = phi_arr[j, k, *, *] ENDCASE phi_arr_temp = reform(phi_arr_temp, nbins[px], nbins[py]) ENDIF IF plot_vmax THEN BEGIN CASE px*10 + py OF 01: vmax_arr_temp = vmax_arr[*, *, j*fine + (fine-1)/2., $ k*fine + (fine-1)/2.] 02: vmax_arr_temp = vmax_arr[*, j*fine + (fine-1)/2., *, $ k*fine + (fine-1)/2.] 03: vmax_arr_temp = vmax_arr[*, j*fine + (fine-1)/2., $ k*fine + (fine-1)/2., *] 12: vmax_arr_temp = vmax_arr[j*fine + (fine-1)/2., *, *, $ k*fine + (fine-1)/2.] 13: vmax_arr_temp = vmax_arr[j*fine + (fine-1)/2., *, $ k*fine + (fine-1)/2., *] 23: vmax_arr_temp = vmax_arr[j*fine + (fine-1)/2., $ k*fine + (fine-1)/2., *, *] ENDCASE vmax_arr_temp = reform(vmax_arr_temp, $ nbinsvmax[px], nbinsvmax[py]) ENDIF ;; Range for the subplot axes IF px EQ 2 THEN $ xrange = [varmin[px],varmax[px]] $ ELSE $ xrange = [varmax[px],varmin[px]] IF py EQ 2 THEN $ yrange = [varmin[py],varmax[py]] $ ELSE $ yrange = [varmax[py],varmin[py]] ;; Titles for the subplot axes (only at the edges) IF i MOD nbins[p_others[0]] EQ 0 THEN $ ytitle = axis_labels[py] $ ELSE $ ytitle = '' IF (nbins[p_others[0]] * nbins[p_others[1]] - i) $ LE nbins[p_others[0]] THEN $ xtitle = axis_labels[px] $ ELSE $ xtitle = '' ;; Plot data on subplot plot, [0], [0], /nodata, xrange=xrange, yrange=yrange, $ xtitle=xtitle, ytitle=ytitle, /xstyle, /ystyle ;; IF plot_ngals THEN BEGIN ;; ajs_density_plot, bc1, bc2, $ ;; ngalsall_temp, $ ;; xrange=xrange, yrange=yrange, $ ;; xtitle=xtitle, ytitle=ytitle ;; ENDIF ELSE BEGIN ;; plot, [0], [0], /nodata, xrange=xrange, yrange=yrange, $ ;; xtitle=xtitle, ytitle=ytitle, /xstyle, /ystyle ;; ENDELSE IF plot_phi THEN BEGIN loadct, 33, /silent contour, $ phi_arr_temp, $ bc1, bc2, /overplot, c_charsize=!P.charsize, color=1, $ levels=levels_phi, $ ;c_annotation=c_annotation_phi, $ c_color=c_colors_phi, /fill set_basic_colours ENDIF IF plot_ngals THEN BEGIN ajs_density_plot, bc1, bc2, $ ngalsall_temp, /overplot ENDIF IF plot_vmax THEN BEGIN contour, $ vmax_arr_temp, $ bcvm1, bcvm2, /overplot, $ levels=levels, $ c_annotation=c_annotation, c_charsize=!P.charsize, color=2 ENDIF legend, $ [axis_labels[p_others[0]] + '=' $ + string(bc3[j], $ format='(G0.3)'), $ axis_labels[p_others[1]] + '=' $ + string(bc4[k], $ format='(G0.3)')], $ ;'Max V=' + string(max(vmax_arr_temp), format='(G0.3)')], $ /bottom, /right multiplot endfor device,/close multiplot,/default IF keyword_set(show_plots) THEN $ ajs_open_file, multiplotfile ENDFOR ENDFOR !P.charsize = charsizetemp set_plot,'X' ; back to normal END