Index: src/sas/sascalc/dataloader/file_reader_base_class.py
===================================================================
--- src/sas/sascalc/dataloader/file_reader_base_class.py	(revision deaa0c6b324db1003ba4999149364cd82185294e)
+++ src/sas/sascalc/dataloader/file_reader_base_class.py	(revision b8080e1affadb04559f0597dfddc5506d2044e9d)
@@ -7,5 +7,5 @@
 import os
 import sys
-import re
+import math
 import logging
 from abc import abstractmethod
@@ -26,11 +26,16 @@
         return s.decode() if isinstance(s, bytes) else s
 
+# Data 1D fields for iterative purposes
+FIELDS_1D = ('x', 'y', 'dx', 'dy', 'dxl', 'dxw')
+# Data 2D fields for iterative purposes
+FIELDS_2D = ('data', 'qx_data', 'qy_data', 'q_data', 'err_data',
+                 'dqx_data', 'dqy_data', 'mask')
+DEPRECATION_MESSAGE = ("\rThe extension of this file suggests the data set migh"
+                       "t not be fully reduced. Support for the reader associat"
+                       "ed with this file type has been removed. An attempt to "
+                       "load the file was made, but, should it be successful, "
+                       "SasView cannot guarantee the accuracy of the data.")
+
 class FileReader(object):
-    # List of Data1D and Data2D objects to be sent back to data_loader
-    output = []
-    # Current plottable_(1D/2D) object being loaded in
-    current_dataset = None
-    # Current DataInfo object being loaded in
-    current_datainfo = None
     # String to describe the type of data this reader can load
     type_name = "ASCII"
@@ -39,13 +44,25 @@
     # List of allowed extensions
     ext = ['.txt']
+    # Deprecated extensions
+    deprecated_extensions = ['.asc', '.nxs']
     # Bypass extension check and try to load anyway
     allow_all = False
     # Able to import the unit converter
     has_converter = True
-    # Open file handle
-    f_open = None
     # Default value of zero
     _ZERO = 1e-16
 
+    def __init__(self):
+        # List of Data1D and Data2D objects to be sent back to data_loader
+        self.output = []
+        # Current plottable_(1D/2D) object being loaded in
+        self.current_dataset = None
+        # Current DataInfo object being loaded in
+        self.current_datainfo = None
+        # File path sent to reader
+        self.filepath = None
+        # Open file handle
+        self.f_open = None
+
     def read(self, filepath):
         """
@@ -54,4 +71,5 @@
         :param filepath: The full or relative path to a file to be loaded
         """
+        self.filepath = filepath
         if os.path.isfile(filepath):
             basename, extension = os.path.splitext(os.path.basename(filepath))
@@ -75,4 +93,7 @@
                     if not self.f_open.closed:
                         self.f_open.close()
+                    if any(filepath.lower().endswith(ext) for ext in
+                           self.deprecated_extensions):
+                        self.handle_error_message(DEPRECATION_MESSAGE)
                     if len(self.output) > 0:
                         # Sort the data that's been loaded
@@ -85,5 +106,18 @@
 
         # Return a list of parsed entries that data_loader can manage
-        return self.output
+        final_data = self.output
+        self.reset_state()
+        return final_data
+
+    def reset_state(self):
+        """
+        Resets the class state to a base case when loading a new data file so previous
+        data files do not appear a second time
+        """
+        self.current_datainfo = None
+        self.current_dataset = None
+        self.filepath = None
+        self.ind = None
+        self.output = []
 
     def nextline(self):
@@ -112,5 +146,5 @@
         """
         Generic error handler to add an error to the current datainfo to
-        propogate the error up the error chain.
+        propagate the error up the error chain.
         :param msg: Error message
         """
@@ -121,4 +155,5 @@
         else:
             logger.warning(msg)
+            raise NoKnownLoaderException(msg)
 
     def send_to_output(self):
@@ -142,24 +177,25 @@
                 # Sort data by increasing x and remove 1st point
                 ind = np.lexsort((data.y, data.x))
-                data.x = np.asarray([data.x[i] for i in ind]).astype(np.float64)
-                data.y = np.asarray([data.y[i] for i in ind]).astype(np.float64)
+                data.x = self._reorder_1d_array(data.x, ind)
+                data.y = self._reorder_1d_array(data.y, ind)
                 if data.dx is not None:
                     if len(data.dx) == 0:
                         data.dx = None
                         continue
-                    data.dx = np.asarray([data.dx[i] for i in ind]).astype(np.float64)
+                    data.dx = self._reorder_1d_array(data.dx, ind)
                 if data.dxl is not None:
-                    data.dxl = np.asarray([data.dxl[i] for i in ind]).astype(np.float64)
+                    data.dxl = self._reorder_1d_array(data.dxl, ind)
                 if data.dxw is not None:
-                    data.dxw = np.asarray([data.dxw[i] for i in ind]).astype(np.float64)
+                    data.dxw = self._reorder_1d_array(data.dxw, ind)
                 if data.dy is not None:
                     if len(data.dy) == 0:
                         data.dy = None
                         continue
-                    data.dy = np.asarray([data.dy[i] for i in ind]).astype(np.float64)
+                    data.dy = self._reorder_1d_array(data.dy, ind)
                 if data.lam is not None:
-                    data.lam = np.asarray([data.lam[i] for i in ind]).astype(np.float64)
+                    data.lam = self._reorder_1d_array(data.lam, ind)
                 if data.dlam is not None:
-                    data.dlam = np.asarray([data.dlam[i] for i in ind]).astype(np.float64)
+                    data.dlam = self._reorder_1d_array(data.dlam, ind)
+                data = self._remove_nans_in_data(data)
                 if len(data.x) > 0:
                     data.xmin = np.min(data.x)
@@ -167,4 +203,42 @@
                     data.ymin = np.min(data.y)
                     data.ymax = np.max(data.y)
+
+    @staticmethod
+    def _reorder_1d_array(array, ind):
+        """
+        Reorders a 1D array based on the indices passed as ind
+        :param array: Array to be reordered
+        :param ind: Indices used to reorder array
+        :return: reordered array
+        """
+        array = np.asarray(array, dtype=np.float64)
+        return array[ind]
+
+    @staticmethod
+    def _remove_nans_in_data(data):
+        """
+        Remove data points where nan is loaded
+        :param data: 1D or 2D data object
+        :return: data with nan points removed
+        """
+        if isinstance(data, Data1D):
+            fields = FIELDS_1D
+        elif isinstance(data, Data2D):
+            fields = FIELDS_2D
+        else:
+            return data
+        # Make array of good points - all others will be removed
+        good = np.isfinite(getattr(data, fields[0]))
+        for name in fields[1:]:
+            array = getattr(data, name)
+            if array is not None:
+                # Update good points only if not already changed
+                good &= np.isfinite(array)
+        if not np.all(good):
+            for name in fields:
+                array = getattr(data, name)
+                if array is not None:
+                    setattr(data, name, array[good])
+        return data
 
     def sort_two_d_data(self):
@@ -197,4 +271,5 @@
                     dataset.x_bins = dataset.qx_data[:int(n_cols)]
                 dataset.data = dataset.data.flatten()
+                dataset = self._remove_nans_in_data(dataset)
                 if len(dataset.data) > 0:
                     dataset.xmin = np.min(dataset.qx_data)
@@ -314,5 +389,5 @@
     def splitline(line):
         """
-        Splits a line into pieces based on common delimeters
+        Splits a line into pieces based on common delimiters
         :param line: A single line of text
         :return: list of values
