Index: calculatorview/src/sans/perspectives/calculator/gen_scatter_panel.py
===================================================================
--- calculatorview/src/sans/perspectives/calculator/gen_scatter_panel.py	(revision 3cfa760829c868841dfd6c4825fbd750fe77ac12)
+++ calculatorview/src/sans/perspectives/calculator/gen_scatter_panel.py	(revision dbc01f27eae0cc56b6db9df1ceb9dbd3d3910a95)
@@ -353,5 +353,5 @@
         x_in = n_qbins * n_pixs / 100000
         # magic equation: not very accurate
-        etime = 0.00001 + 0.085973 * x_in
+        etime = 1.0 + 0.14 * x_in
         return int(etime)
         
@@ -526,11 +526,4 @@
             else:
                 raise
-            for name, _, unit in  self.parameters:
-                if name.GetLabelText() == 'background':
-                    if is_pdbdata:
-                        unit.SetLabel('[A^(2)]')
-                    else:
-                        unit.SetLabel('[1/cm]')
-                    break
             self._set_sld_data_helper(True)
         except:
@@ -575,6 +568,9 @@
         Draw 3D sld profile
         """
+        color_dic = {'H':'blue', 'D':'purple', 'N': 'orange', 
+                     'O':'red', 'C':'green', 'Other':'k'}
         graph_title = self.file_name
         graph_title += "   3D SLD Profile "
+        
         flag = self.parent.check_omfpanel_inputs()
         if not flag:
@@ -595,4 +591,5 @@
         add_icon(self.parent, frame)
         panel = frame.plotpanel
+        
         try:
             # mpl >= 1.0.0
@@ -606,4 +603,5 @@
                 logging.error("PlotPanel could not import Axes3D")
                 raise
+            
         marker = ','
         m_size = 2
@@ -622,4 +620,6 @@
         is_nonzero = sld_tot > 0.0  
         is_zero = sld_tot == 0.0  
+        
+        # Plot null points
         if is_zero.any():
             ax.plot(pos_x[is_zero], pos_z[is_zero], pos_y[is_zero], marker, 
@@ -632,8 +632,20 @@
             sld_my = sld_my[is_nonzero]
             sld_mz = sld_mz[is_nonzero]
-
-        ax.plot(pos_x, pos_z, pos_y, 
-                marker, c="k", 
-                alpha=0.5, markeredgecolor="k", markersize=m_size) 
+        
+        # Plot selective points in color
+        for key in color_dic.keys():
+            chosen_color = output.pix_symbol == key
+            other_color = numpy.ones(len(output.pix_symbol), dtype='bool')
+            if chosen_color.any():
+                other_color = other_color  & (chosen_color != True)
+                color = color_dic[key]
+                ax.plot(pos_x[chosen_color], pos_z[chosen_color], 
+                        pos_y[chosen_color], marker, c=color, alpha=0.5, 
+                        markeredgecolor=color, markersize=m_size, label=key) 
+        # Plot All others        
+        if other_color.any():
+            ax.plot(pos_x[other_color], pos_z[other_color], pos_y[other_color], 
+                    marker, c="k", alpha=0.5, markeredgecolor="k", 
+                    markersize=m_size, label="Other") 
         
         if has_arrow and len(pos_x) > 0:     
@@ -643,6 +655,4 @@
                 draw w/arrow
                 """
-                #frame.SetSize(wx.Size(650, 570))
-                #event.Skip()
                 max_mx = max(numpy.fabs(sld_mx))
                 max_my = max(numpy.fabs(sld_my))
@@ -679,6 +689,5 @@
                                                   mutation_scale=10, lw=1, 
                                                   arrowstyle="->", alpha = 0.5)
-                        ax.add_artist(arrows)
-                        
+                        ax.add_artist(arrows) 
                 except:
                     pass 
@@ -701,4 +710,6 @@
         ax.set_ylabel('z ($\A%s$)'% output.pos_unit)
         ax.set_zlabel('y ($\A%s$)'% output.pos_unit)
+        if output.pix_type == 'atom':
+            ax.legend(loc='upper left', prop={'size':10})
         num_graph = str(self.graph_num)
         frame.SetTitle('Graph %s: %s'% (num_graph, graph_title))        
@@ -743,6 +754,6 @@
             return
         try:
-            vol = self.parent.get_pix_volume()
-            self.model.set_pixel_volume(vol)
+            #vol = self.parent.get_pix_volumes()
+            #self.model.set_pixel_volumes(vol)
             self.model.set_sld_data(self.sld_data)
             self.set_input_params()
