コード例 #1
0
ファイル: FPCalibrate.py プロジェクト: r-owen/TUI
    def __init__(self, sr):
        """Create widgets.
        """
        # if True, run in debug-only mode (which doesn't DO anything, it just pretends)
        sr.debug = False

        self.file = None

        self.nicfpsModel = TUI.Inst.NICFPS.NICFPSModel.getModel()
        self.expModel = TUI.Inst.ExposeModel.getModel(InstName)
        self.tccModel = TUI.TCC.TCCModel.getModel()

        row = 0

        # standard exposure status widget
        expStatusWdg = ExposeStatusWdg(master=sr.master, instName=InstName, helpURL=HelpURL)
        expStatusWdg.grid(row=row, column=0, sticky="news")
        row += 1

        # standard exposure input widget
        self.expWdg = ExposeInputWdg(master=sr.master, instName=InstName, expTypes="object", helpURL=HelpURL)
        self.expWdg.numExpWdg.helpText = "# of exposures at each spacing"
        self.expWdg.grid(row=row, column=0, sticky="news")
        row += 1

        gr = self.expWdg.gridder

        # add file widget
        self.fileWdg = RO.Wdg.FileWdg(master=self.expWdg, helpText="file of x y z etalon positions", helpURL=HelpURL)
        gr.gridWdg("Data File", self.fileWdg, colSpan=3)

        if sr.debug:
            self.expWdg.timeWdg.set(3)
            self.expWdg.fileNameWdg.set("debugtest")
コード例 #2
0
ファイル: 4 NiceDISCals.py プロジェクト: migueldvb/TUI
 def __init__(self, sr):
     """Display the exposure status panel.
     """
     # if True, run in debug-only mode (which doesn't DO anything, it just pretends)
     sr.debug = False
     
     expStatusWdg = ExposeStatusWdg(
         master = sr.master,
         instName = "DIS",
     )
     expStatusWdg.grid(row=0, column=0)
     
     # get the exposure model
     self.expModel = TUI.Inst.ExposeModel.getModel("DIS")
コード例 #3
0
    def __init__(self, sr):
        """Display the exposure status panel.
        """
        # if True, run in debug-only mode (which doesn't DO anything, it just pretends)
        sr.debug = False

        expStatusWdg = ExposeStatusWdg(
            master=sr.master,
            instName="DIS",
        )
        expStatusWdg.grid(row=0, column=0)

        # get the exposure model
        self.expModel = TUI.Inst.ExposeModel.getModel("DIS")
コード例 #4
0
ファイル: FPCalibrate.py プロジェクト: nickalaskreynolds/TUI
    def __init__(self, sr):
        """Create widgets.
        """
        # if True, run in debug-only mode (which doesn't DO anything, it just pretends)
        sr.debug = False

        self.file = None

        self.nicfpsModel = TUI.Inst.NICFPS.NICFPSModel.getModel()
        self.expModel = TUI.Inst.ExposeModel.getModel(InstName)
        self.tccModel = TUI.TCC.TCCModel.getModel()

        row = 0

        # standard exposure status widget
        expStatusWdg = ExposeStatusWdg(
            master=sr.master,
            instName=InstName,
            helpURL=HelpURL,
        )
        expStatusWdg.grid(row=row, column=0, sticky="news")
        row += 1

        # standard exposure input widget
        self.expWdg = ExposeInputWdg(
            master=sr.master,
            instName=InstName,
            expTypes="object",
            helpURL=HelpURL,
        )
        self.expWdg.numExpWdg.helpText = "# of exposures at each spacing"
        self.expWdg.grid(row=row, column=0, sticky="news")
        row += 1

        gr = self.expWdg.gridder

        # add file widget
        self.fileWdg = RO.Wdg.FileWdg(
            master=self.expWdg,
            helpText="file of x y z etalon positions",
            helpURL=HelpURL,
        )
        gr.gridWdg("Data File", self.fileWdg, colSpan=3)

        if sr.debug:
            self.expWdg.timeWdg.set(3)
            self.expWdg.fileNameWdg.set("debugtest")
