Skip to content

Commit

Permalink
Merge pull request #21 from itsMig/master
Browse files Browse the repository at this point in the history
Modify plot_single_session() to return data, to be handled by different plotting engine (intended for D4Xgui)
  • Loading branch information
mdaeron authored Sep 10, 2024
2 parents e03d97b + 2b988c4 commit a516f0d
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 14 deletions.
54 changes: 40 additions & 14 deletions D47crunch/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2091,6 +2091,7 @@ def plot_sessions(self, dir = 'output', figsize = (8,8), filetype = 'pdf', dpi =
sp = self.plot_single_session(session, xylimits = 'constant')
ppl.savefig(f'{dir}/D{self._4x}_plot_{session}.{filetype}', **({'dpi': dpi} if filetype.lower() == 'png' else {}))
ppl.close(sp.fig)



@make_verbal
Expand Down Expand Up @@ -2217,6 +2218,10 @@ def consolidate_sessions(self):
if self.standardization_method == 'pooled':
for session in self.sessions:

# different (better?) computation of D4x repeatability for each session:
sqresiduals = [(r[f'D{self._4x}'] - self.samples[r['Sample']][f'D{self._4x}'])**2 for r in self.sessions[session]['data']]
self.sessions[session][f'r_D{self._4x}'] = np.mean(sqresiduals)**.5

self.sessions[session]['a'] = self.standardization.params.valuesdict()[f'a_{pf(session)}']
i = self.standardization.var_names.index(f'a_{pf(session)}')
self.sessions[session]['SE_a'] = self.standardization.covar[i,i]**.5
Expand Down Expand Up @@ -2557,32 +2562,39 @@ def plot_single_session(self,
out = _SessionPlot()
anchors = [a for a in self.anchors if [r for r in self.sessions[session]['data'] if r['Sample'] == a]]
unknowns = [u for u in self.unknowns if [r for r in self.sessions[session]['data'] if r['Sample'] == u]]
anchors_d = [r[f'd{self._4x}'] for r in self.sessions[session]['data'] if r['Sample'] in self.anchors]
anchors_D = [r[f'D{self._4x}'] for r in self.sessions[session]['data'] if r['Sample'] in self.anchors]
unknowns_d = [r[f'd{self._4x}'] for r in self.sessions[session]['data'] if r['Sample'] in self.unknowns]
unknowns_D = [r[f'D{self._4x}'] for r in self.sessions[session]['data'] if r['Sample'] in self.unknowns]
anchor_avg = (np.array([ np.array([
np.min([r[f'd{self._4x}'] for r in self.sessions[session]['data'] if r['Sample'] == sample]) - 1,
np.max([r[f'd{self._4x}'] for r in self.sessions[session]['data'] if r['Sample'] == sample]) + 1
]) for sample in anchors]).T,
np.array([ np.array([0, 0]) + self.Nominal_D4x[sample] for sample in anchors]).T)
unknown_avg = (np.array([ np.array([
np.min([r[f'd{self._4x}'] for r in self.sessions[session]['data'] if r['Sample'] == sample]) - 1,
np.max([r[f'd{self._4x}'] for r in self.sessions[session]['data'] if r['Sample'] == sample]) + 1
]) for sample in unknowns]).T,
np.array([ np.array([0, 0]) + self.unknowns[sample][f'D{self._4x}'] for sample in unknowns]).T)


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

out.anchor_analyses, = ppl.plot(
[r[f'd{self._4x}'] for r in self.sessions[session]['data'] if r['Sample'] in self.anchors],
[r[f'D{self._4x}'] for r in self.sessions[session]['data'] if r['Sample'] in self.anchors],
anchors_d,
anchors_D,
**kw_plot_anchors)
out.unknown_analyses, = ppl.plot(
[r[f'd{self._4x}'] for r in self.sessions[session]['data'] if r['Sample'] in self.unknowns],
[r[f'D{self._4x}'] for r in self.sessions[session]['data'] if r['Sample'] in self.unknowns],
unknowns_d,
unknowns_D,
**kw_plot_unknowns)
out.anchor_avg = ppl.plot(
np.array([ np.array([
np.min([r[f'd{self._4x}'] for r in self.sessions[session]['data'] if r['Sample'] == sample]) - 1,
np.max([r[f'd{self._4x}'] for r in self.sessions[session]['data'] if r['Sample'] == sample]) + 1
]) for sample in anchors]).T,
np.array([ np.array([0, 0]) + self.Nominal_D4x[sample] for sample in anchors]).T,
*anchor_avg,
**kw_plot_anchor_avg)
out.unknown_avg = ppl.plot(
np.array([ np.array([
np.min([r[f'd{self._4x}'] for r in self.sessions[session]['data'] if r['Sample'] == sample]) - 1,
np.max([r[f'd{self._4x}'] for r in self.sessions[session]['data'] if r['Sample'] == sample]) + 1
]) for sample in unknowns]).T,
np.array([ np.array([0, 0]) + self.unknowns[sample][f'D{self._4x}'] for sample in unknowns]).T,
*unknown_avg,
**kw_plot_unknown_avg)
if xylimits == 'constant':
x = [r[f'd{self._4x}'] for r in self]
Expand Down Expand Up @@ -2623,6 +2635,20 @@ def plot_single_session(self,
cval = np.arange(np.ceil(SI.min() / .001) * .001, np.ceil(SI.max() / .001 + 1) * .001, cinterval)
out.contour = ppl.contour(XI, YI, SI, cval, **kw_contour_error)
out.clabel = ppl.clabel(out.contour)
contour = (XI, YI, SI, cval, cinterval)

if fig == None:
return {
'anchors':anchors,
'unknowns':unknowns,
'anchors_d':anchors_d,
'anchors_D':anchors_D,
'unknowns_d':unknowns_d,
'unknowns_D':unknowns_D,
'anchor_avg':anchor_avg,
'unknown_avg':unknown_avg,
'contour':contour,
}

ppl.xlabel(x_label)
ppl.ylabel(y_label)
Expand Down
4 changes: 4 additions & 0 deletions changelog.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# Changelog

### Bugfix
* Simpler (better?) computation of D4x repeatability at the session level when using pooled regression method.


## v2.4.0
*Released on 2023-10-04*

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

0 comments on commit a516f0d

Please sign in to comment.