Skip to content

Commit a516f0d

Browse files
authored
Merge pull request #21 from itsMig/master
Modify plot_single_session() to return data, to be handled by different plotting engine (intended for D4Xgui)
2 parents e03d97b + 2b988c4 commit a516f0d

File tree

3 files changed

+45
-14
lines changed

3 files changed

+45
-14
lines changed

D47crunch/__init__.py

Lines changed: 40 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2091,6 +2091,7 @@ def plot_sessions(self, dir = 'output', figsize = (8,8), filetype = 'pdf', dpi =
20912091
sp = self.plot_single_session(session, xylimits = 'constant')
20922092
ppl.savefig(f'{dir}/D{self._4x}_plot_{session}.{filetype}', **({'dpi': dpi} if filetype.lower() == 'png' else {}))
20932093
ppl.close(sp.fig)
2094+
20942095

20952096

20962097
@make_verbal
@@ -2217,6 +2218,10 @@ def consolidate_sessions(self):
22172218
if self.standardization_method == 'pooled':
22182219
for session in self.sessions:
22192220

2221+
# different (better?) computation of D4x repeatability for each session:
2222+
sqresiduals = [(r[f'D{self._4x}'] - self.samples[r['Sample']][f'D{self._4x}'])**2 for r in self.sessions[session]['data']]
2223+
self.sessions[session][f'r_D{self._4x}'] = np.mean(sqresiduals)**.5
2224+
22202225
self.sessions[session]['a'] = self.standardization.params.valuesdict()[f'a_{pf(session)}']
22212226
i = self.standardization.var_names.index(f'a_{pf(session)}')
22222227
self.sessions[session]['SE_a'] = self.standardization.covar[i,i]**.5
@@ -2557,32 +2562,39 @@ def plot_single_session(self,
25572562
out = _SessionPlot()
25582563
anchors = [a for a in self.anchors if [r for r in self.sessions[session]['data'] if r['Sample'] == a]]
25592564
unknowns = [u for u in self.unknowns if [r for r in self.sessions[session]['data'] if r['Sample'] == u]]
2565+
anchors_d = [r[f'd{self._4x}'] for r in self.sessions[session]['data'] if r['Sample'] in self.anchors]
2566+
anchors_D = [r[f'D{self._4x}'] for r in self.sessions[session]['data'] if r['Sample'] in self.anchors]
2567+
unknowns_d = [r[f'd{self._4x}'] for r in self.sessions[session]['data'] if r['Sample'] in self.unknowns]
2568+
unknowns_D = [r[f'D{self._4x}'] for r in self.sessions[session]['data'] if r['Sample'] in self.unknowns]
2569+
anchor_avg = (np.array([ np.array([
2570+
np.min([r[f'd{self._4x}'] for r in self.sessions[session]['data'] if r['Sample'] == sample]) - 1,
2571+
np.max([r[f'd{self._4x}'] for r in self.sessions[session]['data'] if r['Sample'] == sample]) + 1
2572+
]) for sample in anchors]).T,
2573+
np.array([ np.array([0, 0]) + self.Nominal_D4x[sample] for sample in anchors]).T)
2574+
unknown_avg = (np.array([ np.array([
2575+
np.min([r[f'd{self._4x}'] for r in self.sessions[session]['data'] if r['Sample'] == sample]) - 1,
2576+
np.max([r[f'd{self._4x}'] for r in self.sessions[session]['data'] if r['Sample'] == sample]) + 1
2577+
]) for sample in unknowns]).T,
2578+
np.array([ np.array([0, 0]) + self.unknowns[sample][f'D{self._4x}'] for sample in unknowns]).T)
2579+
25602580

25612581
if fig == 'new':
25622582
out.fig = ppl.figure(figsize = (6,6))
25632583
ppl.subplots_adjust(.1,.1,.9,.9)
25642584

25652585
out.anchor_analyses, = ppl.plot(
2566-
[r[f'd{self._4x}'] for r in self.sessions[session]['data'] if r['Sample'] in self.anchors],
2567-
[r[f'D{self._4x}'] for r in self.sessions[session]['data'] if r['Sample'] in self.anchors],
2586+
anchors_d,
2587+
anchors_D,
25682588
**kw_plot_anchors)
25692589
out.unknown_analyses, = ppl.plot(
2570-
[r[f'd{self._4x}'] for r in self.sessions[session]['data'] if r['Sample'] in self.unknowns],
2571-
[r[f'D{self._4x}'] for r in self.sessions[session]['data'] if r['Sample'] in self.unknowns],
2590+
unknowns_d,
2591+
unknowns_D,
25722592
**kw_plot_unknowns)
25732593
out.anchor_avg = ppl.plot(
2574-
np.array([ np.array([
2575-
np.min([r[f'd{self._4x}'] for r in self.sessions[session]['data'] if r['Sample'] == sample]) - 1,
2576-
np.max([r[f'd{self._4x}'] for r in self.sessions[session]['data'] if r['Sample'] == sample]) + 1
2577-
]) for sample in anchors]).T,
2578-
np.array([ np.array([0, 0]) + self.Nominal_D4x[sample] for sample in anchors]).T,
2594+
*anchor_avg,
25792595
**kw_plot_anchor_avg)
25802596
out.unknown_avg = ppl.plot(
2581-
np.array([ np.array([
2582-
np.min([r[f'd{self._4x}'] for r in self.sessions[session]['data'] if r['Sample'] == sample]) - 1,
2583-
np.max([r[f'd{self._4x}'] for r in self.sessions[session]['data'] if r['Sample'] == sample]) + 1
2584-
]) for sample in unknowns]).T,
2585-
np.array([ np.array([0, 0]) + self.unknowns[sample][f'D{self._4x}'] for sample in unknowns]).T,
2597+
*unknown_avg,
25862598
**kw_plot_unknown_avg)
25872599
if xylimits == 'constant':
25882600
x = [r[f'd{self._4x}'] for r in self]
@@ -2623,6 +2635,20 @@ def plot_single_session(self,
26232635
cval = np.arange(np.ceil(SI.min() / .001) * .001, np.ceil(SI.max() / .001 + 1) * .001, cinterval)
26242636
out.contour = ppl.contour(XI, YI, SI, cval, **kw_contour_error)
26252637
out.clabel = ppl.clabel(out.contour)
2638+
contour = (XI, YI, SI, cval, cinterval)
2639+
2640+
if fig == None:
2641+
return {
2642+
'anchors':anchors,
2643+
'unknowns':unknowns,
2644+
'anchors_d':anchors_d,
2645+
'anchors_D':anchors_D,
2646+
'unknowns_d':unknowns_d,
2647+
'unknowns_D':unknowns_D,
2648+
'anchor_avg':anchor_avg,
2649+
'unknown_avg':unknown_avg,
2650+
'contour':contour,
2651+
}
26262652

26272653
ppl.xlabel(x_label)
26282654
ppl.ylabel(y_label)

changelog.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Changelog
22

3+
### Bugfix
4+
* Simpler (better?) computation of D4x repeatability at the session level when using pooled regression method.
5+
6+
37
## v2.4.0
48
*Released on 2023-10-04*
59

todo.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,4 @@
66
* improve `test_virtual_data()` to populate with non-default parameters
77
* use a true CSV parser?
88
* add (many) plot customization options to CLI?
9+
* implement individual weighing of replicates, e.g. according to the sqrt of the number of IRMS acquisitions

0 commit comments

Comments
 (0)