コード例 #5
0
    def __init__(self, sr):
        """Display exposure status and a few user input widgets.
        """
        # if True, run in debug-only mode (which doesn't DO anything, it just pretends)
        sr.debug = False
        self.expModel = ExposeModel.getModel(InstName)
        self.spicamModel = TUI.Inst.SPIcam.SPIcamModel.getModel()
        self.tccModel = TUI.TCC.TCCModel.getModel()
        self.sr = sr

        row = 0

        expStatusWdg = ExposeStatusWdg(
            master=sr.master,
            instName=InstName,
            helpURL=HelpURL,
        )
        expStatusWdg.grid(row=row, column=0, columnspan=3, sticky="w")
        row += 1

        self.expWdg = ExposeInputWdg(
            master=sr.master,
            instName=InstName,
            expTypes="object",
            helpURL=HelpURL,
        )
        self.expWdg.grid(row=row, column=0, columnspan=3, sticky="w")
        row += 1

        wdgFrame = Tkinter.Frame(sr.master)
        gr = RO.Wdg.Gridder(wdgFrame, sticky="w")
        self.filterWdg = RO.Wdg.OptionMenu(
            master=self.expWdg,
            items=[],
            helpText="filter",
            helpURL=HelpURL,
            defMenu="Current",
            autoIsCurrent=True,
        )
        self.expWdg.gridder.gridWdg("Filter",
                                    self.filterWdg,
                                    sticky="w",
                                    colSpan=3)

        self.spicamModel.filterNames.addCallback(self.filterWdg.setItems)
        self.spicamModel.filterName.addIndexedCallback(
            self.filterWdg.setDefault, 0)
コード例 #6
0
ファイル: 5 DISDarks v2.py プロジェクト: migueldvb/TUI
    def __init__(self, sr):
        """Display exposure status and a few user input widgets.
        """
        # if True, run in debug-only mode (which doesn't DO anything, it just pretends)
        sr.debug = False

        expStatusWdg = ExposeStatusWdg(
            master = sr.master,
            instName = "DIS",
        )
        expStatusWdg.grid(row=0, column=0, sticky="w")
        
        wdgFrame = Tkinter.Frame(sr.master)
     
        gr = RO.Wdg.Gridder(wdgFrame)
        
        self.expModel = ExposeModel.getModel("DIS")
    
        timeUnitsVar = Tkinter.StringVar()
        self.timeWdg = RO.Wdg.DMSEntry (
            master = wdgFrame,
            minValue = self.expModel.instInfo.minExpTime,
            maxValue = self.expModel.instInfo.maxExpTime,
            isRelative = True,
            isHours = True,
            unitsVar = timeUnitsVar,
            width = 10,
            helpText = "Exposure time",
        )
        gr.gridWdg("Time", self.timeWdg, timeUnitsVar)
        
        self.numExpWdg = RO.Wdg.IntEntry(
            master = wdgFrame,
            defValue = 1,
            minValue = 1,
            maxValue = 999,
            helpText = "Number of exposures in the sequence",
        )
        gr.gridWdg("#Exp", self.numExpWdg)
        
        wdgFrame.grid(row=1, column=0, sticky="w")
コード例 #7
0
ファイル: Sky Flats.py プロジェクト: r-owen/TUI
    def __init__(self, sr):
        """Display exposure status and a few user input widgets.
        """
        # if True, run in debug-only mode (which doesn't DO anything, it just pretends)
        sr.debug = False
        self.expModel = ExposeModel.getModel(InstName)
        self.spicamModel = TUI.Inst.SPIcam.SPIcamModel.getModel()
        self.tccModel = TUI.TCC.TCCModel.getModel()
        self.sr = sr

        row = 0

        expStatusWdg = ExposeStatusWdg(
            master = sr.master,
            instName = InstName,
            helpURL = HelpURL,
        )
        expStatusWdg.grid(row=row, column=0, columnspan=3, sticky="w")
        row += 1

        self.expWdg = ExposeInputWdg(
            master = sr.master,
            instName = InstName,
            expTypes = "object",
            helpURL = HelpURL,
        )
        self.expWdg.grid(row=row, column=0, columnspan=3, sticky="w")
        row += 1

        self.filterWdg = RO.Wdg.OptionMenu(
            master = self.expWdg,
            items = [],
            helpText = "filter",
            helpURL = HelpURL,
            defMenu = "Current",
            autoIsCurrent = True,
        )
        self.expWdg.gridder.gridWdg("Filter", self.filterWdg, sticky="w", colSpan=3)

        self.spicamModel.filterNames.addCallback(self.filterWdg.setItems)
        self.spicamModel.filterName.addIndexedCallback(self.filterWdg.setDefault, 0)
