Blame view

src/idl_extern/CMTotal_for_Dustemwrap/cmrebin.pro 1.46 KB
517b8f98   Annie Hughes   first commit
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
function cmrebin, array, D1, D2, D3, D4, dimension=dims, total=total

  sz     = size(array)
  type   = sz( sz(0) + 1 )
  np     = n_params()
  if n_elements(dims) EQ 0 AND (np LT 2 OR np GT 5) then $
    message, 'ERROR: must specify >0 and <5 dimensions in DIMS or D1, D2, ...'

  if n_elements(dims) EQ 0 then begin
      case np of 
          2: dims = [d1]
          3: dims = [d1, d2]
          4: dims = [d1, d2, d3]
          5: dims = [d1, d2, d3, d4]
      endcase
  endif
  nd = n_elements(dims)

  if type GT 0 AND type LT 4 then tmpres = double(array) else tmpres = array

  case nd of
      1: tmpres = rebin(temporary(tmpres),dims(0))
      2: tmpres = rebin(temporary(tmpres),dims(0),dims(1))
      3: tmpres = rebin(temporary(tmpres),dims(0),dims(1),dims(2))
      4: tmpres = rebin(temporary(tmpres),dims(0),dims(1),dims(2),dims(3))
  endcase

  if keyword_set(total) then begin
      total1 = double(total(array))
      total2 = double(total(tmpres))
      if total2 GT 0 then tmpres = temporary(tmpres) * (total1 / total2)
  endif

  newsz = size(tmpres)
  if type EQ newsz(newsz(0)+1) then return, reform(tmpres, dims, /overwrite)

  castfns = ['UNDEF', 'BYTE', 'FIX', 'LONG', 'FLOAT', $
             'DOUBLE', 'COMPLEX', 'UNDEF', 'UNDEF', 'DCOMPLEX' ]
  if type GE 1 AND type LE 3 then $
    tmpres = call_function(castfns(type), round(temporary(tmpres))) $
  else $
    tmpres = call_function(castfns(type), temporary(tmpres))
  return, reform(tmpres, dims, /overwrite)
end