Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions copy_export_config
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#!/bin/bash

# If this is in a directory with a directory called "original_data" containing your data and an example export_config.py file called "export_config.py", it will copy export_config.py into each directory in original_data and change the EXPERIMENT_NAME to match the name of the directory.

for dir in original_data/*/
do
cp export_config.py $dir
dirname=${dir%*/}
strrep="s/EXPERIMENT_NAME/${dir#*/}"
sed -i $strrep "${dir}${exportfile}"
done
145 changes: 57 additions & 88 deletions pcpostprocess/scripts/run_herg_qc.py
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,9 @@ def main():
sys.modules['export_config'] = export_config
spec.loader.exec_module(export_config)

data_list = os.listdir(args.data_directory)
export_config.D2S_QC = {x: y for x, y in export_config.D2S_QC.items() if
any([x == '_'.join(z.split('_')[:-1]) for z in data_list])}
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this should work fine. But this could throw an error if the files aren't set out properly. Maybe we should just check that there is at least one "_" in all of these files. I think it's mostly safe to assume that the data folders will be formatted correctly, but there's nothing stopping someone from dragging any other sort of file in there!

export_config.savedir = args.output_dir

args.saveID = export_config.saveID
Expand Down Expand Up @@ -257,13 +260,13 @@ def main():
times = sorted(res_dict[protocol])
savename = combined_dict[protocol]

readnames.append(protocol)

if len(times) == 2:
readnames.append(protocol)
savenames.append(savename)
times_list.append(times)

elif len(times) == 4:
readnames.append(protocol)
savenames.append(savename)
times_list.append(times[::2])

Expand All @@ -277,6 +280,7 @@ def main():
wells_to_export = wells if args.export_failed else overall_selection

logging.info(f"exporting wells {wells}")
logging.info(f"overall selection {overall_selection}")

no_protocols = len(res_dict)

Expand Down Expand Up @@ -628,26 +632,20 @@ def extract_protocol(readname, savename, time_strs, selected_wells, args):
row_dict['Cm'] = qc_vals[1]
row_dict['Rseries'] = qc_vals[2]

before_params, before_leak = fit_linear_leak(before_current[sweep, :],
voltages, times,
*ramp_bounds,
output_dir=out_dir,
save_fname=f"{well}_sweep{sweep}.png"
)
before_params, before_leak = fit_linear_leak(
before_current[sweep, :], voltages, times, *ramp_bounds,
output_dir=out_dir, save_fname=f"{well}_sweep{sweep}.png")

before_leak_currents.append(before_leak)

out_dir = os.path.join(savedir,
f"{saveID}-{savename}-leak_fit-after")
out_dir = os.path.join(savedir, f"{saveID}-{savename}-leak_fit-after")
# Convert linear regression parameters into conductance and reversal
row_dict['gleak_before'] = before_params[1]
row_dict['E_leak_before'] = -before_params[0] / before_params[1]

after_params, after_leak = fit_linear_leak(after_current[sweep, :],
voltages, times,
*ramp_bounds,
save_fname=f"{well}_sweep{sweep}.png",
output_dir=out_dir)
after_params, after_leak = fit_linear_leak(
after_current[sweep, :], voltages, times, *ramp_bounds,
save_fname=f"{well}_sweep{sweep}.png", output_dir=out_dir)

after_leak_currents.append(after_leak)

Expand All @@ -660,24 +658,20 @@ def extract_protocol(readname, savename, time_strs, selected_wells, args):
after_corrected = after_current[sweep, :] - after_leak
before_corrected = before_current[sweep, :] - before_leak

E_rev_before = infer_reversal_potential(before_corrected, times,
desc, voltages, plot=True,
output_path=os.path.join(reversal_plot_dir,
f"{well}_{savename}_sweep{sweep}_before"),
known_Erev=args.Erev)

E_rev_after = infer_reversal_potential(after_corrected, times,
desc, voltages,
plot=True,
output_path=os.path.join(reversal_plot_dir,
f"{well}_{savename}_sweep{sweep}_after"),
known_Erev=args.Erev)

E_rev = infer_reversal_potential(subtracted_trace, times, desc,
voltages, plot=True,
output_path=os.path.join(reversal_plot_dir,
f"{well}_{savename}_sweep{sweep}_subtracted"),
known_Erev=args.Erev)
E_rev_before = infer_reversal_potential(
before_corrected, times, desc, voltages, plot=True,
output_path=os.path.join(reversal_plot_dir, f"{well}_{savename}_sweep{sweep}_before.png"),
known_Erev=args.Erev)

E_rev_after = infer_reversal_potential(
after_corrected, times, desc, voltages, plot=True,
output_path=os.path.join(reversal_plot_dir, f"{well}_{savename}_sweep{sweep}_after.png"),
known_Erev=args.Erev)

E_rev = infer_reversal_potential(
subtracted_trace, times, desc, voltages, plot=True,
output_path=os.path.join(reversal_plot_dir, f"{well}_{savename}_sweep{sweep}_subtracted.png"),
known_Erev=args.Erev)

row_dict['R_leftover'] =\
np.sqrt(np.sum((after_corrected)**2)/(np.sum(before_corrected**2)))
Expand Down Expand Up @@ -732,8 +726,8 @@ def extract_protocol(readname, savename, time_strs, selected_wells, args):
row_dict['QC4'] = all([x for x, _ in qc4])

