function lyra_remove_event, path_data, date, time_ts, series_ts, $
                            event_type = event_type, keep_event = keep_event
;+
; NAME: 
;   lyra_remove_event
;
; PURPOSE: 
;   Remove from the time series "series_ts" all the samples
;   corresponding to times during which an event of type "event_type"
;   is recorded in the events-yyyy-mm-dd.txt files. yyyy, mm, dd are
;   extracted from "date". If no "event_type" is provided, all the
;   events are removed.
;                                                                     
; CALLING SEQUENCE: 
;   result = lyra_remove_event(path, date, time_ts, series_ts,$
;            event_type = 'LAR') 
;
; INPUTS:                                                                
;   - path = path to the main directory in which to locally store         
;     the events file. This file will be stored under the name
;     'events-yyyy-mm-dd.txt', where yyyy-mm-dd corresponds to the day
;     provided in 'date'.     
;   - date = date for which to clean the data. It must be a string
;     argument of 'yyyy-mm-dd'              
;   - time_ts: the time vector expressed in seconds.                
;   - series_ts: vector containing the time series to clean up.  
;   - event_type = string telling the type of event to remove from the
;     time series. The accepted values are 'LAR', 'Cover 1 open',
;     'Cover 2 open', 'Cover 3 open', 'UV occ.', 'Vis. occ.',
;     'SAA', 'A Flare', 'B Flare', 'C Flare', 'M Flare', 'X Flare'.
;     The event_type 'all' is also accepted. In this case, all the events 
;     EXCEPT THE ONES CORRESPONDING TO COVERS are filtered out from 
;     the timeseries.    
;     This parameter is optional. If not provided, event_type 'all' is
;     assumed. 
;   - keep_event allows the user to extract the periods corresponding
;     to the selected events rather than to reject them from the 
;     timeseries.      
;
; OUTPUTS:                                                               
;   - A vector corresponding to the cleaned up time series if all goes
;     well. If no data survive the removal of events then 0 is
;     returned. If an error occured, -1 is returned.           
;
; EXAMPLES: 
;   clean_series = lyra_remove_event('/home', '2012-01-01',$
;   lyra.time, lyra.aluminum, event_type = 'UV occ.')          
;
;   unit3_data = lyra_remove_event('/home', '2012-01-01', lyra_bakup.time, $
;   lyra_backup.aluminum, event_type = 'Cover 3 open', /keep_event)
;
; MODIFICATION HISTORY:
;
;   ver 1.0:   First release by M. Dominique (mariedo@oma.be) and  
;              A. Katsiyannis (katsiyannis@oma.be), 01/11/2014     
;   ver 1.1:   New keyword, modification of existing keywords, bug
;              fixes,  M. Dominique and A. Katsiyannis, 09/07/2015
;-  

  catch, err
  if err ne 0 then begin
     catch, /cancel
     print, !ERROR_STATE.MSG
     if event_filenames ne !NULL then $
        file_delete, event_filenames[0], /allow_nonexistent
     return, -1
  endif

  forward_function lyra_download_events

  if ~array_equal(size(path_data), [0, 7, 1]) then $
     message, 'The input argument "path_data" must be a string'

  date_err_msg='The "date" input argument must be in the form of yyyy-mm-dd'
  date_size=size(date)
  if array_equal(date_size, [0, 7, 1]) then begin
     date_field= strsplit(date, '-', /extract)
     if ~array_equal(size(date_field), [1, 3, 7, 3]) then $
        message, date_err_msg
     year= uint(date_field[0])
     month= uint(date_field[1])
     day= uint(date_field[2])
     julian_day = julday(month, day, year, 0, 0, 0)
     if julian_day lt julday(1, 6, 2010, 0, 0, 0) or $
        julian_day gt systime(/julian) then message, $
        'The requested date must be between January 6 2010 and the current day.'
     caldat, julian_day, month, day, year
  endif else message, date_err_msg
     
  series_ts_size=size(series_ts)
  if series_ts_size[0] ne 1 OR series_ts_size[2] ne 5 then $
     message, 'Input argument "series_ts" must be a vector of double '+$
              'precision numbers'

  time_ts_size=size(time_ts)
  if time_ts_size[0] ne 1 OR time_ts_size[2] ne 5 then $
     message, 'Input argument "time_ts" must be a vector of double '+$
              'precision numbers'

  series = series_ts
  time_rep = time_ts

  if ~n_elements(event_type) then event_type = 'all'

  if ~array_equal(size(event_type), [0, 7, 1]) then begin
     message, 'Optional input "event_type" must be a string. Examples of '+$
              'Permitted values are (case insensitive): "all", "LAR", '+$
              '"X flare", "M Flare", "C Flare", "B Flare", "A Flare", '+$
              '"UV occ.", "Vis. occ.", "SAA", "Cover 1 open", "Cover 2 open",'+$
              ' "Cover 3 open"', /info
     return, -1
  endif

  event_type= strlowcase(event_type)

  all_events = ['lar', 'saa', 'uv occ.', 'a flare', 'b flare', 'c flare', $
                'm flare', 'x flare']

  if event_type ne 'all' AND event_type ne 'lar' AND event_type ne 'saa' AND $
     event_type ne 'uv occ.' AND event_type ne 'vis. occ.' AND $
     ~strmatch(event_type, '[abcmx] flare') AND $
     ~strmatch(event_type, 'cover [123] open') $
  then begin

     message, 'Permitted values for event_type are (case insensitive): '+ $
              '"all", "LAR", "X flare", "M Flare", "C Flare", "B Flare", '+$
              '"A Flare", "Vis. occ.", "UV Occ.", "SAA",  "Cover 1 open", '+$
              '"Cover 2 open", "Cover 3 open"', /info
     return, -1

  endif

  event_path = path_data+'/data/events'
  file_mkdir, event_path
  eventfile= event_path+'/events-'+date_field[0]+'-'+date_field[1]+'-'+$
     date_field[2]+'.txt'

  if ~file_test(eventfile) then $
     event_filenames= lyra_download_events(event_path, date, date) $
  else $
     event_filenames= [eventfile]

  if ~array_equal(size(event_filenames), [1, 1, 7, 1]) then $
     message, 'Failed to download one (and only one) event file'

  event = [[0,0]]
  openr, event_id, event_filenames[0], /get_lun
  str = ''

  while ~eof(event_id) do begin
     readf, event_id, str
     event_times = strlowcase(strsplit(str, ',', /extract))

     if ((event_type eq 'all') AND (where(event_times[0] eq all_events) ge 0))$
        OR (event_type eq event_times[0]) then begin

        time1 = strsplit(event_times[1], '-t:z', /extract)
        time2 = strsplit(event_times[3], '-t:z', /extract)
        start = julday(time1[1], time1[2], time1[0], time1[3], time1[4], $
                       time1[5])
        stop = julday(time2[1], time2[2], time2[0], time2[3], time2[4], $
                      time2[5])

