Finally, achieve the living plotting

This commit is contained in:
gao 2022-08-10 16:40:15 +02:00
parent 98fd4f3ded
commit ae037596dc
13 changed files with 287 additions and 105 deletions

95
.idea/workspace.xml generated
View File

@ -1,16 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="ChangeListManager"> <component name="ChangeListManager">
<list default="true" id="68ddce6f-baaa-4bac-af24-443b9be545bf" name="Changes" comment="Update for plotting function."> <list default="true" id="68ddce6f-baaa-4bac-af24-443b9be545bf" name="Changes" comment="Update for 1D living plot, but exist a huge bug">
<change afterPath="$PROJECT_DIR$/HelperClasses/Plotting/Widget1DLivingPlot.py" afterDir="false" /> <change afterPath="$PROJECT_DIR$/living_plot_main.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/living_plot_starter.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/test_call.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/text2.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/HelperClasses/AbsorptionImaging.py" beforeDir="false" afterPath="$PROJECT_DIR$/HelperClasses/AbsorptionImaging.py" afterDir="false" /> <change beforePath="$PROJECT_DIR$/HelperClasses/AbsorptionImaging.py" beforeDir="false" afterPath="$PROJECT_DIR$/HelperClasses/AbsorptionImaging.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/HelperClasses/Plotting/DataExtractorLyse.py" beforeDir="false" afterPath="$PROJECT_DIR$/HelperClasses/Plotting/DataExtractorLyse.py" afterDir="false" /> <change beforePath="$PROJECT_DIR$/HelperClasses/Plotting/DataExtractorLyse.py" beforeDir="false" afterPath="$PROJECT_DIR$/HelperClasses/Plotting/DataExtractorLyse.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/HelperClasses/Plotting/MainPlotPanel.py" beforeDir="false" afterPath="$PROJECT_DIR$/HelperClasses/Plotting/MainPlotPanel.py" afterDir="false" /> <change beforePath="$PROJECT_DIR$/HelperClasses/Plotting/MainPlotPanel.py" beforeDir="false" afterPath="$PROJECT_DIR$/HelperClasses/Plotting/MainPlotPanel.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/HelperClasses/Plotting/WidgetAnalysePanel.py" beforeDir="false" afterPath="$PROJECT_DIR$/HelperClasses/Plotting/WidgetAnalysePanel.py" afterDir="false" /> <change beforePath="$PROJECT_DIR$/HelperClasses/Plotting/WidgetAnalysePanel.py" beforeDir="false" afterPath="$PROJECT_DIR$/HelperClasses/Plotting/WidgetAnalysePanel.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/HelperClasses/Plotting/WidgetFakeColorPlot.py" beforeDir="false" afterPath="$PROJECT_DIR$/HelperClasses/Plotting/WidgetFakeColorPlot.py" afterDir="false" /> <change beforePath="$PROJECT_DIR$/HelperClasses/Plotting/WidgetDataSelector.py" beforeDir="false" afterPath="$PROJECT_DIR$/HelperClasses/Plotting/WidgetDataSelector.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/HelperClasses/Plotting/WidgetQuickWaterFlowPlot.py" beforeDir="false" afterPath="$PROJECT_DIR$/HelperClasses/Plotting/WidgetQuickWaterFallPlot.py" afterDir="false" /> <change beforePath="$PROJECT_DIR$/HelperClasses/Plotting/WidgetPlot.py" beforeDir="false" afterPath="$PROJECT_DIR$/HelperClasses/Plotting/WidgetPlot.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/test_absorption_imaging.py" beforeDir="false" afterPath="$PROJECT_DIR$/test_absorption_imaging.py" afterDir="false" /> <change beforePath="$PROJECT_DIR$/test.py" beforeDir="false" afterPath="$PROJECT_DIR$/test.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/test_living_plot.py" beforeDir="false" afterPath="$PROJECT_DIR$/test_living_plot.py" afterDir="false" /> <change beforePath="$PROJECT_DIR$/test_living_plot.py" beforeDir="false" afterPath="$PROJECT_DIR$/test_living_plot.py" afterDir="false" />
</list> </list>
<option name="SHOW_DIALOG" value="false" /> <option name="SHOW_DIALOG" value="false" />
@ -53,8 +56,8 @@
<recent name="D:\Jianshun Gao\Simulations\DyLab\publishedPackage\dylab\HelperClasses\Plotting" /> <recent name="D:\Jianshun Gao\Simulations\DyLab\publishedPackage\dylab\HelperClasses\Plotting" />
</key> </key>
</component> </component>
<component name="RunManager" selected="Python.test (1)"> <component name="RunManager" selected="Python.test_call">
<configuration name="Plotting1" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true"> <configuration name="living_plot_starter" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
<module name="dylab" /> <module name="dylab" />
<option name="INTERPRETER_OPTIONS" value="" /> <option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" /> <option name="PARENT_ENVS" value="true" />
@ -62,12 +65,12 @@
<env name="PYTHONUNBUFFERED" value="1" /> <env name="PYTHONUNBUFFERED" value="1" />
</envs> </envs>
<option name="SDK_HOME" value="" /> <option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/HelperClasses" /> <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<option name="IS_MODULE_SDK" value="true" /> <option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" /> <option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" /> <option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" /> <EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="SCRIPT_NAME" value="D:\Jianshun Gao\Simulations\DyLab\publishedPackage\dylab\HelperClasses\Plotting1.py" /> <option name="SCRIPT_NAME" value="$PROJECT_DIR$/living_plot_starter.py" />
<option name="PARAMETERS" value="" /> <option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" /> <option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" /> <option name="EMULATE_TERMINAL" value="false" />
@ -98,29 +101,7 @@
<option name="INPUT_FILE" value="" /> <option name="INPUT_FILE" value="" />
<method v="2" /> <method v="2" />
</configuration> </configuration>
<configuration name="test" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true"> <configuration name="test_call" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
<module name="dylab" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/HelperClasses" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/HelperClasses/test.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration name="test_fitting" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
<module name="dylab" /> <module name="dylab" />
<option name="INTERPRETER_OPTIONS" value="" /> <option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" /> <option name="PARENT_ENVS" value="true" />
@ -133,7 +114,7 @@
<option name="ADD_CONTENT_ROOTS" value="true" /> <option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" /> <option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" /> <EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/test_fitting.py" /> <option name="SCRIPT_NAME" value="$PROJECT_DIR$/test_call.py" />
<option name="PARAMETERS" value="" /> <option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" /> <option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" /> <option name="EMULATE_TERMINAL" value="false" />
@ -164,13 +145,35 @@
<option name="INPUT_FILE" value="" /> <option name="INPUT_FILE" value="" />
<method v="2" /> <method v="2" />
</configuration> </configuration>
<configuration name="text2" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
<module name="dylab" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/text2.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<recent_temporary> <recent_temporary>
<list> <list>
<item itemvalue="Python.test_call" />
<item itemvalue="Python.test (1)" /> <item itemvalue="Python.test (1)" />
<item itemvalue="Python.living_plot_starter" />
<item itemvalue="Python.text2" />
<item itemvalue="Python.test_living_plot" /> <item itemvalue="Python.test_living_plot" />
<item itemvalue="Python.test" />
<item itemvalue="Python.Plotting1" />
<item itemvalue="Python.test_fitting" />
</list> </list>
</recent_temporary> </recent_temporary>
</component> </component>
@ -189,7 +192,8 @@
<workItem from="1658844297242" duration="39201000" /> <workItem from="1658844297242" duration="39201000" />
<workItem from="1659027245256" duration="8511000" /> <workItem from="1659027245256" duration="8511000" />
<workItem from="1659078820495" duration="69000" /> <workItem from="1659078820495" duration="69000" />
<workItem from="1659078901335" duration="96964000" /> <workItem from="1659078901335" duration="106222000" />
<workItem from="1660122062939" duration="19981000" />
</task> </task>
<task id="LOCAL-00001" summary="First working version. Need introductions"> <task id="LOCAL-00001" summary="First working version. Need introductions">
<created>1658494877565</created> <created>1658494877565</created>
@ -226,7 +230,14 @@
<option name="project" value="LOCAL" /> <option name="project" value="LOCAL" />
<updated>1660052254656</updated> <updated>1660052254656</updated>
</task> </task>
<option name="localTasksCounter" value="6" /> <task id="LOCAL-00006" summary="Update for 1D living plot, but exist a huge bug">
<created>1660060102676</created>
<option name="number" value="00006" />
<option name="presentableId" value="LOCAL-00006" />
<option name="project" value="LOCAL" />
<updated>1660060102676</updated>
</task>
<option name="localTasksCounter" value="7" />
<servers /> <servers />
</component> </component>
<component name="TypeScriptGeneratedFilesManager"> <component name="TypeScriptGeneratedFilesManager">
@ -249,7 +260,8 @@
<MESSAGE value="Debug for calculating atom number.&#10;&#10;Add selecting the effective area function in AbsorptionImaging.py.&#10;&#10;Optimaze plotting function." /> <MESSAGE value="Debug for calculating atom number.&#10;&#10;Add selecting the effective area function in AbsorptionImaging.py.&#10;&#10;Optimaze plotting function." />
<MESSAGE value="Debug for calculating atom number.&#10;&#10;Add background subtraction function.&#10;&#10;Correct the pixel size of the camera" /> <MESSAGE value="Debug for calculating atom number.&#10;&#10;Add background subtraction function.&#10;&#10;Correct the pixel size of the camera" />
<MESSAGE value="Update for plotting function." /> <MESSAGE value="Update for plotting function." />
<option name="LAST_COMMIT_MESSAGE" value="Update for plotting function." /> <MESSAGE value="Update for 1D living plot, but exist a huge bug" />
<option name="LAST_COMMIT_MESSAGE" value="Update for 1D living plot, but exist a huge bug" />
</component> </component>
<component name="XDebuggerManager"> <component name="XDebuggerManager">
<breakpoint-manager> <breakpoint-manager>
@ -295,9 +307,12 @@
</component> </component>
<component name="com.intellij.coverage.CoverageDataManagerImpl"> <component name="com.intellij.coverage.CoverageDataManagerImpl">
<SUITE FILE_PATH="coverage/dylab$test_living_plot.coverage" NAME="test_living_plot Coverage Results" MODIFIED="1659127460208" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> <SUITE FILE_PATH="coverage/dylab$test_living_plot.coverage" NAME="test_living_plot Coverage Results" MODIFIED="1659127460208" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/dylab$test__1_.coverage" NAME="test (1) Coverage Results" MODIFIED="1660054001747" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> <SUITE FILE_PATH="coverage/dylab$test__1_.coverage" NAME="test (1) Coverage Results" MODIFIED="1660132502214" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/dylab$Plotting.coverage" NAME="Plotting Coverage Results" MODIFIED="1659081506380" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/HelperClasses" /> <SUITE FILE_PATH="coverage/dylab$Plotting.coverage" NAME="Plotting Coverage Results" MODIFIED="1659081506380" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/HelperClasses" />
<SUITE FILE_PATH="coverage/dylab$test_call.coverage" NAME="test_call Coverage Results" MODIFIED="1660141050972" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/dylab$test_fitting.coverage" NAME="test_fitting Coverage Results" MODIFIED="1658416885056" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" /> <SUITE FILE_PATH="coverage/dylab$test_fitting.coverage" NAME="test_fitting Coverage Results" MODIFIED="1658416885056" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/dylab$living_plot_starter.coverage" NAME="living_plot_starter Coverage Results" MODIFIED="1660123156670" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/dylab$text2.coverage" NAME="text2 Coverage Results" MODIFIED="1660064702499" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/dylab$test.coverage" NAME="test Coverage Results" MODIFIED="1659126746245" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/HelperClasses" /> <SUITE FILE_PATH="coverage/dylab$test.coverage" NAME="test Coverage Results" MODIFIED="1659126746245" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/HelperClasses" />
</component> </component>
</project> </project>