if args.output_traces:
out_fname = os.path.join(traces_dir,
f"{saveID}-{savename}-{well}-sweep{sweep}-subtracted.csv")
out_fname = os.path.join(
traces_dir, f"{saveID}-{savename}-{well}-sweep{sweep}-subtracted.csv")

np.savetxt(out_fname, subtracted_trace.flatten())
rows.append(row_dict)
Expand All @@ -746,13 +740,11 @@ def extract_protocol(readname, savename, time_strs, selected_wells, args):
t_step = times[1] - times[0]
row_dict['total before-drug flux'] = np.sum(current) * (1.0 / t_step)
res = \
get_time_constant_of_first_decay(subtracted_trace, times, desc,
args=args,
output_path=os.path.join(args.output_dir,
'debug',
'-120mV time constant',
f"{savename}-{well}-sweep"
"{sweep}-time-constant-fit.pdf"))
get_time_constant_of_first_decay(
subtracted_trace, times, desc, args=args,
output_path=os.path.join(
args.output_dir, 'debug', '-120mV time constant',
f"{savename}-{well}-sweep{sweep}-time-constant-fit.pdf"))

row_dict['-120mV decay time constant 1'] = res[0][0]
row_dict['-120mV decay time constant 2'] = res[0][1]
Expand Down Expand Up @@ -789,8 +781,8 @@ def extract_protocol(readname, savename, time_strs, selected_wells, args):
voltages, ramp_bounds, well=well,
protocol=savename)

fig.savefig(os.path.join(subtraction_plots_dir,
f"{saveID}-{savename}-{well}-sweep{sweep}-subtraction"))
fig.savefig(os.path.join(
subtraction_plots_dir, f"{saveID}-{savename}-{well}-sweep{sweep}-subtraction"))
fig.clf()

plt.close(fig)
Expand Down Expand Up @@ -910,19 +902,15 @@ def run_qc_for_protocol(readname, savename, time_strs, args):
before_raw = np.array(raw_before_all[well])[sweep, :]
after_raw = np.array(raw_after_all[well])[sweep, :]

before_params1, before_leak = fit_linear_leak(before_raw,
voltage,
times,
*ramp_bounds,
save_fname=f"{well}-sweep{sweep}-before.png",
output_dir=savedir)
before_params1, before_leak = fit_linear_leak(
before_raw, voltage, times, *ramp_bounds,
save_fname=f"{well}-sweep{sweep}-before.png",
output_dir=savedir)

after_params1, after_leak = fit_linear_leak(after_raw,
voltage,
times,
*ramp_bounds,
save_fname=f"{well}-sweep{sweep}-after.png",
output_dir=savedir)
after_params1, after_leak = fit_linear_leak(
after_raw, voltage, times, *ramp_bounds,
save_fname=f"{well}-sweep{sweep}-after.png",
output_dir=savedir)

before_currents_corrected[sweep, :] = before_raw - before_leak
after_currents_corrected[sweep, :] = after_raw - after_leak
Expand Down Expand Up @@ -1062,26 +1050,15 @@ def qc3_bookend(readname, savename, time_strs, args):
save_fname = f"{well}_{savename}_before0.pdf"

#  Plot subtraction
get_leak_corrected(first_before_current,
voltage, times,
*ramp_bounds,
save_fname=save_fname,
output_dir=output_directory)

before_traces_first[well] = get_leak_corrected(first_before_current,
voltage, times,
*ramp_bounds)

before_traces_last[well] = get_leak_corrected(last_before_current,
voltage, times,
*ramp_bounds)

after_traces_first[well] = get_leak_corrected(first_after_current,
voltage, times,
*ramp_bounds)
after_traces_last[well] = get_leak_corrected(last_after_current,
voltage, times,
*ramp_bounds)
before_traces_first[well] = get_leak_corrected(
first_before_current, voltage, times, *ramp_bounds,
save_fname=save_fname, output_dir=output_directory)
before_traces_last[well] = get_leak_corrected(
last_before_current, voltage, times, *ramp_bounds)
after_traces_first[well] = get_leak_corrected(
first_after_current, voltage, times, *ramp_bounds)
after_traces_last[well] = get_leak_corrected(
last_after_current, voltage, times, *ramp_bounds)

# Store subtracted traces
first_processed[well] = before_traces_first[well] - after_traces_first[well]
Expand All @@ -1104,21 +1081,13 @@ def qc3_bookend(readname, savename, time_strs, args):
ax = fig.subplots()
for well in args.wells:
trace1 = hergqc.filter_capacitive_spikes(
first_processed[well], times, voltage_steps
).flatten()

first_processed[well], times, voltage_steps).flatten()
trace2 = hergqc.filter_capacitive_spikes(
last_processed[well], times, voltage_steps
).flatten()

last_processed[well], times, voltage_steps).flatten()
passed = hergqc.qc3(trace1, trace2)[0]

res_dict[well] = passed

save_fname = os.path.join(args.output_dir,
'debug',
f"debug_{well}_{savename}",
'qc3_bookend')
save_fname = os.path.join(
args.output_dir, 'debug', f"debug_{well}_{savename}", 'qc3_bookend')

ax.plot(times, trace1)
ax.plot(times, trace2)
Expand Down
Loading