Beispiel #1
0
class AppRoot(TabularMeasurements2M):

    currentData = traits.DataSet(read_only=True).tag(name="Time domain",
                                                     axes_labels=['Time'],
                                                     data_label="Amplitude",
                                                     is_power=False)

    dataSaver = traitlets.Instance(DataSaver)

    nMeasurements = traitlets.Int(1, min=1).tag(name="No. of measurements",
                                                priority=99)

    def __init__(self, objectName=None, loop=None):
        super().__init__(objectName='PI tabular measurements', loop=loop)

        self.dataSaver = DataSaver(objectName="Data Saver")

        self.pi_conn = PI.Connection(PI_Comport)
        self.mani_conn = PI.Connection(PI_Manipulator)

        pi_stage = PI.AxisAtController(
            self.pi_conn,
            ignore216=True)  # ignore216 implemented by JanO Warning!
        pi_stage.objectName = "PI C-863 DLine"
        pi_stage.setPreferredUnits(ureg.ps, ureg.ps / ureg.s)

        self.TimeDomainScan = Scan(objectName='TimeDomainScan')
        self.TimeDomainScan.manipulator = pi_stage
        self.TimeDomainScan.dataSource = SR830(rm.open_resource(SR800_Port))
        self.TimeDomainScan.dataSource.objectName = "SR830"

        self.TimeDomainScan.continuousScan = True
        self.TimeDomainScan.minimumValue = Q_(1250, 'ps')
        self.TimeDomainScan.maximumValue = Q_(1315, 'ps')
        self.TimeDomainScan.overscan = Q_(3, 'ps')
        self.TimeDomainScan.step = Q_(0.05, 'ps')
        self.TimeDomainScan.positioningVelocity = Q_(30, 'ps/s')
        self.TimeDomainScan.scanVelocity = Q_(1.6, 'ps/s')
        self.TimeDomainScan.retractAtEnd = True

        self.dataSource = self.TimeDomainScan

        manipulator1 = PI.AxisAtController(
            self.mani_conn,
            ignore216=True)  # ignore216 implemented by JanO Warning!
        # ignore216 = True means that the error 216 (driven into end switch) will be ignored. There is a problem with the
        # PI stage being used as a manipulator. It is showing this error despite being far away form the end siwtch or even not moving
        manipulator1.setPreferredUnits(ureg.mm, ureg.mm /
                                       ureg.s)  # added JanO 22.1.2019
        manipulator1.objectName = 'PI C-863'
        self.manipulator1 = manipulator1
        self.positioningVelocityM1 = Q_(4, 'mm/s')
        self.scanVelocity = Q_(4, 'mm/s')

        manipulator2 = TMCL(objectName="TMCL Rotator", port=tmcl_port)
        manipulator2.setPreferredUnits(
            ureg.deg,
            ureg.dimensionless)  # ureg.dimensionless, ureg.mm / ureg.s
        self.manipulator2 = manipulator2

        self.dataSaver.registerManipulator(self.manipulator1, 'Position')
        self.dataSaver.registerManipulator(self.manipulator2, 'Rotation')
        self.dataSaver.registerObjectAttribute(self, 'currentMeasurementName',
                                               'currentTableEntry')
        self.dataSaver.fileNameTemplate = '{date}-{name}-{currentTableEntry}-{Position}-{Rotation}'
        self.dataSaver.set_trait('path', Path(
            'E:/Messdaten/test/'))  #added by Cornelius as standard savepath
        self.TimeDomainScan.addDataSetReadyCallback(self.dataSaver.process)
        self.TimeDomainScan.addDataSetReadyCallback(self.setCurrentData)
        self._backAndForth = True

    def setCurrentData(self, dataSet):
        self.set_trait('currentData', dataSet)

    async def __aenter__(self):
        #await super().__aenter__()
        await self.pi_conn.__aenter__()
        await self.mani_conn.__aenter__()
        await self.manipulator1.__aenter__()
        await self.manipulator2.__aenter__()
        await self.TimeDomainScan.manipulator.__aenter__()  #pi
        await self.TimeDomainScan.dataSource.__aenter__()  #lockin

        return self

    @action("Take Tabular measurements")
    async def takeTabularScan(self):
        self.set_trait(
            'progress2', 0
        )  #progress trait changes added by Cornelius for additional progress Information
        for x in range(self.nMeasurements):
            dataset = await self.readDataSet()
            self.set_trait('progress2', (x + 1) / self.nMeasurements)

    @action("Take No. of measurements")
    async def takeSingleMeasurements(self):
        self.set_trait(
            'progress', 0
        )  #progress trait changes added by Cornelius for additional progress Information
        self.set_trait('progress2', 0)
        for x in range(self.nMeasurements):
            dataset = await self.TimeDomainScan.readDataSet()
            self.set_trait('progress', (x + 1) / self.nMeasurements)
            self.set_trait('progress2', (x + 1) / self.nMeasurements)

    @action("Stop")
    async def stop(
        self
    ):  # added by Cornelius to Stop both tabular scan and multiple measurements scan
        if not self._activeFuture:
            if not self.TimeDomainScan._activeFuture:
                return
            self.TimeDomainScan._activeFuture.cancel()
            return
        self._activeFuture.cancel()

    async def __aexit__(self, *args):
        await self.pi_conn.__aexit__(*args)
        await self.mani_conn.__aexit__(*args)
        await self.manipulator1.__aexit__(*args)
        await self.manipulator2.__aexit__(*args)
        await self.TimeDomainScan.manipulator.__aexit__(*args)  #pi
        await self.TimeDomainScan.dataSource.__aexit__(*args)  #lockin
        await super().__aexit__(*args)