View File

@ -117,9 +117,9 @@ class absorption_imaging:
mean += np.average(image[0:int(image.shape[0] * y_fraction), 0:int(image.shape[1] * x_fraction)]) mean += np.average(image[0:int(image.shape[0] * y_fraction), 0:int(image.shape[1] * x_fraction)])
mean += np.average(image[0:int(image.shape[0] * y_fraction), mean += np.average(image[0:int(image.shape[0] * y_fraction),
int(image.shape[1] - image.shape[1] * x_fraction):int(image.shape[1])]) int(image.shape[1] - image.shape[1] * x_fraction):int(image.shape[1])])
mean += np.average(image[int(image.shape[0] - image.shape[0] * y_fraction):int(image.shape[1]), mean += np.average(image[int(image.shape[0] - image.shape[0] * y_fraction):int(image.shape[0]),
0:int(image.shape[1] * x_fraction)]) 0:int(image.shape[1] * x_fraction)])
mean += np.average(image[int(image.shape[0] - image.shape[0] * y_fraction):int(image.shape[1]), mean += np.average(image[int(image.shape[0] - image.shape[0] * y_fraction):int(image.shape[0]),
int(image.shape[1] - image.shape[1] * x_fraction):int(image.shape[1])]) int(image.shape[1] - image.shape[1] * x_fraction):int(image.shape[1])])
mean = mean / 4 mean = mean / 4
@ -137,6 +137,7 @@ class absorption_imaging:
self.image_absorption_cut = self.image_absorption[self.y_start:self.y_end, self.x_start:self.x_end] self.image_absorption_cut = self.image_absorption[self.y_start:self.y_end, self.x_start:self.x_end]
back_ground = self.corner_subtract(self.image_absorption_cut, 0.1, 0.1) back_ground = self.corner_subtract(self.image_absorption_cut, 0.1, 0.1)
self.image_absorption_cut = self.image_absorption_cut - back_ground self.image_absorption_cut = self.image_absorption_cut - back_ground
self.image_absorption_remove_background = self.image_absorption - back_ground self.image_absorption_remove_background = self.image_absorption - back_ground

