Skip to content

Commit 31d0ca7

Browse files
committed
Merge remote-tracking branch 'origin/dev/dc' into dev/dc
2 parents 3653d1f + 588217b commit 31d0ca7

37 files changed

+584
-150
lines changed

pychron/dvc/dvc.py

+9
Original file line numberDiff line numberDiff line change
@@ -1438,6 +1438,15 @@ def git_session_ctx(self, repository_identifier, message):
14381438
def clear_pull_cache(self):
14391439
self._pull_cache = {}
14401440

1441+
def is_clean(self, name):
1442+
try:
1443+
repo = self._get_repository(name)
1444+
ahead, behind = repo.ahead_behind()
1445+
return ahead == 0 and behind == 0
1446+
except BaseException as e:
1447+
self.debug("is clean exception {}".format(e))
1448+
return False
1449+
14411450
def sync_repo(self, name, use_progress=True, pull_frequency=None):
14421451
"""
14431452
pull or clone an repo

pychron/entry/tray_maker.py

+36-25
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ class Position(HasTraits):
3232
radius = Float(0.1)
3333

3434
def totuple(self):
35-
return self.x, self.y, self.radius, str(self.id)
35+
return self.x, self.y, self.radius * 2, str(self.id)
3636

3737
def dump(self, inches=False):
3838
x, y = self.x, self.y
@@ -53,39 +53,50 @@ class TrayMaker(Loggable):
5353
save_button = Button
5454

5555
def gen(self):
56+
# rows = [
57+
# (5, -2),
58+
# (9, -4),
59+
# (13, -6),
60+
# (15, -7),
61+
# (17, -8),
62+
# (19, -9),
63+
# (19, -9),
64+
# (21, -10),
65+
# (21, -10),
66+
# (23, -11),
67+
# (23, -11),
68+
# (23, -11),
69+
# (23, -11),
70+
# (23, -11),
71+
# (21, -10),
72+
# (21, -10),
73+
# (19, -9),
74+
# (19, -9),
75+
# (17, -8),
76+
# (15, -7),
77+
# (13, -6),
78+
# (9, -4),
79+
# (5, -2),
80+
# ]
81+
5682
rows = [
83+
(3, -1),
5784
(5, -2),
58-
(9, -4),
59-
(13, -6),
60-
(15, -7),
61-
(17, -8),
62-
(19, -9),
63-
(19, -9),
64-
(21, -10),
65-
(21, -10),
66-
(23, -11),
67-
(23, -11),
68-
(23, -11),
69-
(23, -11),
70-
(23, -11),
71-
(21, -10),
72-
(21, -10),
73-
(19, -9),
74-
(19, -9),
75-
(17, -8),
76-
(15, -7),
77-
(13, -6),
78-
(9, -4),
85+
(7, -3),
86+
(7, -3),
87+
(7, -3),
7988
(5, -2),
89+
(3, -1),
8090
]
81-
space = 2
82-
oy = 24
91+
92+
space = 6.75
93+
oy = 20.25
8394
ps = []
8495
for ri, (rc, ox) in enumerate(rows):
8596
y = oy - ri * space
8697
for ji in range(rc):
8798
x = (ox * space) + ji * space
88-
p = Position(x=x, y=y, radius=1)
99+
p = Position(x=x, y=y, radius=2.25)
89100
ps.append(p)
90101
print(x, y)
91102

pychron/experiment/automated_run/factory.py

+31-14
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,10 @@ class AutomatedRunFactory(DVCAble, PersistenceLoggable):
182182
display_labnumbers = Property(depends_on="project, selected_level, _identifiers")
183183
_identifiers = List
184184

185-
use_project_based_repository_identifier = Bool(True)
185+
# use_project_based_repository_identifier = Bool(True)
186+
# use_load_based_repository_identifier = Bool(False)
187+
188+
repository_identifier_model = Enum(("Project", ("None", "Project", "Load")))
186189
repository_identifier = Str
187190
repository_identifiers = Property(
188191
depends_on="repository_identifier_dirty, db_refresh_needed"
@@ -339,6 +342,7 @@ class AutomatedRunFactory(DVCAble, PersistenceLoggable):
339342
extract_device = Str
340343
username = Str
341344
laboratory = Str
345+
load_name = Str
342346

343347
persistence_name = "run_factory"
344348
pattributes = (
@@ -363,7 +367,9 @@ class AutomatedRunFactory(DVCAble, PersistenceLoggable):
363367
TEMPLATE,
364368
"use_simple_truncation",
365369
"conditionals_path",
366-
"use_project_based_repository_identifier",
370+
"repository_identifier_model",
371+
# "use_project_based_repository_identifier",
372+
# "use_load_based_repository_identifier",
367373
"delay_after",
368374
DISABLE_BETWEEN_POSITIONS,
369375
)
@@ -1117,16 +1123,21 @@ def _load_labnumber_meta(self, labnumber):
11171123
self.irrad_hole = d["irradiation_position"]
11181124
self._no_clear_labnumber = False
11191125

1120-
if self.use_project_based_repository_identifier:
1121-
ipp = self.irradiation_project_prefix
1122-
project_name = d["project"]
1123-
if ipp and project_name.startswith(ipp):
1124-
repo = project_name
1125-
if repo == "REFERENCES":
1126-
repo = ""
1127-
else:
1128-
repo = camel_case(project_name)
1129-
self.repository_identifier = repo
1126+
if self.repository_identifier_model in ["Load", "Project"]:
1127+
self.repository_identifier = d["repository_identifier"]
1128+
1129+
# if self.use_project_based_repository_identifier:
1130+
# ipp = self.irradiation_project_prefix
1131+
# project_name = d["project"]
1132+
# if ipp and project_name.startswith(ipp):
1133+
# repo = project_name
1134+
# if repo == "REFERENCES":
1135+
# repo = ""
1136+
# else:
1137+
# repo = camel_case(project_name)
1138+
# self.repository_identifier = repo
1139+
# elif self.use_load_based_repository_identifier:
1140+
# self.repository_identifier = d['load_name']
11301141

11311142
return True
11321143
else:
@@ -1171,12 +1182,17 @@ def _load_labnumber_meta(self, labnumber):
11711182
# irrad = ip.level.irradiation.name
11721183
# self.repository_identifier = '{}{}'.format(ipp, irrad)
11731184
if project_name != "REFERENCES":
1174-
if self.use_project_based_repository_identifier:
1185+
repo = None
1186+
if self.repository_identifier_model == "Project":
11751187
if ipp and project_name.startswith(ipp):
11761188
repo = project_name
11771189
else:
11781190
repo = camel_case(project_name)
11791191

1192+
elif self.repository_identifier_model == "Load":
1193+
repo = self.load_name
1194+
1195+
if repo:
11801196
self.debug("unprepped repo={}".format(repo))
11811197
repo = prep_repo_name(repo)
11821198
self.debug("setting repository to {}".format(repo))
@@ -1199,9 +1215,10 @@ def _load_labnumber_meta(self, labnumber):
11991215
"Failed to add {}."
12001216
"\nResolve issue before proceeding!!".format(m)
12011217
)
1218+
return
12021219

12031220
d["repository_identifier"] = self.repository_identifier
1204-
1221+
d["load_name"] = self.load_name
12051222
if self.mode != SIMPLE:
12061223
self._make_irrad_level(ip)
12071224
d["irradiation"] = self.selected_irradiation

pychron/experiment/experiment_executor.py

+23-2
Original file line numberDiff line numberDiff line change
@@ -2120,8 +2120,18 @@ def _pre_execute_check(self, prog=None, inform=True):
21202120
(self._check_for_email_plugin, "Check For Email Plugin"),
21212121
(self._check_for_massspec_db, "Check For Mass Spec Plugin"),
21222122
(self._check_first_aliquot, "Setting Aliquot"),
2123-
(self._check_dated_repos, "Setup Dated Repositories"),
2124-
(self._check_repository_identifiers, "Check Repositories"),
2123+
(
2124+
self._check_dated_repos if self.use_dvc_persistence else None,
2125+
"Setup Dated Repositories",
2126+
),
2127+
(
2128+
(
2129+
self._check_repository_identifiers
2130+
if self.use_dvc_persistence
2131+
else None
2132+
),
2133+
"Check Repositories",
2134+
),
21252135
(self._check_managers, "Check Managers"),
21262136
(self._check_dashboard, "Check Dashboard"),
21272137
(self._check_memory, "Check Memory"),
@@ -2132,6 +2142,9 @@ def _pre_execute_check(self, prog=None, inform=True):
21322142
)
21332143

21342144
for func, msg in funcs:
2145+
if not func:
2146+
continue
2147+
21352148
self.debug("checking: {}".format(msg))
21362149
if prog:
21372150
prog.change_message(msg)
@@ -2293,6 +2306,12 @@ def _pre_run_check(self, spec, inform=False):
22932306
# db.add_repository_association(expid, c)
22942307
# self._cached_runs = []
22952308

2309+
def _check_repository_health(self, inform):
2310+
for ei in self.experiment_queues:
2311+
repos = {ai.repository_identifier for ai in ei.cleaned_automated_runs}
2312+
for ri in repos:
2313+
self.datahub.mainstore
2314+
22962315
def _check_repository_identifiers(self, inform):
22972316
db = self.datahub.mainstore.db
22982317

@@ -2359,6 +2378,8 @@ def _sync_repositories(self, prog):
23592378
prog.change_message("Syncing {}".format(e))
23602379
if not self.datahub.mainstore.sync_repo(e, use_progress=False):
23612380
return e
2381+
if not self.datahub.mainstore.is_clean(e):
2382+
return e
23622383

23632384
def _post_run_check(self, run):
23642385
"""