; Conversion in seconds of the day
        start = (start - julday(month, day, year, 0, 0, 0)) * 86400.D
        stop = (stop - julday(month, day, year, 0, 0, 0)) * 86400.D

        case event_type of
           'a flare': 
           'b flare': stop += 600.D
           'c flare': stop += 1200.D
           'm flare': stop += 3600.D
           'x flare': stop += 5400.D
           'lar': stop -= 60.
           'vis. occ.': 
           'uv occ.': begin
              start -= 400.D
              stop += 400.D
           end
           else:
        endcase

        event = [[event], [double(start), double(stop)]]

     endif

  endwhile


  if n_elements(event) gt 2 then begin
     event = event[*, 1:*]
     nevent = n_elements(event)/2

     if keyword_set(keep_event) then begin
        index = []
 
        for i = 0, nevent-1 do begin
           index_ext= where(time_rep ge event[0,i] AND time_rep le event[1,i])
           if (size(index_ext))[0] gt 0 then index= [index, index_ext]
        endfor
        if n_elements(index) eq 0 then return, 0
        series = series[index]
        time_rep = time_rep[index]

     endif else begin

        for i = nevent-1, 0, -1 do begin
           index = where(time_rep le event[0,i] OR time_rep ge event[1,i])
           if (size(index))[0] eq 0 then return, 0
           series = series[index]
           time_rep = time_rep[index]
        endfor

     endelse

  endif else begin
     if keyword_set(keep_event) then return, 0
  endelse

  free_lun, event_id

  return, series

end