View File

@ -23,11 +23,14 @@ class DataExtractorManager:
def __init__(self, data_path=None): def __init__(self, data_path=None):
self.data_extractors = {} self.data_extractors = {}
# self.h5_file = None
self.data_path = data_path self.data_path = data_path
self.local_data_changed = False self.local_data_changed = False
def update_local_data(self, h5_path): def update_local_data(self, h5_path):
h5_path = h5_path.replace('\n', '')
h5_path = os.path.join(h5_path)
with h5py.File(h5_path, 'r') as h5_file: with h5py.File(h5_path, 'r') as h5_file:
self.local_data_changed = False self.local_data_changed = False
for key in self.data_extractors: for key in self.data_extractors:
@ -76,41 +79,15 @@ class DataExtractor:
self.data_type = type self.data_type = type
self.data_label = label self.data_label = label
def extract_data(self, h5_path, h5_file=None): def extract_data(self, h5_file):
result = None result = None
data_handle = lyse.Run(h5_path, no_write=True) try:
result = h5_file[self.data_path][()]
if self.data_type == 'array': result = np.array(result)
try: except:
result = data_handle.get_result_array(self.data_path[0], self.data_path[1], result = None
h5_file=h5_file)
result = np.array(result)
except:
result = None
elif self.data_type == 'single':
try:
result = data_handle.get_result(self.data_path[0], self.data_path[1],
h5_file=h5_file)
except:
result = None
elif self.data_type == 'global':
try:
result = data_handle.get_globals(self.data_path[0], h5_file=h5_file)
result = result[self.data_path[1]]
except:
result = None
elif self.data_type == 'image':
try:
result = data_handle.get_image(self.data_path[0], self.data_path[1],
self.data_path[2], h5_file=h5_file)
result = np.array(result)
except:
result = None
return result return result
@ -118,7 +95,7 @@ class DataExtractor:
if h5_path in self.local_datas and self.local_mtimes[h5_path] == get_mtime(h5_path): if h5_path in self.local_datas and self.local_mtimes[h5_path] == get_mtime(h5_path):
self.local_data_changed = False self.local_data_changed = False
elif self.load_to_ram: elif self.load_to_ram:
self.local_datas[h5_path] = self.extract_data(h5_path, h5_file=h5_file) self.local_datas[h5_path] = self.extract_data(h5_file)
self.local_mtimes[h5_path] = get_mtime(h5_path) self.local_mtimes[h5_path] = get_mtime(h5_path)
self.local_data_changed = True self.local_data_changed = True
@ -138,7 +115,7 @@ class DataExtractor:
def clean_memory(self, h5_paths): def clean_memory(self, h5_paths):
for key in list(self.local_datas): for key in list(self.local_datas):
if key not in h5_paths.to_list(): if key not in h5_paths.tolist():
del self.local_datas[key] del self.local_datas[key]
del self.local_mtimes[key] del self.local_mtimes[key]

