pro dpc_data,info,dpc,bit_num,stbit,nbits,type,num,arr_num,name,all_dpc_info
bit_info=''
dpc_info=''
all_dpc_info(num,arr_num,0)=name
all_dpc_info(num,arr_num,1)=bit_num
if nbits ne 4 then begin
  for i=0,nbits-1 do begin   
     bit_info=bit_info+strtrim(string(mask(dpc,stbit+nbits-i-1,1)),2)
  endfor
endif
if ((type eq 'SS') or (type eq 'LF')) and ((bit_num eq '24-27') or (bit_num eq '22-23') $
  or (bit_num eq '16-21')) then temp_type='SS+LF' else temp_type=type
if nbits eq 4 then bit_info=mask(dpc,stbit,nbits)
for i=0,n_elements(info(1,*))-1 do begin
   if info(1,i) eq bit_num then begin
      if (info(3,i) eq strtrim(temp_type,2)) or (bit_num eq '28-29') then begin
	if nbits eq 4 then begin
	 if info(2,i) eq strtrim(string(bit_info,format='(Z)'),2) then begin
	    all_dpc_info(num,arr_num,3)=info(4,i)
	    if (info(3,i) ne '') and (type eq '') then type=info(3,i)
	 endif
	endif else begin
	   if info(2,i) eq strtrim(bit_info,2) then begin
	      all_dpc_info(num,arr_num,3)=info(4,i)
	      if (info(3,i) ne '') and (type eq '') then type=info(3,i)
	  endif
	endelse
	
      endif
   endif
endfor
all_dpc_info(num,arr_num,2)=strtrim(string(mask(dpc,stbit,nbits)),2)
end
;-----------------------------------------------------------------------
pro dpc_decode, dpc, table=table, outfil=outfil, infil=infil
;+
;NAME:
;	dpc_decode
;PURPOSE:
;	To decode the MDI Data Product Code (DPC)
;SAMPLE CALLING SEQUENCE:
;	dpc_decode, 'c2000fc0'x
;	dpc_decode, ['C2000FC0'x,'C2400FC0'x,'C6000FC0'x,'C6400FC0'x,'C3409001'x,'C7409001'x,$
;			'C9400FC0'x,'C8400FC0'x,'9180AFB0'x,'83006001'x,'85805001'x,'87805001'x], /table
;HISTORY:
;	Written 15-Nov-95 by Dan Goldberg
;	16-Nov-95 (MDM) - Modified slightly
;-
;
if (n_elements(outfil) eq 0) then outfil = 'dpc_decode.txt'
if (n_elements(infil) eq 0) then infil = '$MDI_CAL_INFO/dpc_decode.lst'
;
openw,lun, outfil, /get_lun
if n_elements(dpc) eq 0 then begin
    print, 'enter data product code'
    read, dpc,format='(Z)'
endif
print,''
all_dpc_info=strarr(n_elements(dpc),9,4)
;all_info={all_dpc_info:all_dpc_info,name:''}
;all=replicate(all_info,n_elements(dpc))
;dpc=str2arr(dpc0,delim=',')
info=rd_tfile(infil,5,2,delim='|')
for i=0,n_elements(dpc)-1 do begin

type=''
dpc_info=''
bit_num='31'
;all_dpc_info(i,7,0)=dpc(i)
name='System:'
dpc_data,info,dpc(i),bit_num,31,1,type,i,0,name,all_dpc_info

bit_num='30'
name='Telemetry:'
dpc_data,info,dpc(i),bit_num,30,1,type,i,1,name,all_dpc_info


bit_num='28-29'
name='Product type:'
dpc_data,info,dpc(i),bit_num,28,2,type,i,2,name,all_dpc_info


bit_num='24-27'
name='Observable:'
dpc_data,info,dpc(i),bit_num,24,4,type,i,3,name,all_dpc_info


bit_num='22-23'
name='Obs details:'
dpc_data,info,dpc(i),bit_num,22,2,type,i,4,name,all_dpc_info


bit_num='16-21'
name='Version:'
dpc_data,info,dpc(i),bit_num,16,6,type,i,5,name,all_dpc_info


bit_num='12-15'
name='Binning type:'
dpc_data,info,dpc(i),bit_num,12,4,type,i,6,name,all_dpc_info

bit_num='8-11'
name=''
dpc_data,info,dpc(i),bit_num,8,4,type,i,7,name,all_dpc_info

bit_num='0-7'
name=''
dpc_data,info,dpc(i),bit_num,0,8,type,i,8,name,all_dpc_info
endfor
if keyword_set(table) then begin
  print, format='(5X,"DPC",7X,"SYSTEM",4X,"TELEM",6X,"PRODUCT TYPE",7X,"OBSERVABLE",8X,"OBS DETAILS",2X,"VER",10X,"BINNING TYPE",2X,"8-11",3X,"0-7")'
printf,lun,format='(5X,"DPC",7X,"SYSTEM",4X,"TELEM",6X,"PRODUCT TYPE",7X,"OBSERVABLE",8X,"OBS DETAILS",2X,"VER",10X,"BINNING TYPE",2X,"8-11",3X,"0-7")'
  for i=0,n_elements(dpc)-1 do begin
print,format='(Z8,2X,A11,2X,A7,2X,A16,2X,A15,2X,A17,2X,A3,2X,A20,2X,A4,2X,A4)',dpc(i),all_dpc_info(i,0,3),all_dpc_info(i,1,3) $
  ,all_dpc_info(i,2,3),all_dpc_info(i,3,3),all_dpc_info(i,4,3),all_dpc_info(i,5,2) $
  ,(all_dpc_info(i,6,3)),all_dpc_info(i,7,2),all_dpc_info(i,8,2)
printf,lun,format='(Z8,2X,A11,2X,A7,2X,A16,2X,A15,2X,A17,2X,A3,2X,A20,2X,A4,2X,A4)',dpc(i),all_dpc_info(i,0,3),all_dpc_info(i,1,3) $
  ,all_dpc_info(i,2,3),all_dpc_info(i,3,3),all_dpc_info(i,4,3),all_dpc_info(i,5,2) $
  ,(all_dpc_info(i,6,3)),all_dpc_info(i,7,2),all_dpc_info(i,8,2)
endfor
endif else begin
print, format='(5X,"Operation",3X,"Bits",3X,"Value",27X,"Description")'
printf,lun,format='(5X,"Operation",3X,"Bits",3X,"Value",27X,"Description")'
print,''
printf,lun,''
for j=0,n_elements(all_dpc_info(*,0,0))-1 do begin
  print, format='(8X,"dpc= ",Z8)',dpc(j)
  printf,lun,format='(8X,"dpc= ",Z8)',dpc(j)
  print, '--------------------------------'
  printf,lun,'--------------------------------'
  for i=0,n_elements(all_dpc_info(0,*,0))-1 do begin
     print,format='(A15,A6,A6,A40)',all_dpc_info(j,i,0),all_dpc_info(j,i,1), $
         all_dpc_info(j,i,2),all_dpc_info(j,i,3)
     printf,lun,format='(A15,A6,A6,A40)',all_dpc_info(j,i,0),all_dpc_info(j,i,1), $
         all_dpc_info(j,i,2),all_dpc_info(j,i,3)
endfor
print,''
endfor
endelse
close,lun
free_lun,lun
end