コード例 #8
0
    def __init__(self, sr):
        """Display exposure status and a few user input widgets.
        """
        # if True, run in debug-only mode (which doesn't DO anything, it just pretends)
        sr.debug = False

        expStatusWdg = ExposeStatusWdg(
            master=sr.master,
            instName="DIS",
        )
        expStatusWdg.grid(row=0, column=0, sticky="w")

        wdgFrame = Tkinter.Frame(sr.master)

        gr = RO.Wdg.Gridder(wdgFrame)

        self.expModel = ExposeModel.getModel("DIS")

        timeUnitsVar = Tkinter.StringVar()
        self.timeWdg = RO.Wdg.DMSEntry(
            master=wdgFrame,
            minValue=self.expModel.instInfo.minExpTime,
            maxValue=self.expModel.instInfo.maxExpTime,
            isRelative=True,
            isHours=True,
            unitsVar=timeUnitsVar,
            width=10,
            helpText="Exposure time",
        )
        gr.gridWdg("Time", self.timeWdg, timeUnitsVar)

        self.numExpWdg = RO.Wdg.IntEntry(
            master=wdgFrame,
            defValue=1,
            minValue=1,
            maxValue=999,
            helpText="Number of exposures in the sequence",
        )
        gr.gridWdg("#Exp", self.numExpWdg)

        wdgFrame.grid(row=1, column=0, sticky="w")
