Index: src/sas/qtgui/Perspectives/Inversion/InversionPerspective.py
===================================================================
--- src/sas/qtgui/Perspectives/Inversion/InversionPerspective.py	(revision 570a2f737662b7e7ea9e5ff28db695f3f16ba1aa)
+++ src/sas/qtgui/Perspectives/Inversion/InversionPerspective.py	(revision 7f5196e3504984b5661fbf66a471b74d97902eeb)
@@ -350,6 +350,8 @@
         Open the Explorer window to see correlations between params and results
         """
-        # TODO: Look at PR from AW - Is there anything else I need to do?
-        pass
+        # TODO: Link Invertor() and DmaxWindow so window updates when recalculated
+        from dmax import DmaxWindow
+        self.dmaxWindow = DmaxWindow(self._calculator, self.getNFunc(), self)
+        self.dmaxWindow.show()
 
     ######################################################################
@@ -391,4 +393,8 @@
         self.enableButtons()
 
+    def getNFunc(self):
+        """Get the n_func value from the GUI object"""
+        return int(UI.TabbedInversionUI._fromUtf8(self.noOfTermsInput.text()))
+
     def setCurrentData(self, data_ref):
         """Get the current data and display as necessary"""
@@ -429,6 +435,5 @@
             self.calc_thread.stop()
         pr = self._calculator.clone()
-        nfunc = int(UI.TabbedInversionUI._fromUtf8(
-            self.noOfTermsInput.text()))
+        nfunc = self.getNFunc()
         self.calc_thread = CalcPr(pr, nfunc,
                                   error_func=self._threadError,
@@ -452,6 +457,5 @@
         pr.slit_height = 0.0
         pr.slit_width = 0.0
-        nfunc = int(UI.TabbedInversionUI._fromUtf8(
-            self.noOfTermsInput.text()))
+        nfunc = self.getNFunc()
         self.estimation_thread = EstimateNT(pr, nfunc,
                                             error_func=self._threadError,
@@ -474,6 +478,5 @@
             self.estimation_thread.stop()
         pr = self._calculator.clone()
-        nfunc = int(UI.TabbedInversionUI._fromUtf8(
-            self.noOfTermsInput.text()))
+        nfunc = self.getNFunc()
         self.estimation_thread = EstimatePr(pr, nfunc,
                                             error_func=self._threadError,
Index: src/sas/qtgui/Perspectives/Inversion/UI/dmax.ui
===================================================================
--- src/sas/qtgui/Perspectives/Inversion/UI/dmax.ui	(revision 7f5196e3504984b5661fbf66a471b74d97902eeb)
+++ src/sas/qtgui/Perspectives/Inversion/UI/dmax.ui	(revision 7f5196e3504984b5661fbf66a471b74d97902eeb)
@@ -0,0 +1,125 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>DmaxExplorer</class>
+ <widget class="QDialog" name="DmaxExplorer">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>609</width>
+    <height>524</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Dialog</string>
+  </property>
+  <layout class="QGridLayout" name="gridLayout_2">
+   <item row="0" column="0">
+    <layout class="QVBoxLayout" name="verticalLayout">
+     <item>
+      <spacer name="verticalSpacer">
+       <property name="orientation">
+        <enum>Qt::Vertical</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>20</width>
+         <height>40</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+     <item>
+      <layout class="QGridLayout" name="gridLayout">
+       <item row="1" column="2">
+        <widget class="QLabel" name="label_4">
+         <property name="text">
+          <string>Max Distance [â«]</string>
+         </property>
+        </widget>
+       </item>
+       <item row="1" column="3">
+        <widget class="QLineEdit" name="maxDist"/>
+       </item>
+       <item row="0" column="2">
+        <widget class="QLabel" name="label_2">
+         <property name="text">
+          <string>Npts</string>
+         </property>
+        </widget>
+       </item>
+       <item row="0" column="3">
+        <widget class="QLineEdit" name="Npts"/>
+       </item>
+       <item row="0" column="0">
+        <widget class="QLabel" name="label">
+         <property name="text">
+          <string>Dependent Variable:</string>
+         </property>
+        </widget>
+       </item>
+       <item row="1" column="1">
+        <widget class="QLineEdit" name="minDist"/>
+       </item>
+       <item row="0" column="1">
+        <widget class="QComboBox" name="dependentVariable">
+         <item>
+          <property name="text">
+           <string>1-Ï positive fraction</string>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>ÏÂ²/dof</string>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>I(Q=0)</string>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>Rg</string>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>Oscillation parameter</string>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>Background</string>
+          </property>
+         </item>
+         <item>
+          <property name="text">
+           <string>Positive Fraction</string>
+          </property>
+         </item>
+        </widget>
+       </item>
+       <item row="1" column="0">
+        <widget class="QLabel" name="label_3">
+         <property name="text">
+          <string>Min Distance [â«]</string>
+         </property>
+        </widget>
+       </item>
+       <item row="2" column="0" colspan="4">
+        <widget class="QPushButton" name="closeButton">
+         <property name="text">
+          <string>Close</string>
+         </property>
+        </widget>
+       </item>
+      </layout>
+     </item>
+    </layout>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
Index: src/sas/qtgui/Perspectives/Inversion/dmax.py
===================================================================
--- src/sas/qtgui/Perspectives/Inversion/dmax.py	(revision 7f5196e3504984b5661fbf66a471b74d97902eeb)
+++ src/sas/qtgui/Perspectives/Inversion/dmax.py	(revision 7f5196e3504984b5661fbf66a471b74d97902eeb)
@@ -0,0 +1,187 @@
+# -*- coding: utf-8 -*-
+"""
+Dialog panel to explore the P(r) inversion results for a range
+of D_max value. User picks a number of points and a range of
+distances, then can toggle between inversion outputs and see
+their distribution as a function of D_max.
+"""
+
+# global
+import sys
+import os
+import logging
+import numpy as np
+from PyQt4 import QtCore
+from PyQt4 import QtGui
+from PyQt4 import QtWebKit
+
+from twisted.internet import threads
+
+# sas-global
+from sas.qtgui.Plotting.PlotterData import Data1D
+from sas.qtgui.Plotting.Plotter import PlotterWidget
+import sas.qtgui.Utilities.GuiUtils as GuiUtils
+
+# local
+from UI.dmax import Ui_DmaxExplorer
+# from InvariantDetails import DetailsDialog
+# from InvariantUtils import WIDGETS
+
+logger = logging.getLogger(__name__)
+
+def enum(*sequential, **named):
+    enums = dict(zip(sequential, range(len(sequential))), **named)
+    return type('Enum', (), enums)
+
+W = enum( 'NPTS',           #0
+          'DMIN',               #1
+          'DMAX',               #2
+          'VARIABLE',         #3
+)
+
+class DmaxWindow(QtGui.QDialog, Ui_DmaxExplorer):
+    # The controller which is responsible for managing signal slots connections
+    # for the gui and providing an interface to the data model.
+    name = "Dmax Explorer"  # For displaying in the combo box
+
+    def __init__(self, pr_state, nfunc, parent=None):
+        super(DmaxWindow, self).__init__()
+        self.setupUi(self)
+
+        self.setWindowTitle("Dâââ Explorer")
+
+        self.pr_state = pr_state
+        self.nfunc = nfunc
+        self.communicator = GuiUtils.Communicate()
+
+        self.plot = PlotterWidget(self, self)
+        self.hasPlot = None
+        self.verticalLayout.insertWidget(0, self.plot)
+
+        # Let's choose the Standard Item Model.
+        self.model = QtGui.QStandardItemModel(self)
+        self.mapper = None
+
+        # # Connect buttons to slots.
+        # # Needs to be done early so default values propagate properly.
+        self.setupSlots()
+
+        # Set up the model.
+        self.setupModel()
+
+        # # Set up the mapper
+        self.setupMapper()
+
+    def setupSlots(self):
+        self.closeButton.clicked.connect(self.close)
+
+        self.model.itemChanged.connect(self.modelChanged)
+
+    def setupModel(self):
+        self.model.setItem(W.NPTS, QtGui.QStandardItem(str(self.nfunc)))
+        self.model.setItem(W.DMIN,
+                           QtGui.QStandardItem(
+                               str(0.9*self.pr_state.d_max)))
+        self.model.setItem(W.DMAX,
+                           QtGui.QStandardItem(
+                               str(1.1*self.pr_state.d_max)))
+        self.model.setItem(W.VARIABLE,
+                           QtGui.QStandardItem( "ÏÂ²/dof"))
+
+    def setupMapper(self):
+        self.mapper = QtGui.QDataWidgetMapper(self)
+        self.mapper.setOrientation(QtCore.Qt.Vertical)
+        self.mapper.setModel(self.model)
+
+        self.mapper.addMapping(self.Npts, W.NPTS)
+        self.mapper.addMapping(self.minDist, W.DMIN)
+        self.mapper.addMapping(self.maxDist, W.DMAX)
+        self.mapper.addMapping(self.dependentVariable, W.VARIABLE)
+
+        self.mapper.toFirst()
+
+    def modelChanged(self, item):
+        if not self.mapper:
+            return
+
+        iq0 = []
+        rg = []
+        pos = []
+        pos_err = []
+        osc = []
+        bck = []
+        chi2 = []
+
+        xs = np.linspace(float(self.model.item(W.DMIN).text()),
+                         float(self.model.item(W.DMAX).text()),
+                         float(self.model.item(W.NPTS).text()))
+
+        original = self.pr_state.d_max
+        for x in xs:
+            self.pr_state.d_max = x
+            try:
+                out, cov = self.pr_state.invert(self.pr_state.nfunc)
+
+                iq0.append(self.pr_state.iq0(out))
+                rg.append(self.pr_state.rg(out))
+                pos.append(self.pr_state.get_positive(out))
+                pos_err.append(self.pr_state.get_pos_err(out, cov))
+                osc.append(self.pr_state.oscillations(out))
+                bck.append(self.pr_state.background)
+                chi2.append(self.pr_state.chi2)
+            except:
+                # This inversion failed, skip this D_max value
+                msg = "ExploreDialog: inversion failed "
+                msg += "for D_max=%s\n%s" % (str(x), sys.exc_value)
+                print(msg)
+                # logger.error(msg)
+
+        #Return the invertor to its original state
+        self.pr_state.d_max = original
+        self.pr_state.invert(self.nfunc)
+
+        plotter = unicode(self.model.item(W.VARIABLE).text())
+        if plotter == u"ÏÂ²/dof":
+            ys = chi2
+        elif plotter == u"I(Q=0)":
+            ys = iq0
+        elif plotter == u"Rg":
+            ys = rg
+        elif plotter == u"Oscillation parameter":
+            ys = osc
+        elif plotter == u"Background":
+            ys = bck
+        elif plotter == u"Positive Fraction":
+            ys = pos
+        else:
+            ys = pos_err
+
+        data = Data1D(xs, ys)
+        if self.hasPlot:
+            self.plot.removePlot(None)
+        self.hasPlot = True
+        self.plot.plot(data=data, marker="-")
+
+
+if __name__ == "__main__":
+    APP = QtGui.QApplication([])
+    import qt4reactor
+    qt4reactor.install()
+    # DO NOT move the following import to the top!
+    # (unless you know what you're doing)
+    from twisted.internet import reactor
+    from sas.sascalc.pr.invertor import Invertor
+    from sas.sascalc.dataloader.loader import Loader
+
+    data = Loader().load("test/pr_inversion/test/sphere_80.txt")[0]
+    pr_state = Invertor()
+    pr_state.d_max = 130.0
+    pr_state.alpha = 0.0007
+    pr_state.x = data.x
+    pr_state.y = data.y
+    pr_state.err = 0.15*np.sqrt(data.y[0])*np.sqrt(data.y)
+    pr_state.nfunc = 15
+
+    DLG = DmaxWindow(pr_state, 15, reactor)
+    DLG.show()
+    reactor.run()
