;+
; PROJECT
;           SOLARB EIS
;
; NAME
;           EIS_PLOT_DR
;
; PURPOSE
;           Procedure to calculate and plot Data Rate
;
; INPUTS
;           lines           - Data Rate string array
;           data_out_struct - structure
;
; CATEGORY
;           EIS timeline planning
;
; WRITTEN
;           John A Rainne RAL, 16-Nov-2007
;
; VERSION
;           v0.1 JAR 26-Nov-2007
;               Now take account of what was already in the data recorder.
;           v0.2 JAR 30-Nov-2007
;               Added a volume offset parameter. I won't know how much data
;               is already in the data recorder (although I'm guessing all
;               the data will be downloaded in a 24-hour period)
;          v0.3 JAR 17-Dec-2007
;               Fixed a bug where first contact is before first raster
;          v0.4 JAR 6-Jun-2008
;               Fixed bug encountered when no studies are input
;
;-
;______________________________________________________________________________
FUNCTION eis_get_data_in , lines                        ,                  $
                           wid_datetime_start           ,                  $
                           wid_datetime_stop            ,                  $
                           data_out_struct              ,                  $
                           vol_offset

struct = {start_t:0.D , stop_t:0.D , dr:0. , st_dur:0.D , st_vol:0.D}

IF (IS_BLANK(lines[0]) EQ 1) THEN BEGIN

   dr           = struct
   real_start_t = wid_datetime_start
   real_stop_t  = wid_datetime_stop
   vol_offset   = 0.
   data_in      = DBLARR(real_stop_t - real_start_t + 2) + vol_offset
   data_out     = DBLARR(real_stop_t - real_start_t + 2)
   data_max     = DBLARR(real_stop_t - real_start_t + 2)

ENDIF ELSE BEGIN
   n_lines = N_ELEMENTS(lines)
   ;
   ; Get array of structures - one for each DR line (per raster)
   ;

   dr     = REPLICATE(struct , n_lines)
   FOR i  = 0, n_lines -1 DO BEGIN

       line          = lines[i]
       split         = STRSPLIT(line , /EXTRACT)
       start_t       = eis_fix_time(split[0],split[1])
       stop_t        = eis_fix_time(split[2],split[3])
       dr[i].start_t = anytim2tai(start_t)
       dr[i].stop_t  = anytim2tai(stop_t)
       dr[i].dr      = FLOAT(split[4])
       dr[i].st_dur  = dr[i].stop_t - dr[i].start_t
       dr[i].st_vol  = dr[i].dr * dr[i].st_dur

   ENDFOR

;data_in      = DBLARR(MAX(dr[*].stop_t) - MIN(dr[*].start_t) + 2)
;data_out     = DBLARR(MAX(dr[*].stop_t) - MIN(dr[*].start_t) + 2)
;real_start_t = MIN(dr[*].start_t)

;
; Create data vectors - per second
; Use minimum start time (whether raster or display time) and
; maximum stop times.
;

real_start_t = MIN([ wid_datetime_start , MIN(dr[*].start_t) ])
real_stop_t  = MAX([ wid_datetime_stop  , MAX(dr[*].stop_t ) ])
data_in      = DBLARR(real_stop_t - real_start_t + 2) + vol_offset
data_out     = DBLARR(real_stop_t - real_start_t + 2)
data_max     = DBLARR(real_stop_t - real_start_t + 2)

;
; DATA IN
;
;
; Loop over each line - this is where things get complicated!
;
FOR i = 0, n_lines -1 DO BEGIN

    ; From end of raster, add raster volume
    data_in[(dr[i].stop_t - real_start_t + 1) :*] =                        $
    data_in[(dr[i].stop_t - real_start_t + 1) :*] + dr[i].st_vol

    ; This creates the ramp during the raster duration
    data_in[ (dr[i].start_t - real_start_t + 1.):                          $
             (dr[i].stop_t  - real_start_t     )] =                        $
           (dr[i].dr * FINDGEN(dr[i].stop_t - dr[i].start_t)) +            $
              data_in[(dr[i].start_t - real_start_t + 1.):                 $
                      (dr[i].stop_t  - real_start_t     )]

ENDFOR

ENDELSE

;
; DATA OUT & TOTAL
;
;
real_contacts = 0
; Filter out contacts outside the display time
IF (N_TAGS(data_out_struct) GT 0) THEN BEGIN

    ;
    ; Get MAX data
    ;
    FOR i = 0 , N_ELEMENTS(data_out_struct.vol_array) -1 DO BEGIN

       ;print,anytim2utc(real_start_t,/stime)
       vol_array      = data_out_struct.vol_array[i]
       eis_size_alloc = data_out_struct.vol_array[i].eis
       first_time     = data_out_struct.vol_array[i].first_time
       ; From end of raster, add raster volume
       max_limit = N_ELEMENTS(data_max) - 1
       data_max[max_limit < (first_time - real_start_t + 1) > 0 :*] =      $
                                                     eis_size_alloc

    ENDFOR
    ; Final vector value amy be toooooo big - truncate it
    data_max[N_ELEMENTS(data_max)-1] = data_max[N_ELEMENTS(data_max)-2]

    ;
    ;
    ;

    start_time = data_out_struct.contact.start_time
    stop_time  = data_out_struct.contact.stop_time

    filter = WHERE((start_time LE real_stop_t  ) AND                       $
                   (stop_time  GE real_start_t )     , count)

    IF (count GT 0) THEN BEGIN

       real_contacts   = data_out_struct.contact[filter]
       size_downloaded = FLTARR(count)


       FOR i = 0, count -1 DO BEGIN

           ; JAR 17-Dec-2007
           ; Ensure start time is NOT less than real_start_t and that
           ; stop time is NOT greater than real_stop_t
           start_time   = real_contacts[i].start_time > real_start_t
           stop_time    = real_contacts[i].stop_time  < real_stop_t
           total_downloaded = 0.
           IF (i GT 0) THEN total_downloaded = TOTAL(size_downloaded[0:i-1])
           eis_size     = data_in[stop_time - real_start_t + 1]-total_downloaded
           eis_size_max = real_contacts[i].eis_size
           eis_size_min = MIN([eis_size,eis_size_max])
           size_downloaded[i] = eis_size_min

           dr_out       = eis_size_min / (stop_time - start_time)

           ; From end of raster, add raster volume
           data_out[(stop_time - real_start_t + 1) :*] =  $
           data_out[(stop_time - real_start_t + 1) :*] +  eis_size_min


           ; This creates the ramp during the download contact period
           data_out[ (start_time - real_start_t + 1.):                     $
                 (stop_time  - real_start_t     )] =                       $
           (dr_out * FINDGEN(stop_time - start_time)) +                    $
                   data_out[(start_time - real_start_t + 1.):              $
                            (stop_time  - real_start_t     )]


       ENDFOR

   ENDIF

ENDIF

RETURN , { data_in         : data_in                     ,                 $
           data_out        : -data_out                   ,                 $
           data_max        : data_max                    ,                 $
           data_total      : (data_in - data_out) > 0    ,                 $
           real_start_t    : real_start_t                ,                 $
           dr              : dr                          ,                 $
           data_out_struct : data_out_struct             ,                 $
           real_contacts   : real_contacts                                 $
         }

END