@@ -754,5 +765,5 @@
             
             cal_out = CalcGen(input=[self.data.qx_data, 
-                                     self.data.qy_data,i_out], 
+                                     self.data.qy_data, i_out], 
                               completefn=self.complete, 
                               updatefn=self._update)
@@ -1043,14 +1054,11 @@
         return self.sld_data
     
-    def get_pix_volume(self):
+    def get_pix_volumes(self):
         """
         Get the pixel volume
         """
-        val = 1
-        if self.sld_data.pix_type == 'pixel':
-            for lst in self.stepsize:
-                val *= float(lst[1].GetValue())
-        
-        return numpy.fabs(val)
+        vol = self.sld_data.vol_pix
+        
+        return vol
                 
     def _get_other_val(self):  
@@ -1270,4 +1278,5 @@
             ctl = InputTextCtrl(self, -1, size=(_BOX_WIDTH, 20),
                                 style=wx.TE_PROCESS_ENTER)
+            ctl.Bind(wx.EVT_TEXT, self._onstepsize )
             ctl.SetValue(format_number(value, True))
             ctl.Enable(not is_data)
@@ -1387,5 +1396,5 @@
                     ctr_list[1].SetValue(format_number(mean_val, True))
                     ctr_list[1].Enable(enable)
-                    ctr_list[2].SetLabel("[" + sld_data.sld_unit + "]")
+                    #ctr_list[2].SetLabel("[" + sld_data.sld_unit + "]")
                     break   
 
@@ -1483,4 +1492,31 @@
         return flag
     
+    def _onstepsize(self, event):
+        """
+        On stepsize event
+        """
+        flag = True
+        if event != None:
+            event.Skip()
+            ctl = event.GetEventObject()
+            ctl.SetBackgroundColour("white")
+
+        if flag and not self.sld_data.is_data:#ctl.IsEnabled():
+            s_size = 1.0
+            try:
+                for item in self.stepsize:
+                    s_val = float(item[1].GetValue())
+                    if s_val <= 0:
+                        item[1].SetBackgroundColour("pink")
+                        ctl.Refresh()
+                        return
+                    if numpy.isfinite(s_val):
+                        s_size *= s_val
+                self.sld_data.set_pixel_volumes(s_size)
+            except:
+                pass
+        ctl.Refresh()
+  
+         
     def set_npts_from_slddata(self):
         """
@@ -1759,9 +1795,9 @@
         return n_pix
     
-    def get_pix_volume(self):
+    def get_pix_volumes(self):
         """
         Get a pixel volume
         """
-        vol = self.omfpanel.get_pix_volume()
+        vol = self.omfpanel.get_pix_volumes()
         return vol
     
Index: calculatorview/src/sans/perspectives/calculator/load_thread.py
===================================================================
--- calculatorview/src/sans/perspectives/calculator/load_thread.py	(revision dbc5dc9b21e953e43e7d6a054b2231a04fd6ae84)
+++ calculatorview/src/sans/perspectives/calculator/load_thread.py	(revision dbc01f27eae0cc56b6db9df1ceb9dbd3d3910a95)
@@ -3,5 +3,4 @@
 """
 import time
-import wx
 from data_util.calcthread import CalcThread
 from sans.dataloader.loader import Loader
Index: calculatorview/src/sans/perspectives/calculator/media/gen_sans_help.html
===================================================================
--- calculatorview/src/sans/perspectives/calculator/media/gen_sans_help.html	(revision 54d6c3e11b32b554f9de763e0a3772f24ae8645f)
+++ calculatorview/src/sans/perspectives/calculator/media/gen_sans_help.html	(revision dbc01f27eae0cc56b6db9df1ceb9dbd3d3910a95)
@@ -115,10 +115,8 @@
 For example, both values are 0.5 for unpolarized neutrons.
 <br>
-*Note II: The unit of intensity calculated from .sld, .omf, or .txt files is 1/cm, otherwise
-it is &#197;<sup>2</sup>. (In the first equation above, the V is set to 1.)
-<br>
-*Note III: This computation is totally based on the pixel (or atomic) data fixed
+*Note II: This computation is totally based on the pixel (or atomic) data fixed
 in the xyz coordinates. Thus no angular orientational averaging is considered.
 <br>
-*Note IV: For the nuclear scattering length density, only the real component is taken account.
+*Note III: For the nuclear scattering length density, only the real component is taken account.
+<br>
 </body>