Beispiel #2
0
class AppRoot(Scan):

    dataSaver = Instance(DataSaver)
    resetCounterRow = Bool(True, read_only=False)

    def __init__(self, objectName=None, loop=None):
        super().__init__(objectName="Y Scan", loop=loop)
        self.title = "Taipan - Schweißgüte 2"

        self.dataSaver = DataSaver(objectName="Data Saver")

        self.tem_fs = TEMFiberStretcher(tem_serial1,
                                        tem_serial2,
                                        objectName="TEM FiberStretcher",
                                        loop=loop)

        self.tem_fs.rec_Start = Q_(4, 'ps')
        self.tem_fs.rec_Stop = Q_(190, 'ps')
        self.tem_fs_av = AverageDataSource(self.tem_fs, objectName="Averager")
        """
        self.manipulatorX = IselStage(monsterstage_x,
                                objectName="Manipulator x",
                                loop=loop)
        """
        self.manipulatorX = DummyManipulator()
        """
        self.manipulatorY = IselStage(monsterstage_y,
                                objectName="Manipulator y",
                                loop=loop)
        """
        self.manipulatorY = DummyManipulator()
        #define the x scan
        self.scanx = Scan(self.manipulatorX, self.tem_fs_av)
        self.scanx.minimumValue = Q_(0, 'mm')
        self.scanx.maximumValue = Q_(10, 'mm')
        self.scanx.step = Q_(1, 'mm')
        self.scanx.scanVelocity = Q_(10, 'mm/s')
        self.scanx.positioningVelocity = Q_(100, 'mm/s')
        self.scanx.objectName = "X Scan"
        self.scanx.retractAtEnd = True
        #define the y scan
        self.dataSource = self.scanx
        self._oldScanXStart = self.dataSource.start
        self._oldScanXStop = self.dataSource.stop
        self.dataSource.start = self.startMotorScan
        self.dataSource.stop = self.stopMotorScan
        self.manipulator = self.manipulatorY
        self.retractAtEnd = True
        self.minimumValue = Q_(0, 'mm')
        self.maximumValue = Q_(10, 'mm')
        self.step = Q_(2.5, 'mm')
        self.positioningVelocity = Q_(100, 'mm/s')
        self.scanVelocity = Q_(10, 'mm/s')
        #register the manipulators in the dataSaver
        self.dataSaver.registerManipulator(self.manipulatorX, 'X')
        self.dataSaver.registerManipulator(self.manipulatorY, 'Y')
        self.dataSaver.fileNameTemplate = '{date}-{name}-{X}-{Y}'
        self.tem_fs_av.addDataSetReadyCallback(self.dataSaver.process)
        self.resetCounter(self.resetCounterRow)

    @observe('resetCounterRow')
    def resetCounter(self, val):
        if isinstance(val, dict):
            val = val['new']

        async def start():
            pass

        async def asyncResetCounter():
            self.tem_fs.resetCounter()

        if val:
            self.scanx.dataSource.start = asyncResetCounter
        else:
            self.scanx.dataSource.start = start

    @action("Take single measurement")
    async def takeSingleMeasurement(self):
        data = await self.tem_fs_av.readDataSet()

    @action("Take measurement")
    async def takeMeasurement(self):
        await self.readDataSet()
        #self.dataSaver.process(data)

    async def startMotorScan(self):
        self.tem_fs.mScanEnable = True
        self.tem_fs.resetCounter()
        await self._oldScanXStart()

    async def stopMotorScan(self):
        self.tem_fs.mScanEnable = False
        await self._oldScanXStop()