pychron/experiment/factory.py

+4
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,10 @@ def _update_queue(self, name, new):
232232
elif name == "extract_device":
233233
self._set_extract_device(new)
234234

235+
elif name == "load_name":
236+
# used by run factory to set repository_identifier by load_name
237+
self.run_factory.load_name = new
238+
235239
self._auto_save()
236240

237241
def _auto_save(self):

pychron/experiment/tasks/experiment_panes.py

+8-3
Original file line numberDiff line numberDiff line change
@@ -345,9 +345,14 @@ def _get_info_group(self):
345345
run_factory_name("clear_repository_identifier_button"), "clear"
346346
),
347347
UItem(
348-
run_factory_name("use_project_based_repository_identifier"),
349-
tooltip="Use repository identifier based on project name",
350-
),
348+
run_factory_name("repository_identifier_model"),
349+
tooltip='None: You must specify repository\nLoad: repository based on "load" name\nProject: '
350+
'repository based on "project" name',
351+
),
352+
# UItem(
353+
# run_factory_name("use_project_based_repository_identifier"),
354+
# tooltip="Use repository identifier based on project name",
355+
# )
351356
),
352357
HGroup(
353358
run_factory_item(

pychron/furnace/base_furnace_manager.py

+19-2
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,13 @@
1717
import time
1818

1919
from traits.api import Instance, Float, Bool, Any
20+
from traits.has_traits import on_trait_change
2021
from traits.trait_errors import TraitError
2122

2223
from pychron.extraction_line.switch_manager import SwitchManager
2324
from pychron.furnace.base_stage_manager import BaseFurnaceStageManager
2425
from pychron.graph.time_series_graph import TimeSeriesStreamStackedGraph
26+
from pychron.hardware.eurotherm.base import pid_parameters_path
2527
from pychron.managers.stream_graph_manager import StreamGraphManager
2628
from pychron.paths import paths
2729
from pychron.response_recorder import ResponseRecorder
@@ -36,6 +38,7 @@ class BaseFurnaceManager(StreamGraphManager):
3638
temperature_readback = Float
3739
output_percent_readback = Float
3840

41+
use_full_power = Bool(False)
3942
response_recorder = Instance(ResponseRecorder)
4043

4144
use_network = False
@@ -78,11 +81,18 @@ def _response_recorder_default(self):
7881
def _handle_state(self, new):
7982
pass
8083

84+
def extract(self, v, **kw):
85+
self.debug("extract")
86+
# self.response_recorder.start()
87+
self.debug("set setpoint to {}".format(v))
88+
self.setpoint = v
89+
8190
def test_furnace_api(self):
8291
self.info("testing furnace api")
8392
ret, err = False, ""
8493
if self.controller:
8594
ret, err = self.controller.test_connection()
95+
self.debug(f"testing result {ret} {err}")
8696
return ret, err
8797

8898
def test_connection(self):
@@ -130,6 +140,12 @@ def get_active_pid_parameters(self):
130140
return result
131141

132142
def set_pid_parameters(self, v):
143+
p, exists = pid_parameters_path()
144+
if not exists:
145+
self.unique_warning(
146+
f"No PID parameters file at {p}. Cannot set PID parameters"
147+
)
148+
133149
self.debug("setting pid parameters for {}".format(v))
134150
from pychron.hardware.eurotherm.base import (
135151
get_pid_parameters,
@@ -144,6 +160,7 @@ def set_pid_parameters(self, v):
144160
self._pid_str = param_str
145161
self.controller.set_pid(param_str)
146162

163+
@on_trait_change("setpoint")
147164
def set_setpoint(self, v):
148165
self.debug("set setpoint={}".format(v))
149166
self.set_pid_parameters(v)
@@ -210,9 +227,9 @@ def _update_scan(self):
210227
self.output_percent_readback = output or 0
211228

212229
setpoint = self.controller.get_setpoint(verbose=False)
213-
self._update_scan_graph(response, output, setpoint or 0)
230+
self._set_scan_graph_values(response, output, setpoint or 0)
214231

215-
def _update_scan_graph(self, response, output, setpoint):
232+
def _set_scan_graph_values(self, response, output, setpoint):
216233
x = None
217234
update = False
218235
if response is not None:

pychron/furnace/ifurnace_controller.py

+18
Original file line numberDiff line numberDiff line change
@@ -31,5 +31,23 @@ def read_setpoint(self):
3131
def set_setpoint(self, v):
3232
pass
3333

34+
def test_connection(self):
35+
pass
36+
37+
def get_process_value(self):
38+
pass
39+
40+
def get_output(self):
41+
pass
42+
43+
def set_pid(self, param_str):
44+
pass
45+
46+
# def read_temperature(self, force=False, verbose=False):
47+
# pass
48+
#
49+
# def read_output_percent(self, force=False, verbose=False):
50+
# pass
51+
3452

3553
# ============= EOF =============================================

pychron/furnace/ldeo/furnace_manager.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ def _update_scan(self):
182182
output1 * 10
183183
) # this is a voltage on a 0-10 scale
184184

185-
self._update_scan_graph(
185+
self._set_scan_graph_values(
186186
output1, temp1, 0
187187
) # not writing setpoint at moment since not implemented
188188

0 commit comments

Comments
 (0)