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)
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()
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)