View File

@ -1,23 +1,38 @@
import pyqtgraph as pg import pyqtgraph as pg
from pyqtgraph.Qt import QtCore, QtGui from pyqtgraph.Qt import QtCore, QtGui
import numpy as np import numpy as np
import os
from pyqtgraph.dockarea import * from pyqtgraph.dockarea import *
from PyQt5.QtWidgets import * from PyQt5.QtWidgets import *
from PyQt5.QtCore import * from PyQt5.QtCore import *
import lyse
from .WidgetDataSelector import WidgetDataSelector from .WidgetDataSelector import WidgetDataSelector
from .WidgetAnalysePanel import WidgetAnalysePanel from .WidgetAnalysePanel import WidgetAnalysePanel
def write_pid():
with open("living_plot.ini", 'w') as pid_file:
pid = os.getpid()
pid_file.write(str(pid))
return pid
def clean_pid():
with open("living_plot.ini", 'w') as pid_file:
pid_file.truncate(0)
class MainPlotPanel(QtGui.QMainWindow): class MainPlotPanel(QtGui.QMainWindow):
def __init__(self, h5_paths, n_rows=3, **kwargs): def __init__(self, h5_paths, n_rows=3, **kwargs):
self.h5_paths = h5_paths
super().__init__(**kwargs) super().__init__(**kwargs)
write_pid()
self.h5_paths = np.array(h5_paths)
pg.mkQApp() pg.mkQApp()
self.n_rows = n_rows self.n_rows = n_rows
@ -53,7 +68,9 @@ class MainPlotPanel(QtGui.QMainWindow):
self.shotselector.valueChanged.connect(self.refresh) self.shotselector.valueChanged.connect(self.refresh)
self.shotselector.selectionChanged.connect(self.refresh) self.shotselector.selectionChanged.connect(self.refresh)
self.df = lyse.data() def closeEvent(self, event):
clean_pid()
event.accept()
def add_plot_dock(self, plot_name, plot_widget, overlap=True, **kwargs): def add_plot_dock(self, plot_name, plot_widget, overlap=True, **kwargs):
if plot_name not in self.plots: if plot_name not in self.plots:
@ -87,27 +104,30 @@ class MainPlotPanel(QtGui.QMainWindow):
del self.plots[dock.title()] del self.plots[dock.title()]
def update_h5_paths(self, h5_paths): def update_h5_paths(self, h5_paths):
self.h5_paths = h5_paths self.h5_paths = np.array(h5_paths)
self.shotselector.update_nshots(len(h5_paths)) self.shotselector.update_nshots(len(h5_paths))
for plot_name in self.plots: for plot_name in self.plots:
self.plots[plot_name].data_extractor_manager.clean_memory(h5_paths) self.plots[plot_name].data_extractor_manager.clean_memory(h5_paths)
def add_h5_path(self, h5_path):
self.h5_paths = np.append(self.h5_paths, h5_path)
self.shotselector.update_nshots(len(self.h5_paths))
def refresh(self, h5_path=None): def refresh(self, h5_path=None):
if len(self.h5_paths): if len(self.h5_paths):
self.h5_paths_selected = self.h5_paths.iloc[self.shotselector.get_selected_indices()] self.h5_paths_selected = self.h5_paths[np.array(self.shotselector.get_selected_indices())]
if h5_path == None: if h5_path == None:
i = self.shotselector.get_current_index() i = self.shotselector.get_current_index()
h5_path = self.h5_paths.iloc[i] h5_path = self.h5_paths[np.array(i)]
for plot_name in self.plots: for plot_name in self.plots:
self.plots[plot_name].data_extractor_manager.update_local_data(h5_path) self.plots[plot_name].data_extractor_manager.update_local_data(h5_path)
# self.data_extractor_manager.update_local_data(h5_path)
for plot_name, plot in self.plots.items(): for plot_name, plot in self.plots.items():
plot.update_from_h5(h5_path) plot.update_from_h5(h5_path)
else: else:

View File

@ -32,6 +32,9 @@ class WidgetAnalysePanel(QSplitter):
x, y = self.absorption_image_plot.roi.pos() x, y = self.absorption_image_plot.roi.pos()
x_span, y_span = self.absorption_image_plot.roi.size() x_span, y_span = self.absorption_image_plot.roi.size()
x = x + x_span / 2
y = y + y_span / 2
x = int(x) x = int(x)
y = int(y) y = int(y)
x_span = int(x_span) x_span = int(x_span)

View File

@ -128,4 +128,4 @@ class WidgetDataSelector(pg.LayoutWidget):
return int(self.current_idx_le.text()) % self.nshots return int(self.current_idx_le.text()) % self.nshots
def get_selected_indices(self): def get_selected_indices(self):
return (np.array(self.idx_selected),) return np.array(self.idx_selected)

View File

@ -44,6 +44,7 @@ class WidgetPlot(QSplitter):
self.data_extractor_manager = DataExtractorManager() self.data_extractor_manager = DataExtractorManager()
def update_from_h5(self, h5_path): def update_from_h5(self, h5_path):
h5_path = h5_path.replace('\n', '')
if self.h5_path_shown != h5_path or self.data_extractor_manager.local_data_changed: if self.h5_path_shown != h5_path or self.data_extractor_manager.local_data_changed:
self.h5_path_shown = h5_path self.h5_path_shown = h5_path
self.update(h5_path) self.update(h5_path)

