function get_tar_filename, trial_num, user_name
  return, string(trial_num, user_name, format='(%"trial_%04d_%s.tar")')
end

function get_1a_data,trial_num=trial_num,orbit_num=orbit_num,user_name=user_name,cam=cam
  outfn=get_level_1a_filename(orbit_num,cam,trial_num=trial_num,user_name=user_name,/rel_path)
  unpack_file,"output_data\"+get_tar_filename(trial_num,user_name),outfn,/verbose
  if file_test(outfn) then begin
    restore,outfn
  end else begin
    outfn=get_level_1a_filename(orbit_num,cam,trial_num=trial_num,user_name=user_name,/rel_path,/net_cdf)
    unpack_file,"output_data\"+get_tar_filename(trial_num,user_name),outfn,/verbose
    read_netCDF, outfn, data, attributes, status, /pointers_for_arrays
  end
  return,data
end

function get_1c_data,trial_num=trial_num,orbit_num=orbit_num,user_name=user_name
;  outfn=get_level_1c_filename(orbit_num,trial_num=trial_num,user_name=user_name,/rel_path)
  unpack_file,"output_data\"+get_tar_filename(trial_num,user_name),outfn,/verbose
  if file_test(outfn) then begin
    restore,outfn
  end else begin
;    outfn=get_level_1c_filename(orbit_num,trial_num=trial_num,user_name=user_name,/rel_path,/net_cdf)
    unpack_file,"output_data\"+get_tar_filename(trial_num,user_name),outfn,/verbose
    read_netCDF, outfn, data, attributes, status, /pointers_for_arrays
  end
  return,data
end

function get_debug_data,tag,trial_num=trial_num,orbit_num=orbit_num,user_name=user_name
;  outfn=get_debug_filename(tag,orbit_num,trial_num=trial_num,user_name=user_name,/rel_path)
  unpack_file,"output_data\"+get_tar_filename(trial_num,user_name),outfn,/verbose
  if file_test(outfn) then begin
  end else begin
    ;If netcdf flag was set, retrieval process wrote debug files in a blah.nc file, but still as
    ;an IDL save file, so just unpack the right .nc file, but then use restore to read it.
;    outfn=get_debug_filename(tag,orbit_num,trial_num=trial_num,user_name=user_name,/rel_path,/net_cdf)
    unpack_file,"output_data\"+get_tar_filename(trial_num,user_name),outfn,/verbose
  end
  sobj=obj_new('idl_savefile',outfn)
  names=sobj->names()
  restore,outfn
  result=execute('data='+names[0])
  obj_destroy,sobj
  return,data

end

pro tvcontour,data,x,y,interval
  s=size(data,/dimensions)
  contour,data,/device,/noerase,xrange=[0,s[0]],yrange=[0,s[1]],/follow,xstyle=5,ystyle=5,position=[x,y,x+s[0],y+s[1]],levels=(findgen(60)-30)*interval
end

pro show,data,sza,xofs,yofs,orbit_num,n,label,interval
  s=size(data,/dimensions)
  x=xofs+s[0]*orbit_num*n
  y=yofs+s[1]*(1-orbit_num)*n
  tvscl,/nan,data,x,y
  tvcontour,sza,x,y,interval
  if orbit_num then begin
  end else begin
    xyouts,s[0],y+s[1]/2,label,/device
  end
end

