;+  
;
; Laboratory for Atmospheric and Space Physics
; University of Colorado, Boulder, Colorado, USA
;
; AUTHOR:
;   Lon Riesberg
;
; DATE:   November 17, 2008
;
; PURPOSE:
;   Processes high-res images.  Intended to be regularly called via cron
;   to produce near real-time images.
; 
;  NOTES
; 
;  CONSTRAINTS:
;    None
; 
; INPUT PARAMETERS:
;    None
;
; OUTPUT PARAMETERS:
;    None.
;
; RETURN VALUE (if applicable):
;    Not Applicable
;
; KEYWORD ARGUMENTS:
;    None
;
; OTHER SERVERS/MODULES USED:
;    None
;
; USAGE EXAMPLE:
;    process_hires, start_time, stop_time, ret_info, retrieval_param=retrieval_param
;-
pro process_hires, start_time, stop_time, net_cdf=net_cdf,no_catch=no_catch

   outgoing_file_directory = '/aim/data/cips/hires/outgoing/'
   sent_file_directory = '/aim/data/cips/hires/sent/'
   temp_hires_directory = '/aim/data/cips/hires/temp'
   cam = 'px'
   
   print, 'start_time: ', start_time
   print, 'stop_time: ', stop_time
   orbit_info_array = get_orbit_info(start_time, stop_time)
   print, 'looking for data in orbits: ', orbit_info_array.orbit_number
   
   ; for each orbit from the past 24 hours, get L2 filename and check if already processed... 
   ; if not in /aim/data/cips/hires/outgoing and not in
   ;  /aim/data/cips/hires/sent directories, process
   for orbit_idx=0, (n_elements(orbit_info_array)-1) do begin

      if ~keyword_set(no_catch) then catch, status else status=0
      if status ne 0 then begin

         ; catch error and print stack trace
         catch, /cancel
	      handle_error, status

         ; cleanup memory
         if n_elements(result) gt 0 then str_free, result
         if obj_valid(l2a_server) gt 0 then obj_destroy, l2a_server
         if obj_valid(l4_server) gt 0 then obj_destroy, l4_server
         check_memory

	      ; skip to next orbit
         orbit_idx++
      endif

      curr_orbit_info = orbit_info_array[orbit_idx]

      ;
      ; check if this orbit has already been produced
      ;
      l2_filename = get_level_2a_filename(curr_orbit_info.orbit_number, net_cdf=netcdf, $
                    orbit_info=curr_orbit_info, prelim=curr_orbit_info.preliminary,/png)
      outgoing_file = outgoing_file_directory + file_basename(l2_filename)
      sent_file = sent_file_directory + file_basename(l2_filename)
      if file_test(outgoing_file) or file_test(sent_file) then continue
      print, l2_filename + ' not found. '
      
      
      ;
      ; don't process incomplete orbits
      ;
      print, 'checking number of available images for orbit num ' + string(curr_orbit_info.orbit_number, format='(i0)') + '...'
      ; 'primary_science': obs_id = '0x0000'
      level0_images = get_cips_sci_tlm(curr_orbit_info.start_time, curr_orbit_info.stop_time, $
                                       'px', obs_id='0x0000', /gps, sid=1)
      ; number of returned images
      if (size(level0_images, /type) ne 8) then continue 
      num_images = n_elements(level0_images)
      if num_images lt 25 then continue
      print, 'found ', string(num_images, format='(i0)'), ' images'
      str_free, level0_images
      
      
      ; 
      ; create hi-res orbit strip
      ;
      print, 'processing...'
      stack_info = default_stack_info()

      ; process normal-res level 4 data first... that will be used later
      ; to subtract the background off of L2.  doing a hi-res L4 runs
      ; out of memory
      l4_server = obj_new('level_4_retrieval_server', obj_new())
      result = l4_server->get_data(curr_orbit_info, net_cdf=net_cdf, stack_info=stack_info)
      str_free, result
      obj_destroy, l4_server

      ; delete normal-res 1B... this will be recreated as a hi-res 1B during L2 processing below
      l1b_filename = get_level_1b_filename(curr_orbit_info.orbit_number, season=get_season(usec2la(curr_orbit_info.start_time)), $
                     orbit_info=curr_orbit_info, net_cdf=net_cdf, prelim=curr_orbit_info.preliminary) 
      if file_test(l1b_filename + '.gz') then file_delete, (l1b_filename + '.gz') $
      else if file_test(l1b_filename) then file_delete, l1b_filename $
      else message, l1b_filename + ' not found', /info 

      ; delete normal-res 1C... this will be recreated as a hi-res 1C during L2 processing below
      l1c_filename = get_level_1c_filename(curr_orbit_info.orbit_number, season=get_season(usec2la(curr_orbit_info.start_time)), $
                     orbit_info=curr_orbit_info, net_cdf=net_cdf, prelim=curr_orbit_info.preliminary) 
      if file_test(l1c_filename + '.gz') then file_delete, (l1c_filename + '.gz') $
      else if file_test(l1c_filename) then file_delete, l1c_filename $
      else message, l1c_filename + ' not found', /info 

      ; hi-res mode
      stack_info.kmperpix = 2
      l2a_server = obj_new('level_2A_petal_server', obj_new())
      result = l2a_server->get_data(curr_orbit_info, cam=cam, net_cdf=net_cdf, stack_info=stack_info)

      ;draw the petal
      draw_petal,*result,l2_filename,/west_ct

      ;draw the petal
      draw_petal,result,filename=l2_filename
      str_free, result
      obj_destroy, l2a_server
      
      ; orbit strip will be dropped in !data_product_path... move to the
      ; outgoing_file_directory as defined above.  a cron running on 
      ; mods-apps regularly looks in the outgoing_file_directory and 
      ; pushes any found files to hampton u.  that cron then moves the
      ; files to sent_file_directory/
      file_move, l2_filename, outgoing_file_directory
      
      print, l2_filename + ' created and moved to ' + outgoing_file_directory
      check_memory
    
   endfor
   
   return
   
end 
   
  