93
living_plot_class.py Normal file
View File

@ -0,0 +1,93 @@
import lyse
import numpy as np
from PyQt5.QtCore import QTimer
from HelperClasses.Plotting import WidgetFakeColorPlot, MainPlotPanel, Widget1DLivingPlot
from HelperClasses import DyTransition, Camera, AbsorptionImaging
import cProfile
import pstats
class FigureManager:
def __init__(self):
self.MainPlotPanel = None
self.timer = None
self.h5_paths = np.empty(0)
def refresh_h5_path(self):
with open(r'D:\Jianshun Gao\Simulations\DyLab\publishedPackage\dylab\h5_file_path.ini', 'r') as h5_path_file:
h5_path_new = np.array(h5_path_file.readlines())
if len(h5_path_new) == len(self.h5_paths) + 1:
if len(h5_path_new) == 1 or (h5_path_new[:len(h5_path_new) - 1] == self.h5_paths).any():
h5_path = h5_path_new[len(h5_path_new) - 1]
self.MainPlotPanel.add_h5_path(h5_path)
self.h5_paths = np.append(self.h5_paths, h5_path)
self.MainPlotPanel.refresh(h5_path)
elif len(h5_path_new) == len(self.h5_paths):
if not (self.h5_paths == h5_path_new).any():
self.h5_paths = h5_path_new
self.MainPlotPanel.update_h5_paths(h5_path_new)
self.MainPlotPanel.refresh(h5_path_new[len(h5_path_new) - 1])
else:
self.h5_paths = h5_path_new
self.MainPlotPanel.update_h5_paths(h5_path_new)
self.MainPlotPanel.refresh(h5_path_new[len(h5_path_new) - 1])
def start_living_plot(self, h5_paths):
self.MainPlotPanel = MainPlotPanel.MainPlotPanel(h5_paths)
plot_name = '3D-MOT Absorption Imaging - With Atoms'
if not plot_name in self.MainPlotPanel.plots:
current_plotting = WidgetFakeColorPlot.WidgetFakeColorPlot(plot_name + '1',
data_path=r"images/MOT_3D_Camera/in_situ_absorption/atoms",
Roi=False, colorbarText=False)
self.MainPlotPanel.add_plot_dock(plot_name + '1', current_plotting)
plot_name = '3D-MOT Absorption Imaging - Without Atoms'
if not plot_name in self.MainPlotPanel.plots:
current_plotting = WidgetFakeColorPlot.WidgetFakeColorPlot(plot_name + '1',
data_path=r"images/MOT_3D_Camera/in_situ_absorption/background",
Roi=False, colorbarText=False)
self.MainPlotPanel.add_plot_dock(plot_name + '1', current_plotting)
plot_name = '3D-MOT Absorption Imaging - Dark'
if not plot_name in self.MainPlotPanel.plots:
current_plotting = WidgetFakeColorPlot.WidgetFakeColorPlot(plot_name + '1',
data_path=r"images/MOT_3D_Camera/in_situ_absorption/dark",
Roi=False, colorbarText=False)
self.MainPlotPanel.add_plot_dock(plot_name + '1', current_plotting)
plot_name = r'3D-MOT Absorption Imaging'
if not plot_name in self.MainPlotPanel.plots:
current_plotting = WidgetFakeColorPlot.WidgetFakeColorPlot(plot_name,
data_path=r"results/absorption_imaging/absorption_imaging")
self.MainPlotPanel.add_plot_dock(plot_name, current_plotting)
absorption_imaging_transition = DyTransition.creat_Dy421()
mot_3D_camera = Camera.c11440_36u(absorption_imaging_transition['wavelength'])
absorption_image = AbsorptionImaging.absorption_imaging(None, 'MOT_3D_Camera', 'in_situ_absorption',
absorption_imaging_transition, mot_3D_camera, 0, 0)
self.MainPlotPanel.analyse_panel.add_absorption_imaging(absorption_image, current_plotting)
# Add realtime plotting for atom number
# plot_name = '3D-MOT Atom Number'
# if not plot_name in self.MainPlotPanel.plots:
# current_plotting = Widget1DLivingPlot.Widget1DLivingPlot(plot_name, y_data_path=('absorption_imaging', 'atom_number'), y_in_results=True)
#
# self.MainPlotPanel.add_plot_dock(plot_name, current_plotting)
self.timer = QTimer()
self.timer.timeout.connect(self.refresh_h5_path)
self.timer.start(1000)
return self