pro show_mask,i_layer_good,actual,i_cloud_ind,wset2_x,wset2_y,title,lat,labels=labels,wset7=wset7
  wset,2
  s=size(i_layer_good,/dimensions)
  i_cloud_act=logical_and(finite(actual),logical_and(i_layer_good,actual gt 0.1))
  w_layer_good=where(i_layer_good,n_layer_good)
  i_cloud_ind=logical_and(i_layer_good,i_cloud_ind)
  junk=where(i_cloud_act,n_cloud_act)
  junk=where(i_cloud_ind,n_cloud_ind)
  junk=where(logical_and(i_layer_good,~i_cloud_act),n_ncloud_act)
  junk=where(logical_and(i_layer_good,~i_cloud_ind),n_ncloud_ind)
  true_pos=logical_and(i_layer_good,logical_and(i_cloud_act,i_cloud_ind))
  true_neg=logical_and(i_layer_good,logical_and(~i_cloud_act,~i_cloud_ind))
  right=logical_or(true_pos,true_neg)
  junk=where(right,n_right)
  junk=0
  false_pos=logical_and(i_layer_good,logical_and(~i_cloud_act,i_cloud_ind))
  w_false_pos=where(false_pos,n_false_pos)

  false_neg=logical_and(i_layer_good,logical_and(i_cloud_act,~i_cloud_ind))
  w_false_neg=where(false_neg,n_false_neg)

  labels=[string(n_layer_good,format='(%"%d Good tiles")')]
  tv,i_layer_good*255,  wset2_x,wset2_y
  wset2_y+=s[1]

  labels=[labels,string(n_cloud_act,format='(%"%d Cloud present")')]
  tv,i_cloud_act*255,   wset2_x,wset2_y
  wset2_y+=s[1]

  labels=[labels,string(n_ncloud_act,format='(%"%d Cloud absent")')]
  tv,logical_and(i_layer_good,~i_cloud_act)*255,   wset2_x,wset2_y
  wset2_y+=s[1]

  labels=[labels,"Cloud detected"]
  tv,i_cloud_ind*200, wset2_x,wset2_y
  xyouts,/device,wset2_x,wset2_y+s[1]/2,string(n_cloud_ind),charsize=2
  wset2_y+=s[1]

  labels=[labels,"Cloud not detected"]
  tv,logical_and(i_layer_good,~i_cloud_ind)*30, wset2_x,wset2_y
  xyouts,/device,wset2_x,wset2_y+s[1]/2,string(n_ncloud_ind),charsize=2
  wset2_y+=s[1]

  labels=[labels,"Correct"]
  tv,right*254,wset2_x,wset2_y
  xyouts,/device,wset2_x,wset2_y+s[1]/2,string(n_right),charsize=2
  wset2_y+=s[1]

  labels=[labels,"False detection"]
  tv,false_pos*60,wset2_x,wset2_y
  xyouts,/device,wset2_x,wset2_y+s[1]*1/2,string(n_false_pos),charsize=2
  wset2_y+=s[1]

  labels=[labels,"Missed detection"]
  tv,false_neg*160,wset2_x,wset2_y
  xyouts,/device,wset2_x,wset2_y+s[1]*1/2,string(n_false_neg),charsize=2
  wset2_y+=s[1]

  xyouts,/device,wset2_x,wset2_y,title,charsize=2

  if keyword_set(wset7) then begin
    wset,7
    plot,lat[w_layer_good],actual[w_layer_good],psym=1,color=254,yrange=[-5,30]
    oplot,lat[w_false_neg],actual[w_false_neg],psym=1,color=160
    oplot,lat[w_false_pos],actual[w_false_pos],psym=1,color=60
  end
end

pro map_coverage_1c,user_name=user_name,trial=trial,orbit_num=orbit_num,fix_sigma=fix_sigma,fix_c=fix_c,n_clicks=n_clicks,x=x,y=y,zoom=zoom, $
                  data=data,tiles=tiles,initial_guess=initial_guess
;  common curvefit_trace,rad,input_c,input_sigma,input_a,input_r,coeff_record
  coeff_record=0
  input_c=39
  input_sigma=0.608d
  input_r=30
  input_a=25

  ;Clear the window, and get the rainbow+white color bar
  window,0,xpos=100,ypos=0,xsize=1800,ysize=1170,title="IDL 0 - Rad vs SSA curves and ratios"
  erase
  device,decomposed=0
  loadct,39

  ;these ofs's let you shift the image on the screen
  xofs=0
  yofs=0

  ;Load the data
  if n_elements(trial) eq 0 then trial=211
  if n_elements(user_name) eq 0 then user_name="jeppesen"
  if n_elements(orbit_num) eq 0 then orbit_num=0
  if n_elements(data) eq 0 then data=get_1c_data(trial_num=trial,orbit_num=orbit_num,user_name=user_name)
  if n_elements(tiles) eq 0 then tiles=get_debug_data("tile",trial_num=trial,orbit_num=orbit_num,user_name=user_name)

  ;Plot the image
  !p.multi=0
  level_1c_lat_lon,data,lat=lat,lon=lon
  c=*(data.ozone_col_density[0])<100
  s=size(c,/dimensions)
  h=*(data.scale_height_ratio[0])<2
  a=*(data.albedo[0])<100
  actual=*(data.cloud_no_phase[0])<100
  r=*(data.particle_radius[0])<100
  layer_good=intarr(s)

  tic
  assumed_c=39
  assumed_sigma=0.708
  for xx=0,s[0]-1 do begin
    for yy=0,s[1]-1 do begin
      this_layer_good=where(finite(tiles.ssa[xx,yy,*]),n_good)
      layer_good[xx,yy]=n_good
    end
  end
  sza=*(data.zenith_angle[0])
  print,"Max layers: ",max(/nan,layer_good)
  i_layer_good=layer_good gt 6
  s=size(layer_good,/dimensions)
  print,"size: ",s
  layer_good=rebin(layer_good,s[0]*2,s[1]*2,/sample)
  sza=rebin(sza,s[0]*2,s[1]*2,/sample)
  lat=rebin(lat,s[0]*2,s[1]*2,/sample)
  show,layer_good,sza,xofs,yofs,orbit_num,0,"Good layers",5
  tvcontour,lat,0,0,5

end