Calcium_Model/multiple_experiment_fitter.py

137 lines
3.8 KiB
Python

import h5py
import pandas as pd
import numpy as np
import re
import matplotlib as plt
from Model import Model
from fitter import Fitter
from Data import Data
file = "ltcc_current.h5"
dfs_by_sex_tag_spid = {}
def print_attrs(name, obj):
# print(f"\nAttributes for {name}:")
# for key, val in obj.attrs.items():
# print(f" {key}: {val}")
pass
with h5py.File(file, "r") as h5_file:
for eid in h5_file.keys():
attributes = h5_file[eid].attrs
sex = attributes.get("sex")
tag = attributes.get("tag")
spid = attributes.get("spid")
key = f"{sex}_{tag}_{spid}"
if key not in dfs_by_sex_tag_spid:
dfs_by_sex_tag_spid[key] = pd.DataFrame()
row_data = {"experiment_id": eid, "sex": sex, "tag": tag, "spid": spid}
temp_df = pd.DataFrame([row_data])
dfs_by_sex_tag_spid[key] = pd.concat(
[dfs_by_sex_tag_spid[key], temp_df], ignore_index=True
)
# for key, df in dfs_by_sex_tag_spid.items():
# print(f"DataFrame for {key}:")
# print(df)
# print()
def fit_and_plot_dataframes(dfs_by_sex_tag_spid):
for key, df in dfs_by_sex_tag_spid.items():
print(f"Fitting and plotting data for {key}...")
combined_current = []
combined_time = []
for eid in df["experiment_id"].tolist():
data = Data(file, group_key=eid)
combined_current.append(data.current)
combined_time.append(data.current_t)
combined_current = np.concatenate(combined_current)
combined_time = np.concatenate(combined_time)
# Sort by time for consistency - inspired by data
sorted_indices = np.argsort(combined_time)
combined_time = combined_time[sorted_indices]
combined_current = combined_current[sorted_indices]
combined_data = Data(file, group_key=eid)
combined_data.current = combined_current
combined_data.current_t = combined_time
fit = Fitter(Model, combined_data)
fit.optimize()
res, fig = fit.optimize()
plt.figure()
plt.title(f"Fit results for {key}")
for i, eid in enumerate(df["experiment_id"].tolist()):
plt.plot(combined_time, combined_current,
label=f"Experiment {eid}")
plt.plot(
combined_data.current_t, combined_data.current, "k-",
label="Combined Fit"
)
plt.legend()
plt.xlabel("Time")
plt.ylabel("Current")
key_cleaned = re.sub(r"[^\w.-]", "", key)
plt.savefig(f"combined_plot_{key_cleaned}.png")
plt.savefig(f"combined_plot_{key_cleaned}.pdf")
plt.close()
fit_hist = pd.DataFrame.from_dict(fit.fit_results, orient="index").T
fit_hist.index.name = "Iterations"
res_filename = f"combined_fit_results_{key}.csv"
res_filename = res_filename.replace(" ", "_").replace(":", "-")
fit_hist.to_csv(res_filename, index=True)
print(f"Finished fitting for {key}.")
fit_and_plot_dataframes(dfs_by_sex_tag_spid)
"""
def fit_data():
filename = "ltcc_current.h5"
with h5py.File(filename, "r") as h5:
eids = list(h5.keys())
for eid in eids:
data = Data(filename, group_key=eid)
fit = Fitter(Model, data)
fit.optimize()
res, fig = fit.optimize()
fit_hist = pd.DataFrame.from_dict(fit.fit_results, orient="index").T
fit_hist.index.name = "Iterations"
res_filename = f"fit_results_{eid}.csv"
res_filename = res_filename.replace(" ", "_").replace(":", "-")
fit_hist.to_csv(res_filename, index=True)
eid_cleaned = re.sub(r"[^w.-]", "", eid) # Eemaldab kõik eritähed
fig.savefig(f"plot_{eid_cleaned}.png")
fig.savefig(f"plot_{eid_cleaned}.pdf")
fit_data()
"""