コード例 #9
0
    def __init__(self, sr):
        """Create widgets.
        """
        # if True, run in debug-only mode (which doesn't DO anything, it just pretends)
        sr.debug = False

        self.errStr = ""

        self.nicfpsModel = TUI.Inst.NICFPS.NICFPSModel.getModel()
        self.expModel = TUI.Inst.ExposeModel.getModel(InstName)
        self.tccModel = TUI.TCC.TCCModel.getModel()

        row = 0

        # standard exposure status widget
        expStatusWdg = ExposeStatusWdg(
            master=sr.master,
            instName=InstName,
            helpURL=HelpURL,
        )
        expStatusWdg.grid(row=row, column=0, sticky="news")
        row += 1

        # standard exposure input widget
        self.expWdg = ExposeInputWdg(
            master=sr.master,
            instName=InstName,
            expTypes="object",
            helpURL=HelpURL,
        )
        self.expWdg.numExpWdg.helpText = "# of exposures at each spacing"
        self.expWdg.grid(row=row, column=0, sticky="news")
        row += 1

        gr = self.expWdg.gridder

        # add etalon controls to exposure input widget
        self.begSeqIndWdg = RO.Wdg.IntEntry(
            master=self.expWdg,
            minValue=0,
            width=SpacingWidth,
            helpText="initial z index (to finish a partial run)",
            helpURL=HelpURL,
        )
        gr.gridWdg("Initial Index", self.begSeqIndWdg,
                   "(normally leave blank)")

        self.fpBegZWdg = RO.Wdg.IntEntry(
            master=self.expWdg,
            minValue=self.nicfpsModel.fpXYZLimConst[0],
            maxValue=self.nicfpsModel.fpXYZLimConst[1],
            width=SpacingWidth,
            helpText="initial etalon Z spacing",
            helpURL=HelpURL,
        )
        gr.gridWdg("Initial Z", self.fpBegZWdg, "steps")

        self.fpDeltaZWdg = RO.Wdg.IntEntry(
            master=self.expWdg,
            minValue=self.nicfpsModel.fpXYZLimConst[0],
            maxValue=self.nicfpsModel.fpXYZLimConst[1],
            width=SpacingWidth,
            helpText="etalon Z spacing interval",
            helpURL=HelpURL,
        )
        gr.gridWdg("Delta Z", self.fpDeltaZWdg, "steps")

        self.fpNumZWdg = RO.Wdg.IntEntry(
            master=self.expWdg,
            minValue=1,
            maxValue=9999,
            width=SpacingWidth,
            helpText="number of etalon Z spacings",
            helpURL=HelpURL,
        )
        gr.gridWdg("Num Zs", self.fpNumZWdg, "steps")

        self.fpEndZWdg = RO.Wdg.IntLabel(
            master=self.expWdg,
            width=SpacingWidth,
            helpText="final etalon Z spacing",
            helpURL=HelpURL,
            anchor="e",
        )
        self.fpEndZUnitsWdg = RO.Wdg.StrLabel(
            master=self.expWdg,
            text="steps",
            helpURL=HelpURL,
            anchor="w",
        )
        gr.gridWdg("Final Z", self.fpEndZWdg, self.fpEndZUnitsWdg)

        self.fpNumPassesWdg = RO.Wdg.OptionMenu(
            master=self.expWdg,
            items=("1", "2", "3"),
            defValue="2",
            helpText="number of passes in which to sample Z",
            helpURL=HelpURL,
        )
        gr.gridWdg("Num Passes", self.fpNumPassesWdg)

        self.currSeqIndWdg = RO.Wdg.IntLabel(
            master=self.expWdg,
            width=SpacingWidth,
            helpText="index of current Z spacing",
            helpURL=HelpURL,
            anchor="e",
        )
        gr.gridWdg("Current Index", self.currSeqIndWdg)

        fpCurrWdg = RO.Wdg.IntLabel(
            master=self.expWdg,
            width=SpacingWidth,
            helpText="current actual etalon Z spacing",
            helpURL=HelpURL,
            anchor="e",
        )
        gr.gridWdg("Current Z", fpCurrWdg, "steps")

        self.nicfpsModel.fpZ.addROWdg(fpCurrWdg)

        self.fpBegZWdg.addCallback(self.updEndZ, callNow=False)
        self.fpDeltaZWdg.addCallback(self.updEndZ, callNow=False)
        self.fpNumZWdg.addCallback(self.updEndZ, callNow=True)
