code: def filter_nan(s, o):
      
      data = np.array([s.flatten(), o.flatten()])
      data = np.transpose(data)
      data = data[~np.isnan(data).any(1)]
      return data[:, 0], data[:, 1]
docs: this functions removed the data  from simulated and observed data
          whereever the observed data contains nan
  
          this is used by all other functions, otherwise they will produce nan as
          output