16
living_plot_main.py Normal file
View File

@ -0,0 +1,16 @@
from living_plot_class import FigureManager
import numpy as np
import sys
from PyQt5.QtWidgets import QApplication
app = QApplication(sys.argv)
h5_paths = np.empty(0)
figure_manager = FigureManager()
run = figure_manager.start_living_plot(h5_paths)
sys.exit(app.exec_())

31
living_plot_starter.py Normal file
View File

@ -0,0 +1,31 @@
import os
import time
import lyse
def get_pid():
with open("living_plot.ini", 'r') as pid_file:
pid_str = pid_file.readline()
return pid_str
def call_living_plot():
pid_str = get_pid()
if pid_str == "":
start_dire = r"living_plot_main.py"
os.popen("python %s" % start_dire)
def update_h5_path_file():
h5_paths = lyse.h5_paths()
with open('h5_file_path.ini', 'w') as h5_path_file:
h5_path_file.truncate(0)
s = '\n'.join(h5_paths)
h5_path_file.write(s)
update_h5_path_file()
call_living_plot()

13
test.py
View File

@ -1,2 +1,11 @@
import pyqtgraph.examples # import pyqtgraph.examples
pyqtgraph.examples.run() # pyqtgraph.examples.run()
import h5py
h5_path = r"C:/Users/Jianshun Gao/Desktop/2022-07-22_0037_MOT_3D_Imaging_4.h5"
data_path = r"results/absorption_imaging/absorption_imaging"
with h5py.File(h5_path, 'r') as h5_file:
result = h5_file[data_path][()]
print(result)