コード例 #10
0
ファイル: Extended Source.py プロジェクト: migueldvb/TUI
    def __init__(self, sr):
        """The setup script; run once when the script runner
        window is created.
        """
        # if sr.debug True, run in debug-only mode (which doesn't DO anything, it just pretends)
        sr.debug = False
        self.sr = sr

        self.begOffset = numpy.array((numpy.nan, numpy.nan))
        self.currOffset = self.begOffset[:]
        
        self.tccModel = TUI.TCC.TCCModel.getModel()
        self.expModel = TUI.Inst.ExposeModel.getModel(InstName)
    
        row=0
        
        # standard exposure status widget
        expStatusWdg = ExposeStatusWdg(sr.master, InstName)
        expStatusWdg.grid(row=row, column=0, sticky="news")
        row += 1
        
        # create dither node controls
        ditherFrame = Tkinter.Frame(sr.master)
        
        # information about the dither nodes; each entry is:
        # - name of quadrant
        # - boresight offset multiplier in image x, image y
        ditherNodeData = [
            ("Ctr", (0, 0)),
            ("UL", (-1, 1)),
            ("UR", (1, 1)),
            ("LR", (1, -1)),
            ("LL", (-1, -1)),
        ]
        self.ditherWdgSet = [] # (stateWdg, orderWdg, boolWdg), one per dither node
        for name, offMult in ditherNodeData:
            nodeFrame = Tkinter.Frame(ditherFrame)

            stateWdg = RO.Wdg.StrLabel(
                master = nodeFrame,
                width = 7,
                relief = "flat",
                helpText = "State of node in dither sequence",
                helpURL = HelpURL,
            )
            orderWdg = RO.Wdg.IntLabel(
                master = nodeFrame,
                width = 1,
                relief = "flat",
                helpText = "Order of node in dither sequence",
                helpURL = HelpURL,
            )
            boolWdg = RO.Wdg.Checkbutton(
                master = nodeFrame,
                text = name,
                callFunc = self.updOrder,
                defValue = True,
                relief = "flat",
                helpText = "Check to use this dither node",
                helpURL = HelpURL,
            )
            # add attribute "offMult" to widget
            # so it can be read by "run"
            boolWdg.offMult = numpy.array(offMult, dtype=float)
            
            self.ditherWdgSet.append((stateWdg, orderWdg, boolWdg))

            stateWdg.pack(side="left")
            orderWdg.pack(side="left")
            boolWdg.pack(side="left")
            
            # display quadrant checkbutton in appropriate location
            row = 1 - offMult[1]
            col = 1 + offMult[0]
            nodeFrame.grid(row=row, column=col)
            
        
        ditherFrame.grid(row=row, column=0, sticky="news")
        row += 1
        # standard exposure input widget
        self.expWdg = ExposeInputWdg(sr.master, InstName, expTypes="object")
        self.expWdg.numExpWdg.helpText = "# of pairs of exposures at each node"
        self.expWdg.grid(row=row, column=0, sticky="news")
        row += 1

        # add controls to exposure input widget frame
        self.boxSizeWdg = RO.Wdg.IntEntry(
            master = self.expWdg,
            minValue = 0,
            defValue = DefBoxSize,
            helpText = "size of dither box",
            helpURL = HelpURL,
        )
        self.expWdg.gridder.gridWdg("Box Size", self.boxSizeWdg, "arcsec")

        self.doRandomWdg = RO.Wdg.Checkbutton(
            master = self.expWdg,
            defValue = DefDoRandom,
            helpText = "Add random scatter to dither pattern?",
            helpURL = HelpURL,
        )
        self.expWdg.gridder.gridWdg("Randomize?", self.doRandomWdg)

        self.skyOffsetWdgSet = []
        for ii in range(2):
            axisStr = ("RA", "Dec")[ii]
            unitsVar = Tkinter.StringVar()
            offsetWdg = RO.Wdg.DMSEntry(
                master = self.expWdg,
                minValue = -MaxOffset,
                maxValue = MaxOffset,
                defValue = DefOffset,
                isHours = False,
                isRelative = True,
                helpText = "Offset to sky in %s (typically)" % (axisStr,),
                helpURL = HelpURL,
                unitsVar = unitsVar,
            )
            self.skyOffsetWdgSet.append(offsetWdg)
            self.expWdg.gridder.gridWdg(
                "Sky Offset %s" % (ii + 1,),
                offsetWdg,
                units = unitsVar,
            )

        
        self.expWdg.gridder.allGridded()
        
        if sr.debug:
            # set useful debug defaults
            self.expWdg.timeWdg.set("1.0")
            self.expWdg.numExpWdg.set(2)
            self.expWdg.fileNameWdg.set("debug")
            self.ditherWdgSet[1][-1].setBool(False)
            self.ditherWdgSet[3][-1].setBool(False)
        
        self.updOrder()