Beispiel #3
0
class AppRoot(TabularMeasurements2M):
    currentData = traits.DataSet(read_only=True).tag(name="Time domain",
                                                     axes_labels=['Time'],
                                                     data_label="Amplitude",
                                                     is_power=False)

    dataSaver = traitlets.Instance(DataSaver)

    nMeasurements = traitlets.Int(1, min=1).tag(name="No. of measurements",
                                                priority=99)

    def __init__(self, objectName=None, loop=None):
        super().__init__(objectName='PI tabular measurements', loop=loop)

        self.dataSaver = DataSaver(objectName="Data Saver")

        self.pi_conn = PI.Connection(PI_port)
        #self.mani_conn2 = PI.Connection(Manip2_comport)

        pi_stage = PI.AxisAtController(self.pi_conn)
        pi_stage.objectName = "PI C-867 DLine"
        pi_stage.setPreferredUnits(ureg.ps, ureg.ps / ureg.s)

        self.TimeDomainScan = Scan(objectName='TimeDomainScan')
        self.TimeDomainScan.manipulator = pi_stage
        resource = rm.open_resource(SR7230_LAN_Port)
        self.TimeDomainScan.dataSource = SR7230(resource, ethernet=True)
        self.TimeDomainScan.dataSource.objectName = "SR7230"

        self.TimeDomainScan.continuousScan = True
        self.TimeDomainScan.minimumValue = Q_(840, 'ps')
        self.TimeDomainScan.maximumValue = Q_(910, 'ps')
        self.TimeDomainScan.overscan = Q_(1, 'ps')
        self.TimeDomainScan.step = Q_(0.05, 'ps')
        self.TimeDomainScan.positioningVelocity = Q_(40, 'ps/s')
        self.TimeDomainScan.scanVelocity = Q_(1, 'ps/s')
        self.TimeDomainScan.retractAtEnd = True

        self.dataSource = self.TimeDomainScan

        self.mani_conn1 = PI.Connection(Manip1_comport)
        manipulator1 = PI.AxisAtController(self.mani_conn1)
        manipulator1.setPreferredUnits(ureg.mm, ureg.mm / ureg.s)
        manipulator1.objectName = "PI C-863 Manip"
        self.manipulator1 = manipulator1
        self.positioningVelocityM1 = Q_(4, 'mm/s')
        self.scanVelocity = Q_(4, 'mm/s')

        manipulator2 = DummyManipulator(
        )  # PI.AxisAtController(self.mani_conn2)
        manipulator2.setPreferredUnits(ureg.mm, ureg.mm / ureg.s)
        manipulator2.objectName = 'DummyManipulator 2'
        self.manipulator2 = manipulator2
        self.positioningVelocityM1 = Q_(4, 'mm/s')
        self.scanVelocity = Q_(4, 'mm/s')

        self.dataSaver.registerManipulator(self.manipulator1, 'Position1')
        self.dataSaver.registerManipulator(self.manipulator2, 'Position2')
        self.dataSaver.registerObjectAttribute(self, 'currentMeasurementName',
                                               'currentTableEntry')
        self.dataSaver.fileNameTemplate = '{date}-{name}-{currentTableEntry}-{Position1}-{Position2}'
        self.dataSaver.set_trait('path', Path(r''))
        self.TimeDomainScan.addDataSetReadyCallback(self.dataSaver.process)
        self.TimeDomainScan.addDataSetReadyCallback(self.setCurrentData)
        self._backAndForth = True

    def setCurrentData(self, dataSet):
        self.set_trait('currentData', dataSet)

    async def __aenter__(self):
        #await super().__aenter__()
        await self.pi_conn.__aenter__()
        await self.mani_conn1.__aenter__()
        #await self.mani_conn2.__aenter__()
        await self.manipulator1.__aenter__()
        await self.manipulator2.__aenter__()
        await self.TimeDomainScan.manipulator.__aenter__()  # pi
        await self.TimeDomainScan.dataSource.__aenter__()  # lockin

        return self

    @action("Take Tabular measurements")
    async def takeTabularScan(self):
        self.set_trait(
            'progress2', 0
        )  #progress trait changes added by Cornelius for additional progress Information
        for x in range(self.nMeasurements):
            dataset = await self.readDataSet()
            self.set_trait('progress2', (x + 1) / self.nMeasurements)

    @action("Take No. of measurements")
    async def takeSingleMeasurements(self):
        self.set_trait(
            'progress', 0
        )  # progress trait changes added by Cornelius for additional progress Information
        self.set_trait('progress2', 0)
        for x in range(self.nMeasurements):
            dataset = await self.TimeDomainScan.readDataSet()
            self.set_trait('progress', (x + 1) / self.nMeasurements)
            self.set_trait('progress2', (x + 1) / self.nMeasurements)

    @action("Stop")
    async def stop(
        self
    ):  # added by Cornelius to Stop both tabular scan and multiple measurements scan
        if not self._activeFuture:
            if not self.TimeDomainScan._activeFuture:
                return
            self.TimeDomainScan._activeFuture.cancel()
            return
        self._activeFuture.cancel()

    async def __aexit__(self, *args):
        await self.pi_conn.__aexit__(*args)
        await self.mani_conn1.__aexit__(*args)
        #await self.mani_conn2.__aexit__(*args)
        await self.manipulator1.__aexit__(*args)
        await self.manipulator2.__aexit__(*args)
        await self.TimeDomainScan.manipulator.__aexit__(*args)  # pi
        await self.TimeDomainScan.dataSource.__aexit__(*args)  # lockin
        await super().__aexit__(*args)