View File

@ -20,6 +20,8 @@ figure_manager = lyse.figure_manager
h5_paths = lyse.h5_paths() h5_paths = lyse.h5_paths()
print(h5_paths)
if lyse.spinning_top: if lyse.spinning_top:
# If so, use the filepath of the current shot # If so, use the filepath of the current shot
h5_path = lyse.path h5_path = lyse.path
@ -41,19 +43,19 @@ if not plot_name in figure_manager.MainPlotPanel.plots:
Roi=False, colorbarText=False) Roi=False, colorbarText=False)
figure_manager.MainPlotPanel.add_plot_dock(plot_name + '1', current_plotting) figure_manager.MainPlotPanel.add_plot_dock(plot_name + '1', current_plotting)
plot_name = '3D-MOT Absorption Imaging - Without Atoms' # plot_name = '3D-MOT Absorption Imaging - Without Atoms'
if not plot_name in figure_manager.MainPlotPanel.plots: # if not plot_name in figure_manager.MainPlotPanel.plots:
current_plotting = WidgetFakeColorPlot.WidgetFakeColorPlot(plot_name + '1', ('in_situ_absorption', 'background'), # current_plotting = WidgetFakeColorPlot.WidgetFakeColorPlot(plot_name + '1', ('in_situ_absorption', 'background'),
data_group='MOT_3D_Camera', # data_group='MOT_3D_Camera',
Roi=False, colorbarText=False) # Roi=False, colorbarText=False)
figure_manager.MainPlotPanel.add_plot_dock(plot_name + '1', current_plotting) # figure_manager.MainPlotPanel.add_plot_dock(plot_name + '1', current_plotting)
#
plot_name = '3D-MOT Absorption Imaging - Dark' # plot_name = '3D-MOT Absorption Imaging - Dark'
if not plot_name in figure_manager.MainPlotPanel.plots: # if not plot_name in figure_manager.MainPlotPanel.plots:
current_plotting = WidgetFakeColorPlot.WidgetFakeColorPlot(plot_name + '1', ('in_situ_absorption', 'dark'), # current_plotting = WidgetFakeColorPlot.WidgetFakeColorPlot(plot_name + '1', ('in_situ_absorption', 'dark'),
data_group='MOT_3D_Camera', # data_group='MOT_3D_Camera',
Roi=False, colorbarText=False) # Roi=False, colorbarText=False)
figure_manager.MainPlotPanel.add_plot_dock(plot_name + '1', current_plotting) # figure_manager.MainPlotPanel.add_plot_dock(plot_name + '1', current_plotting)
# Add plotting for absorption imaging # Add plotting for absorption imaging
plot_name = '3D-MOT Absorption Imaging' plot_name = '3D-MOT Absorption Imaging'
@ -74,9 +76,9 @@ if not plot_name in figure_manager.MainPlotPanel.plots:
# current_plotting = Widget1DLivingPlot.Widget1DLivingPlot(plot_name, y_data_path=('absorption_imaging', 'atom_number'), y_in_results=True) # current_plotting = Widget1DLivingPlot.Widget1DLivingPlot(plot_name, y_data_path=('absorption_imaging', 'atom_number'), y_in_results=True)
# #
# figure_manager.MainPlotPanel.add_plot_dock(plot_name, current_plotting) # figure_manager.MainPlotPanel.add_plot_dock(plot_name, current_plotting)
#
# figure_manager.MainPlotPanel.update_h5_paths(h5_paths) figure_manager.MainPlotPanel.update_h5_paths(h5_paths)
# figure_manager.MainPlotPanel.refresh(h5_path) figure_manager.MainPlotPanel.refresh(h5_path)
profile.disable() profile.disable()
ps = pstats.Stats(profile) ps = pstats.Stats(profile)

14
text2.py Normal file
View File

@ -0,0 +1,14 @@
import psutil
def is_process_running(process_name):
pl = psutil.pids()
for pid in pl:
if psutil.Process(pid).name() == process_name:
print(pid)
print(psutil.Process(pid).cmdline())
# return True
return False
print(is_process_running('python.exe'))