コード例 #11
0
    def __init__(self, sr):
        """The setup script; run once when the script runner
        window is created.
        """
        # if sr.debug True, run in debug-only mode (which doesn't DO anything, it just pretends)
        sr.debug = False
        self.sr = sr

        self.begOffset = numpy.array((numpy.nan, numpy.nan))
        self.currOffset = self.begOffset[:]

        self.tccModel = TUI.TCC.TCCModel.getModel()
        self.expModel = TUI.Inst.ExposeModel.getModel(InstName)
    
        row=0
        
        # standard exposure status widget
        expStatusWdg = ExposeStatusWdg(
            master = sr.master,
            instName = InstName,
            helpURL = HelpURL,
        )
        expStatusWdg.grid(row=row, column=0, sticky="news")
        row += 1
        
        # create dither node controls
        ditherFrame = Tkinter.Frame(sr.master)
        
        # information about the dither nodes; each entry is:
        # - name of quadrant
        # - boresight offset multiplier in image x, image y
        ditherNodeData = [
            ("Ctr", (0, 0)),
            ("UL", (-1, 1)),
            ("UR", (1, 1)),
            ("LR", (1, -1)),
            ("LL", (-1, -1)),
        ]
        self.ditherWdgSet = [] # (stateWdg, orderWdg, boolWdg), one per dither node
        for name, offMult in ditherNodeData:
            nodeFrame = Tkinter.Frame(ditherFrame)

            stateWdg = RO.Wdg.StrLabel(
                master = nodeFrame,
                width = 7,
                relief = "flat",
                helpText = "State of node in dither sequence",
                helpURL = HelpURL,
            )
            orderWdg = RO.Wdg.IntLabel(
                master = nodeFrame,
                width = 1,
                relief = "flat",
                helpText = "Order of node in dither sequence",
                helpURL = HelpURL,
            )
            boolWdg = RO.Wdg.Checkbutton(
                master = nodeFrame,
                text = name,
                callFunc = self.updOrder,
                defValue = True,
                relief = "flat",
                helpText = "Check to use this dither node",
                helpURL = HelpURL,
            )
            # add attribute "offMult" to widget
            # so it can be read by "run"
            boolWdg.offMult = numpy.array(offMult, dtype=float)
            
            self.ditherWdgSet.append((stateWdg, orderWdg, boolWdg))

            stateWdg.pack(side="left")
            orderWdg.pack(side="left")
            boolWdg.pack(side="left")
            
            # display quadrant checkbutton in appropriate location
            row = 1 - offMult[1]
            col = 1 + offMult[0]
            nodeFrame.grid(row=row, column=col)
            
        
        ditherFrame.grid(row=row, column=0, sticky="news")
        row += 1
    
        # standard exposure input widget
        self.expWdg = ExposeInputWdg(
            master = sr.master,
            instName = InstName,
            expTypes = "object",
            helpURL = HelpURL,
        )
        self.expWdg.numExpWdg.helpText = "# of exposures at each point"
        self.expWdg.grid(row=row, column=0, sticky="news")
        row += 1
    
        # add controls to exposure input widget frame
        self.boxSizeWdg = RO.Wdg.IntEntry(
            master = self.expWdg,
            minValue = 0,
            defValue = DefBoxSize,
            helpText = "size of dither box",
            helpURL = HelpURL,
        )
        self.expWdg.gridder.gridWdg("Box Size", self.boxSizeWdg, "arcsec")
        
        self.doRandomWdg = RO.Wdg.Checkbutton(
            master = self.expWdg,
            defValue = DefDoRandom,
            helpText = "Add random scatter to dither pattern?",
            helpURL = HelpURL,
        )
        self.expWdg.gridder.gridWdg("Randomize?", self.doRandomWdg)
        
        if sr.debug:
            # set useful debug defaults
            self.expWdg.timeWdg.set("1.0")
            self.expWdg.numExpWdg.set(2)
            self.expWdg.fileNameWdg.set("debug")
            self.ditherWdgSet[1][-1].setBool(False)
            self.ditherWdgSet[3][-1].setBool(False)

        self.updOrder()
コード例 #12
0
ファイル: DataCube.py プロジェクト: r-owen/TUI
    def __init__(self, sr):
        """Create widgets.
        """
        # if True, run in debug-only mode (which doesn't DO anything, it just pretends)
        sr.debug = False

        self.errStr = ""
        
        self.nicfpsModel = TUI.Inst.NICFPS.NICFPSModel.getModel()
        self.expModel = TUI.Inst.ExposeModel.getModel(InstName)
        self.tccModel = TUI.TCC.TCCModel.getModel()

        row=0
        
        # standard exposure status widget
        expStatusWdg = ExposeStatusWdg(
            master = sr.master,
            instName = InstName,
            helpURL = HelpURL,
        )
        expStatusWdg.grid(row=row, column=0, sticky="news")
        row += 1
    
        # standard exposure input widget
        self.expWdg = ExposeInputWdg(
            master = sr.master,
            instName = InstName,
            expTypes = "object",
            helpURL = HelpURL,
        )
        self.expWdg.numExpWdg.helpText = "# of exposures at each spacing"
        self.expWdg.grid(row=row, column=0, sticky="news")
        row += 1
        
        gr = self.expWdg.gridder
            
        # add etalon controls to exposure input widget
        self.begSeqIndWdg = RO.Wdg.IntEntry(
            master = self.expWdg,
            minValue = 0,
            width = SpacingWidth,
            helpText = "initial z index (to finish a partial run)",
            helpURL = HelpURL,
        )
        gr.gridWdg("Initial Index", self.begSeqIndWdg, "(normally leave blank)")
    
        self.fpBegZWdg = RO.Wdg.IntEntry(
            master = self.expWdg,
            minValue = self.nicfpsModel.fpXYZLimConst[0],
            maxValue = self.nicfpsModel.fpXYZLimConst[1],
            width = SpacingWidth,
            helpText = "initial etalon Z spacing",
            helpURL = HelpURL,
        )
        gr.gridWdg("Initial Z", self.fpBegZWdg, "steps")
    
        self.fpDeltaZWdg = RO.Wdg.IntEntry(
            master = self.expWdg,
            minValue = self.nicfpsModel.fpXYZLimConst[0],
            maxValue = self.nicfpsModel.fpXYZLimConst[1],
            width = SpacingWidth,
            helpText = "etalon Z spacing interval",
            helpURL = HelpURL,
        )
        gr.gridWdg("Delta Z", self.fpDeltaZWdg, "steps")
        
        self.fpNumZWdg = RO.Wdg.IntEntry(
            master = self.expWdg,
            minValue = 1,
            maxValue = 9999,
            width = SpacingWidth,
            helpText = "number of etalon Z spacings",
            helpURL = HelpURL,
        )
        gr.gridWdg("Num Zs", self.fpNumZWdg, "steps")
        
        self.fpEndZWdg = RO.Wdg.IntLabel(
            master = self.expWdg,
            width = SpacingWidth,
            helpText = "final etalon Z spacing",
            helpURL = HelpURL,
            anchor = "e",
        )
        self.fpEndZUnitsWdg = RO.Wdg.StrLabel(
            master = self.expWdg,
            text = "steps",
            helpURL = HelpURL,
            anchor = "w",
        )
        gr.gridWdg("Final Z", self.fpEndZWdg, self.fpEndZUnitsWdg)
        
        self.fpNumPassesWdg = RO.Wdg.OptionMenu(
            master = self.expWdg,
            items = ("1", "2", "3"),
            defValue = "2",
            helpText = "number of passes in which to sample Z",
            helpURL = HelpURL,
        )
        gr.gridWdg("Num Passes", self.fpNumPassesWdg)
        
        self.currSeqIndWdg = RO.Wdg.IntLabel(
            master = self.expWdg,
            width = SpacingWidth,
            helpText = "index of current Z spacing",
            helpURL = HelpURL,
            anchor = "e",
        )
        gr.gridWdg("Current Index", self.currSeqIndWdg)
        
        fpCurrWdg = RO.Wdg.IntLabel(
            master = self.expWdg,
            width = SpacingWidth,
            helpText = "current actual etalon Z spacing",
            helpURL = HelpURL,
            anchor = "e",
        )
        gr.gridWdg("Current Z", fpCurrWdg, "steps")
        
        self.nicfpsModel.fpZ.addROWdg(fpCurrWdg)
        
        self.fpBegZWdg.addCallback(self.updEndZ, callNow=False)
        self.fpDeltaZWdg.addCallback(self.updEndZ, callNow=False)
        self.fpNumZWdg.addCallback(self.updEndZ, callNow=True)