OSCR

Persistently Increased Expression of PKMzeta and Unbiased Gene Expression Profiles Identify Hippocampal Molecular Traces of a Long-Term Active Place Avoidance Memory and "Shadow" Proteins.

Code ↔ Paper

9 matches between paragraphs of the paper and lines of its authors' code, computed by the harvester (lexical-v1). Click a colored paragraph or line to see its counterpart.

The 9 matches
  1. [1] § Methods › Statistical Analyses ↔ codes/04.01.new_method.py, lines 1075–1138 · score 0.83 · silhouette_score, intra cluster, CAP matrices, NetworkX, MCL, inflation
  2. [2] § Methods › The Active Place Avoidance Task ↔ codes/01.behavior_analysis.py, lines 451–471 · score 0.75 · shock zone, Conflict Yoked, Conflict Trained, Standard Yoked, Standard Trained, retested
  3. [3] § Results › Experiment 2 – Transcriptional Profiling of Memory › Shadow Proteins: Differential Gene Expression Does Not Identify PKMζ and Related Proteins in Long‐term Memory Persistence ↔ codes/02.DEG_analysis.R, lines 486–551 · score 0.72 · Camk2a, candidate genes, Fosl2, translation, Gria2, Gria1
  4. [4] § Results › Experiment 2 – Transcriptional Profiling of Memory › Shadow Proteins: Differential Gene Expression Does Not Identify PKMζ and Related Proteins in Long‐term Memory Persistence ↔ codes/04.01.new_method.py, lines 1469–1546 · score 0.70 · Camk2a, Y0, Y2, Fosl2, Gria2, Gria1
  5. [5] § Results › Experiment 2 – Transcriptional Profiling of Memory › Characterizing Memory‐related Behavior ↔ codes/01.behavior_analysis.py, lines 451–471 · score 0.68 · Time1stEntr, pTimeShockZone, NumEntrances, conflict training, behavior, treatment
  6. [6] § Results › Experiment 2 – Transcriptional Profiling of Memory › Characterizing Memory‐related Behavior ↔ codes/01.behavior_analysis.py, lines 181–210 · score 0.61 · conflict yoked, Conflict trained, standard yoked, Standard trained, Rt, retest
  7. [7] § Methods › Statistical Analyses ↔ codes/01.behavior_analysis.py, lines 498–527 · score 0.55 · way ANOVAs, conflict trained, v1, phase, treatment, retention
  8. [8] § Results › Experiment 2 – Transcriptional Profiling of Memory › Spatial Memory Drives Hippocampal‐subfield Specific Patterns of Transcriptome Variation ↔ codes/02.DEG_analysis.R, lines 486–551 · score 0.51 · candidate genes, Gria2, Grin1, synapses, Gria1, Prkcb
  9. [9] § Results › Experiment 2 – Transcriptional Profiling of Memory › Shadow Proteins: Differential Gene Expression Does Not Identify PKMζ and Related Proteins in Long‐term Memory Persistence ↔ codes/04.01.new_method.py, lines 1469–1546 · score 0.51 · graph, edges, weighted, Grin1, Gria1, Prkcb

Paper

Loaded from Europe PMC by your browser, not stored by OSCR: doi.org · Europe PMC

The paper is loaded when this pane is shown.

The authors' code

Python · 719 lines · 26 KB · no license · 4 matches

  1. import pandas as pd
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. from matplotlib import rcParams
  5. from tqdm import tqdm
  6. import copy
  7. import seaborn as sns
  8. from sklearn import decomposition
  9. PCA = decomposition.PCA
  10. import scipy.stats as stats
  11. datapath = './data/'
  12. plotpath = './figures/'
  13. # for pdf saving, text to vector
  14. rcParams['pdf.fonttype'] = 42
  15. rcParams['ps.fonttype'] = 42 # In case of saving as eps
  16. # Arial font as default sans-serif font
  17. rcParams['font.family'] = 'sans-serif'
  18. rcParams['font.sans-serif'] = ['Arial']
  19. # facor levels
  20. levelstreatment = ['standard.yoked' , 'standard.trained' ,
  21. 'conflict.yoked' , 'conflict.trained' ]
  22. levelstreatmentlegend = ['standard yoked' , 'standard trained' ,
  23. 'conflict yoked' , 'conflict trained' ]
  24. levelstraining = ["yoked", "trained"]
  25. levelssubfield = ["DG", "CA3", "CA1"]
  26. treatment_names = dict({
  27. 'standard.yoked' : "standard yoked",
  28. 'standard.trained' :"standard trained",
  29. 'conflict.yoked' : "conflict yoked",
  30. 'conflict.trained' : "conflict trained"
  31. })
  32. treatmentcolors = dict({ "standard.yoked" : "#404040",
  33. "standard.trained" : "#ca0020",
  34. "conflict.yoked" : "#969696",
  35. "conflict.trained" : "#f4a582"})
  36. colorvalsubfield = dict({"DG" : "#d95f02",
  37. "CA3" : "#1b9e77",
  38. "CA1" : "#7570b3"})
  39. trainingcolors = dict({"trained" : "darkred",
  40. "yoked" : "black"})
  41. allcolors = copy.deepcopy(treatmentcolors)
  42. allcolors.update(colorvalsubfield)
  43. allcolors.update(trainingcolors)
  44. allcolors['NS'] = "#d9d9d9"
  45. colData = pd.read_csv(datapath+ "00_colData.csv")
  46. behavior = pd.read_csv(datapath + '00_behaviordata.csv')
  47. behavior['trial'] = ['Pre' if a == 'Hab' else a for a in list(behavior['trial'])]
  48. behavior[behavior.trial =='Pre'].groupby('treatment').count()
  49. trialnameandnumber = behavior[['trial','trialNum']].drop_duplicates()
  50. dfshocks = (
  51. behavior.groupby(['treatment', 'trial', 'trialNum'], as_index=False)
  52. .agg(
  53. m=('NumShock', lambda x: np.around(np.mean(x), 2)), # get the average
  54. se=('NumShock', lambda x: np.around(np.std(x, ddof=1) / np.sqrt(len(x)),2)) # standard deviation
  55. )
  56. .assign(measure="NumShock") # to new column
  57. )
  58. # New naming
  59. groups = ['standard.yoked', 'standard.trained', 'conflict.yoked', 'conflict.trained']
  60. colors = [treatmentcolors[a] for a in dfshocks['treatment']]
  61. dfshocks['treatment_col'] = colors
  62. reorders = ['Pre','T1','T2','T3','Retest','T4_C1','T5_C2', 'T6_C3', 'Retention']
  63. dfshocks_save = copy.deepcopy(dfshocks)
  64. dfshocks_save['treatment'] = pd.Categorical(dfshocks_save['treatment'], groups)
  65. dfshocks_save['trial'] = pd.Categorical(dfshocks_save['trial'], reorders)
  66. dfshocks_save = dfshocks_save.sort_values(['treatment','trial'])
  67. dfshocks_save = dfshocks_save.reset_index(drop = True)
  68. dfshocks_save[['treatment','trial','trialNum','m','se']].to_csv(datapath + '01.behav_table_stat.csv')
  69. # Plot for behavioral traits
  70. fig1, axes = plt.subplots(nrows=4, ncols=1, figsize=(7, 10))
  71. axes = axes.flatten()
  72. for i, treatment in enumerate(groups):
  73. subset = dfshocks[dfshocks["treatment"] == treatment]
  74. subset['trial'] = pd.Categorical(subset['trial'], categories=reorders, ordered=True)
  75. subset = subset.sort_values('trial')
  76. subset = subset.reset_index(drop=True)
  77. axes[i].plot(subset["trial"], subset["m"], label=treatment,
  78. color=treatmentcolors[treatment], linewidth=3)
  79. #for _, row in subset.iterrows():
  80. # axes[i].errorbar(row["trial"], row["m"], yerr=row["se"], fmt="none",
  81. # color=treatmentcolors[row["treatment"]], capsize=2, linewidth=0.8)
  82. for _, row in subset.iterrows():
  83. axes[i].text(row["trial"], row["m"] + 1, f"{int(np.around(row['m']))}",
  84. ha='center', va='bottom', fontsize=14, color=treatmentcolors[row["treatment"]])
  85. #
  86. axes[i].set_xticklabels(["P", "T1", "T2", "T3", "Rt", "T4", "T5", "T6", "Rn"])
  87. axes[i].set_yticks([])
  88. axes[i].set_ylim(0, max(subset.m) + 3)
  89. axes[i].set_ylabel("")
  90. axes[i].set_xlabel("")
  91. axes[i].set_title(treatment.replace('.', ' '), loc = 'left')
  92. axes[i].spines['top'].set_visible(False)
  93. axes[i].spines['right'].set_visible(False)
  94. axes[i].spines['bottom'].set_visible(False)
  95. axes[3].spines['bottom'].set_visible(True) # additional edition for the last plot
  96. fig1.suptitle("Number of Shocks", fontsize=14, x=0.02, y=0.5, rotation=90, va='center')
  97. plt.tight_layout()
  98. plt.savefig(plotpath + '01.bhv_shock.png', dpi = 300)
  99. plt.savefig(plotpath + '01.bhv_shock.pdf', dpi = 300, bbox_inches='tight')
  100. plt.savefig(plotpath + '01.bhv_shock.tiff', dpi = 300, bbox_inches='tight')
  101. plt.savefig(plotpath + '01.bhv_shock.eps', dpi = 300, bbox_inches='tight')
  102. plt.close()
  103. # Get PCA result from behavioral data
  104. behavior['train_col'] = [trainingcolors[a] for a in list(behavior['training'])]
  105. behavior['treat_col'] = [treatmentcolors[a] for a in list(behavior['treatment'])]
  106. ind_a = list(behavior.columns).index('TotalPath')
  107. ind_b = list(behavior.columns).index('ShockPerEntrance')
  108. behav_columns = list(behavior.columns)[ind_a : ind_b+1]
  109. def makepcadf (behav_table) :
  110. Z = behav_table[behav_columns]
  111. Z = Z.loc[:, Z.var(skipna=True) != 0]
  112. Z_scaled = (Z - Z.mean()) / Z.std()
  113. pca = PCA(n_components=2)
  114. principal_components = pca.fit_transform(Z_scaled)
  115. PC1_ratio = pca.explained_variance_ratio_[0]
  116. PC2_ratio = pca.explained_variance_ratio_[1]
  117. pc_df = pd.DataFrame(principal_components)
  118. pc_df.columns = ['PC1','PC2']
  119. pc_df['ID'] = list(behav_table['ID'])
  120. pc_df['treatment'] = list(behav_table['treatment'])
  121. pc_df['training'] = list(behav_table['training'])
  122. pc_df['trialNum'] = list(behav_table['trialNum'])
  123. pc_df['Day'] = list(behav_table['Day'])
  124. return pc_df, PC1_ratio, PC2_ratio
  125. pca_total = makepcadf(behavior)
  126. pca_T3_all = makepcadf(behavior[behavior.trial=='T3'])
  127. pca_T3_std = makepcadf(behavior[(behavior.trial=='T3') & (behavior.treatment.isin(['standard.yoked','standard.trained']))])
  128. pca_T3_cft = makepcadf(behavior[(behavior.trial=='T3') & (behavior.treatment.isin(['conflict.yoked','conflict.trained']))])
  129. pca_Rt_all = makepcadf(behavior[behavior.trial=='Retest'])
  130. pca_Rt_std = makepcadf(behavior[(behavior.trial=='Retest') & (behavior.treatment.isin(['standard.yoked','standard.trained']))])
  131. pca_Rt_cft = makepcadf(behavior[(behavior.trial=='Retest') & (behavior.treatment.isin(['conflict.yoked','conflict.trained']))])
  132. pca_T3Rt_all = makepcadf(behavior[behavior.trial.isin(['T3','Retest'])])
  133. pca_T3Rt_std = makepcadf(behavior[(behavior.trial.isin(['T3','Retest'])) & (behavior.treatment.isin(['standard.yoked','standard.trained']))])
  134. pca_T3Rt_cft = makepcadf(behavior[(behavior.trial.isin(['T3','Retest'])) & (behavior.treatment.isin(['conflict.yoked','conflict.trained']))])
  135. pca_T6_all = makepcadf(behavior[behavior.trial=='T6_C3'])
  136. pca_T6_std = makepcadf(behavior[(behavior.trial=='T6_C3') & (behavior.treatment.isin(['standard.yoked','standard.trained']))])
  137. pca_T6_cft = makepcadf(behavior[(behavior.trial=='T6_C3') & (behavior.treatment.isin(['conflict.yoked','conflict.trained']))])
  138. pca_Rn_all = makepcadf(behavior[behavior.trial=='Retention'])
  139. pca_Rn_std = makepcadf(behavior[(behavior.trial=='Retention') & (behavior.treatment.isin(['standard.yoked','standard.trained']))])
  140. pca_Rn_cft = makepcadf(behavior[(behavior.trial=='Retention') & (behavior.treatment.isin(['conflict.yoked','conflict.trained']))])
  141. pca_T6Rn_all = makepcadf(behavior[behavior.trial.isin(['T6_C3','Retention'])])
  142. pca_T6Rn_std = makepcadf(behavior[(behavior.trial.isin(['T6_C3','Retention'])) & (behavior.treatment.isin(['standard.yoked','standard.trained']))])
  143. pca_T6Rn_cft = makepcadf(behavior[(behavior.trial.isin(['T6_C3','Retention'])) & (behavior.treatment.isin(['conflict.yoked','conflict.trained']))])
  144. this_pca_list = [pca_T3_all ,pca_T3_std ,pca_T3_cft ,pca_Rt_all ,pca_Rt_std ,pca_Rt_cft ,pca_T3Rt_all ,pca_T3Rt_std ,pca_T3Rt_cft ,pca_T6_all ,pca_T6_std ,pca_T6_cft ,pca_Rn_all ,pca_Rn_std ,pca_Rn_cft ,pca_T6Rn_all ,pca_T6Rn_std ,pca_T6Rn_cft ]
  145. title_list = ["T3.all","T3.std","T3.cft","Rt.all","Rt.std","Rt.cft","T3Rt.all","T3Rt.std","T3Rt.cft","T6.all","T6.std","T6.cft","Rn.all","Rn.std","Rn.cft","T6Rn.all","T6Rn.std","T6Rn.cft"]
  146. index_num = sum([[b+6*a for a in range(3)] for b in range(6)], [])
  147. # Original total used pc
  148. fig1, axes = plt.subplots(nrows=1, ncols=1, figsize=(3, 3))
  149. my_pca, pc1_perc, pc2_perc = pca_total
  150. sns.scatterplot(x='PC1', y='PC2', data=my_pca, ax = axes,
  151. hue = 'treatment', palette = treatmentcolors,
  152. s = 30, legend = False)
  153. axes.set_ylabel('PC2 : {}%'.format(round(pc2_perc*100, 1)))
  154. axes.set_xlabel('PC1 : {}%'.format(round(pc1_perc*100, 1)))
  155. axes.set_xticklabels('')
  156. axes.set_yticklabels('')
  157. plt.tight_layout()
  158. plt.savefig(plotpath+'01.PC_original.png', dpi = 300)
  159. plt.savefig(plotpath+'01.PC_original.pdf', dpi = 300)
  160. plt.savefig(plotpath+'01.PC_original.tiff', dpi = 300)
  161. plt.savefig(plotpath+'01.PC_original.eps', dpi = 300)
  162. plt.close()
  163. # Get total PC figures
  164. fig1, axes = plt.subplots(nrows=3, ncols=6, figsize=(18, 9))
  165. axes = axes.flatten()
  166. for i in range(18):
  167. my_pca, pc1_perc, pc2_perc = this_pca_list[i]
  168. my_title = title_list[i]
  169. index = index_num[i]
  170. sns.scatterplot(x='PC1', y='PC2', data=my_pca, ax = axes[index],
  171. hue = 'treatment', palette = treatmentcolors,
  172. size = 30, legend = False)
  173. axes[index].set_ylabel('PC2 : {}%'.format(round(pc2_perc*100, 1)))
  174. axes[index].set_xlabel('PC1 : {}%'.format(round(pc1_perc*100, 1)))
  175. axes[index].set_title(my_title, loc = 'left')
  176. axes[index].set_xticklabels('')
  177. axes[index].set_yticklabels('')
  178. plt.tight_layout()
  179. plt.savefig(plotpath+'01.PC_series.png', dpi = 300)
  180. plt.savefig(plotpath+'01.PC_series.pdf', dpi = 300)
  181. plt.savefig(plotpath+'01.PC_series.tiff', dpi = 300)
  182. plt.savefig(plotpath+'01.PC_series.eps', dpi = 300)
  183. plt.close()
  184. ##### Use the best one which covers the most #####
  185. pca_Rn_behav = behavior[behavior.trial=='Retention']
  186. Z = pca_Rn_behav[behav_columns]
  187. Z = Z.loc[:, Z.var(skipna=True) != 0]
  188. Z_scaled = (Z - Z.mean()) / Z.std()
  189. pca = PCA(n_components=2)
  190. principal_components = pca.fit_transform(Z_scaled)
  191. PC1_ratio = pca.explained_variance_ratio_[0]
  192. PC2_ratio = pca.explained_variance_ratio_[1]
  193. pc_df = pd.DataFrame(principal_components)
  194. pc_df.columns = ['PC1','PC2']
  195. pc_df['ID'] = list(pca_Rn_behav['ID'])
  196. pc_df['treatment'] = list(pca_Rn_behav['treatment'])
  197. pc_df['training'] = list(pca_Rn_behav['training'])
  198. pc_df['trialNum'] = list(pca_Rn_behav['trialNum'])
  199. pc_df['Day'] = list(pca_Rn_behav['Day'])
  200. pc1_res = pca.components_[0]
  201. pc2_res = pca.components_[1]
  202. contribution_percentage_pc1 = (pc1_res**2) / np.sum(pc1_res**2) * 100
  203. contribution_percentage_pc2 = (pc2_res**2) / np.sum(pc2_res**2) * 100
  204. PC1_feature_perc = pd.DataFrame({
  205. 'behav' : list(Z.columns),
  206. 'percent' : contribution_percentage_pc1 })
  207. PC1_feature_perc = PC1_feature_perc.sort_values('percent', ascending = False)
  208. PC2_feature_perc = pd.DataFrame({
  209. 'behav' : list(Z.columns),
  210. 'percent' : contribution_percentage_pc2 })
  211. PC2_feature_perc = PC2_feature_perc.sort_values('percent', ascending = False)
  212. # check t-test within PC
  213. PC1_t = stats.ttest_ind(pc_df[pc_df.training=='trained']['PC1'] , pc_df[pc_df.training=='yoked']['PC1'])
  214. PC2_t = stats.ttest_ind(pc_df[pc_df.training=='trained']['PC2'] , pc_df[pc_df.training=='yoked']['PC2'])
  215. print(np.round(PC1_t, 4))
  216. print(np.round(PC2_t, 4))
  217. # Make figure
  218. def plot_behavior_feature(ax, titi, varname, namestr, ylims):
  219. df = (behavior.groupby(['treatment', 'trial', 'trialNum'])
  220. .agg(
  221. m=(varname, 'mean'),
  222. se=(varname, lambda x: np.std(x, ddof=1) / np.sqrt(len(x))) # 표준 오차
  223. )
  224. .reset_index())
  225. df['measure'] = varname
  226. #print(dfa.describe())
  227. for treatment, group in df.groupby('treatment'):
  228. color = treatmentcolors[treatment] # 색상 가져오기
  229. ax.errorbar(group['trialNum'], group['m'], yerr=group['se'], fmt='o',
  230. label=treatment, capsize=3, markersize=4, color=color) # color 매개변수 추가
  231. sns.lineplot(data=group, x='trialNum', y='m', ax=ax, color=color, legend=None)
  232. sns.scatterplot(data=group, x='trialNum', y='m', ax=ax, s=30, color=color, legend=None)
  233. #
  234. ax.set_ylabel(namestr, fontsize = 8)
  235. ax.set_xlabel("")
  236. ax.set_xticks(list(range(1,10)))
  237. ax.set_xticklabels(["P", "T1", "T2", "T3", "Rt", "T4", "T5", "T6", "Rn"], fontsize = 8)
  238. ax.set_yticks(ax.get_yticks())
  239. ax.set_yticklabels(ax.get_yticklabels(), fontsize = 8)
  240. ax.set_ylim(ylims)
  241. ax.set_title(titi, fontsize= 12, loc = 'left')
  242. ax.spines['top'].set_visible(False)
  243. ax.spines['right'].set_visible(False)
  244. #return ax, df
  245. fig, axes = plt.subplots(nrows=2, ncols=3, figsize=(7, 5))
  246. plot_behavior_feature(axes[0][0], 'a', 'NumEntrances', 'NumEntrances' , [0, 35])
  247. plot_behavior_feature(axes[0][1], 'b','Time1stEntr', 'Time1stEntr (min)' , [0, 400])
  248. plot_behavior_feature(axes[0][2], 'c','pTimeShockZone', 'pTimeShockZone' , [0, 0.35])
  249. pc_df['treat_col'] = [treatmentcolors[a] for a in list(pc_df.treatment)]
  250. sns.scatterplot(
  251. x='PC1', y='PC2', data=pc_df,
  252. ax=axes[1][0], hue='treatment',
  253. palette=treatmentcolors,
  254. s=80 , alpha = 1, legend = False )
  255. axes[1][0].set_ylabel('PC2 : {}% variance explained'.format(round(PC2_ratio*100, 1)), fontsize= 8)
  256. axes[1][0].set_xlabel('PC1 : {}% variance explained'.format(round(PC1_ratio*100, 1)), fontsize= 8)
  257. axes[1][0].set_xticklabels('')
  258. axes[1][0].set_yticklabels('')
  259. axes[1][0].set_title('d', fontsize = 12, loc = 'left')
  260. sns.barplot(
  261. y = 'percent', x = 'behav',
  262. data = PC1_feature_perc.iloc[0:8],
  263. ax = axes[1][1]
  264. )
  265. axes[1][1].set_xlabel('Estimates of memory', fontsize= 8)
  266. axes[1][1].set_ylabel('PC1 % contrib.', fontsize= 8)
  267. axes[1][1].set_xticks(list(range(8)))
  268. axes[1][1].set_yticks([0,2,4,6,8])
  269. axes[1][1].set_xticklabels(axes[1][1].get_xticklabels(), ha='right', fontsize = 8, rotation = 45)
  270. axes[1][1].set_yticklabels(axes[1][1].get_yticklabels(),fontsize = 8)
  271. axes[1][1].set_title('e', fontsize = 12, loc = 'left')
  272. for spine in axes[1][1].spines.values():
  273. spine.set_visible(False)
  274. sns.barplot(
  275. y = 'percent', x = 'behav',
  276. data = PC2_feature_perc.iloc[0:8],
  277. ax = axes[1][2]
  278. )
  279. axes[1][2].set_xlabel('Estimates of activity' , fontsize= 8)
  280. axes[1][2].set_ylabel('PC2 % contrib.', fontsize= 8)
  281. axes[1][2].set_xticks(list(range(8)))
  282. axes[1][2].set_yticks([0,5,10,15,20])
  283. axes[1][2].set_xticklabels(axes[1][2].get_xticklabels(), ha='right', fontsize = 8, rotation = 45)
  284. axes[1][2].set_yticklabels(axes[1][2].get_yticklabels(),fontsize = 8)
  285. axes[1][2].set_title('f', fontsize = 12, loc = 'left')
  286. for spine in axes[1][2].spines.values():
  287. spine.set_visible(False)
  288. plt.tight_layout()
  289. plt.savefig(plotpath + '01.behav_bar.pdf', dpi = 300)
  290. plt.savefig(plotpath + '01.behav_bar.png', dpi = 300)
  291. plt.savefig(plotpath + '01.behav_bar.tiff', dpi = 300)
  292. plt.savefig(plotpath + '01.behav_bar.eps', dpi = 300) # alpha problem
  293. plt.close()
  294. # Now all the stats for supplementary materials
  295. #-----------------
  296. # Maybe it should be done like this:
  297. # Q1: are the groups different? 1-way ANOVA of groups on Pre
  298. # Q2: are the groups different during initial training T1-T3? 2-way ANOVA of groups X trial
  299. # Q3: do the groups differ in initial recall? 1-way ANOVA of groups on Rt
  300. # Q4: Do the groups differ in subsequent training? T4-T6 2-way ANOVA of groups X trial
  301. # Q5: do the groups differ in subsequent recall? 1-way ANOVA of groups on Rn
  302. import pandas as pd
  303. import statsmodels.api as sm
  304. from scipy import stats
  305. from statsmodels.formula.api import ols
  306. def run_anova_v1(be_for_ano, trial_filter, formulas):
  307. results = []
  308. trial_phase = be_for_ano[be_for_ano['trial'].isin(trial_filter)]
  309. trial_phase['treatment'] = pd.Categorical(trial_phase['treatment'])
  310. trial_phase['trial'] = pd.Categorical(trial_phase['trial'], categories = trial_filter)
  311. for name, formula in formulas.items():
  312. model = ols(formula, data=trial_phase).fit()
  313. anova_result = sm.stats.anova_lm(model, typ=2)
  314. anova_result['name'] = name
  315. results.append(anova_result)
  316. combined_result = pd.concat(results)
  317. combined_result['trial'] = '_'.join(trial_filter)
  318. print(combined_result)
  319. return combined_result.drop('Residual', axis=0)
  320. # Format and annotate tables
  321. def format_anova_table(table):
  322. table['p'] = round(table['PR(>F)'], 3)
  323. table['F'] = round(table['F'], 2)
  324. table['df'] = table['df'].astype(int)
  325. table['sig'] = ['***' if p < 0.001 else '**' if p < 0.01 else '*' if p < 0.05 else ' ' for p in table['p']]
  326. return table
  327. # Define the models and phases
  328. formulas_single = {
  329. 'NumEntrances ~ treatment': 'NumEntrances ~ C(treatment)',
  330. 'pTimeShockZone ~ treatment': 'pTimeShockZone ~ C(treatment)',
  331. 'Time1stEntr ~ treatment': 'Time1stEntr ~ C(treatment)'
  332. }
  333. formulas_double = {
  334. 'NumEntrances': 'NumEntrances ~ C(trial) + C(treatment) + C(trial):C(treatment)',
  335. 'pTimeShockZone': 'pTimeShockZone ~ C(trial) + C(treatment) + C(trial):C(treatment)',
  336. 'Time1stEntr': 'Time1stEntr ~ C(trial) + C(treatment) + C(trial):C(treatment)'
  337. }
  338. phases_single = ['Pre', 'Retention', 'Retest']
  339. phase_groups = [['T1', 'T2', 'T3'], ['T4_C1', 'T5_C2', 'T6_C3']]
  340. yoked_for_ano = copy.deepcopy(behavior)
  341. trained_for_ano = copy.deepcopy(behavior)
  342. yoked_for_ano = yoked_for_ano[yoked_for_ano.treatment.isin(['conflict.yoked','standard.yoked'])]
  343. trained_for_ano = trained_for_ano[trained_for_ano.treatment.isin(['conflict.trained','standard.trained'])]
  344. # Run single ANOVA - Yoked & Trained
  345. Yoked_results_single = []
  346. for phase in phases_single:
  347. result = run_anova_v1(yoked_for_ano, [phase], formulas_single)
  348. Yoked_results_single.append(result.loc['C(treatment)'])
  349. Yoked_table_1 = pd.concat(Yoked_results_single)
  350. Yoked_table_1['trial'] = ['Pre-training'] * 3 + ['Retention'] * 3 + ['Retest'] * 3
  351. Trained_results_single = []
  352. for phase in phases_single:
  353. result = run_anova_v1(trained_for_ano, [phase], formulas_single)
  354. Trained_results_single.append(result.loc['C(treatment)'])
  355. Trained_table_1 = pd.concat(Trained_results_single)
  356. Trained_table_1['trial'] = ['Pre-training'] * 3 + ['Retention'] * 3 + ['Retest'] * 3
  357. # Run two-way ANOVA - Yoked & Trained
  358. desired_order = ['Pre-training', 'Initial Training (T1~T3)', 'Retest', 'Conflict Training (T4~T6)', 'Retention', 'All trials', 'Retention only']
  359. Yoked_table_2 = pd.concat([run_anova_v1(yoked_for_ano, phase, formulas_double) for phase in phase_groups])
  360. Yoked_table_2['trial'] = ['Initial Training (T1~T3)'] * 9 + ['Conflict Training (T4~T6)'] * 9
  361. Yoked_table_1 = format_anova_table(Yoked_table_1)[['trial', 'name', 'df', 'F', 'p', 'sig']]
  362. Yoked_table_2['name2'] = ['trial', 'treatment', 'trial*treatment'] * 6
  363. Yoked_table_2['name'] = Yoked_table_2['name'] + ' ~ ' + Yoked_table_2['name2']
  364. Yoked_table_2 = format_anova_table(Yoked_table_2)[['trial', 'name', 'df', 'F', 'p', 'sig']]
  365. Yoked_table_3 = pd.concat([Yoked_table_1, Yoked_table_2]).reset_index(drop=True)
  366. Yoked_table_3['trial'] = pd.Categorical(Yoked_table_3['trial'], categories=desired_order)
  367. Yoked_table_3 = Yoked_table_3.sort_values(['trial','name'])
  368. Yoked_table_3.to_csv(datapath + '01.behav_anova_onlyYoked.csv')
  369. Trained_table_2 = pd.concat([run_anova_v1(trained_for_ano, phase, formulas_double) for phase in phase_groups])
  370. Trained_table_2['trial'] = ['Initial Training (T1~T3)'] * 9 + ['Conflict Training (T4~T6)'] * 9
  371. Trained_table_1 = format_anova_table(Trained_table_1)[['trial', 'name', 'df', 'F', 'p', 'sig']]
  372. Trained_table_2['name2'] = ['trial', 'treatment', 'trial*treatment'] * 6
  373. Trained_table_2['name'] = Trained_table_2['name'] + ' ~ ' + Trained_table_2['name2']
  374. Trained_table_2 = format_anova_table(Trained_table_2)[['trial', 'name', 'df', 'F', 'p', 'sig']]
  375. Trained_table_3 = pd.concat([Trained_table_1, Trained_table_2]).reset_index(drop=True)
  376. Trained_table_3['trial'] = pd.Categorical(Trained_table_3['trial'], categories=desired_order)
  377. Trained_table_3 = Trained_table_3.sort_values(['trial','name'])
  378. Trained_table_3.to_csv(datapath + '01.behav_anova_onlyTrain.csv')
  379. # Run ANOVA for all PCs
  380. def run_anova_pcv1(be_for_ano, formulas):
  381. results = []
  382. tmp_ano = copy.deepcopy(be_for_ano)
  383. tmp_ano['treatment'] = pd.Categorical(tmp_ano['treatment'])
  384. for name, formula in formulas.items():
  385. model = ols(formula, data=tmp_ano).fit()
  386. anova_result = sm.stats.anova_lm(model, typ=2)
  387. # typ1 : order matters, typ2 : take only Main effect, typ3 : also check interaction among conditions
  388. anova_result['name'] = name
  389. results.append(anova_result)
  390. combined_result = pd.concat(results)
  391. print(combined_result)
  392. return combined_result.drop('Residual', axis=0)
  393. yoked_only_pca_tot = pca_total[0][pca_total[0].treatment.isin(['conflict.yoked','standard.yoked'])]
  394. trained_only_pca_tot = pca_total[0][pca_total[0].treatment.isin(['conflict.trained','standard.trained'])]
  395. yoked_only_pca_rn = pca_Rn_all[0][pca_Rn_all[0].treatment.isin(['conflict.yoked','standard.yoked'])]
  396. trained_only_pca_rn = pca_Rn_all[0][pca_Rn_all[0].treatment.isin(['conflict.trained','standard.trained'])]
  397. pc_formulas = {'PC1 ~ treatment': 'PC1 ~ C(treatment)', 'PC2 ~ treatment': 'PC2 ~ C(treatment)'}
  398. pc_tots = [yoked_only_pca_tot, trained_only_pca_tot, yoked_only_pca_rn, trained_only_pca_rn]
  399. pc_names = ['All trials - yoked', 'All trials - trained', 'Retention only - yoked', 'Retention only - trained']
  400. pc_res = []
  401. for i in range(4) :
  402. pcto = pc_tots[i]
  403. title = pc_names[i]
  404. pcs = run_anova_pcv1(pcto, pc_formulas).loc['C(treatment)']
  405. pcs['trial'] = title
  406. pcs['name'] = ['PC1 ~ treatment', 'PC2 ~ treatment']
  407. pc_res.append(pcs)
  408. table_pcs = format_anova_table(pd.concat(pc_res))
  409. table_pcs2 = table_pcs[['trial', 'name', 'df', 'F', 'p', 'sig']].reset_index(drop=True)
  410. table_pcs2.to_csv(datapath+'01.PC1_anova.csv')
  411. # Table 3
  412. # Yoked vs trained
  413. def run_anova_v2(be_for_ano, trial_filter, formulas):
  414. results = []
  415. trial_phase = be_for_ano[be_for_ano['trial'].isin(trial_filter)]
  416. trial_phase['training'] = pd.Categorical(trial_phase['training'])
  417. trial_phase['trial'] = pd.Categorical(trial_phase['trial'], categories = trial_filter)
  418. for name, formula in formulas.items():
  419. model = ols(formula, data=trial_phase).fit()
  420. anova_result = sm.stats.anova_lm(model, typ=2)
  421. anova_result['name'] = name
  422. results.append(anova_result)
  423. combined_result = pd.concat(results)
  424. combined_result['trial'] = '_'.join(trial_filter)
  425. print(combined_result)
  426. return combined_result.drop('Residual', axis=0)
  427. # Format and annotate tables
  428. def format_anova_table(table):
  429. table['p'] = round(table['PR(>F)'], 3)
  430. table['F'] = round(table['F'], 2)
  431. table['df'] = table['df'].astype(int)
  432. table['sig'] = ['***' if p < 0.001 else '**' if p < 0.01 else '*' if p < 0.05 else ' ' for p in table['p']]
  433. return table
  434. # Define the models and phases
  435. formulas_single = {
  436. 'NumEntrances ~ training': 'NumEntrances ~ C(training)',
  437. 'pTimeShockZone ~ training': 'pTimeShockZone ~ C(training)',
  438. 'Time1stEntr ~ training': 'Time1stEntr ~ C(training)'
  439. }
  440. formulas_double = {
  441. 'NumEntrances': 'NumEntrances ~ C(trial) + C(training) + C(trial):C(training)',
  442. 'pTimeShockZone': 'pTimeShockZone ~ C(trial) + C(training) + C(trial):C(training)',
  443. 'Time1stEntr': 'Time1stEntr ~ C(trial) + C(training) + C(trial):C(training)'
  444. }
  445. phases_single = ['Pre', 'Retention', 'Retest']
  446. phase_groups = [['T1', 'T2', 'T3'], ['T4_C1', 'T5_C2', 'T6_C3']]
  447. tot_for_ano = copy.deepcopy(behavior)
  448. # Run single ANOVA - Yoked & Trained
  449. Tot_results_single = []
  450. for phase in phases_single:
  451. result = run_anova_v2(tot_for_ano, [phase], formulas_single)
  452. Tot_results_single.append(result.loc['C(training)'])
  453. Tot_table_1 = pd.concat(Tot_results_single)
  454. Tot_table_1['trial'] = ['Pre-training'] * 3 + ['Retention'] * 3 + ['Retest'] * 3
  455. # Run two-way ANOVA - Yoked & Trained
  456. desired_order = ['Pre-training', 'Initial Training (T1~T3)', 'Retest', 'Conflict Training (T4~T6)', 'Retention', 'All trials', 'Retention only']
  457. Tot_table_2 = pd.concat([run_anova_v2(tot_for_ano, phase, formulas_double) for phase in phase_groups])
  458. Tot_table_2['trial'] = ['Initial Training (T1~T3)'] * 9 + ['Conflict Training (T4~T6)'] * 9
  459. Tot_table_1 = format_anova_table(Tot_table_1)[['trial', 'name', 'df', 'F', 'p', 'sig']]
  460. Tot_table_2['name2'] = ['trial', 'train', 'trial*train'] * 6
  461. Tot_table_2['name'] = Tot_table_2['name'] + ' ~ ' + Tot_table_2['name2']
  462. Tot_table_2 = format_anova_table(Tot_table_2)[['trial', 'name', 'df', 'F', 'p', 'sig']]
  463. Tot_table_3 = pd.concat([Tot_table_1, Tot_table_2]).reset_index(drop=True)
  464. Tot_table_3['trial'] = pd.Categorical(Tot_table_3['trial'], categories=desired_order)
  465. Tot_table_3 = Tot_table_3.sort_values(['trial','name'])
  466. Tot_table_3.to_csv(datapath + '01.behav_anova_YKvsTR.csv')
  467. # Run ANOVA for all PCs
  468. def run_anova_pcv2(be_for_ano, formulas):
  469. results = []
  470. tmp_ano = copy.deepcopy(be_for_ano)
  471. tmp_ano['training'] = pd.Categorical(tmp_ano['training'])
  472. for name, formula in formulas.items():
  473. model = ols(formula, data=tmp_ano).fit()
  474. anova_result = sm.stats.anova_lm(model, typ=2)
  475. # typ1 : order matters, typ2 : take only Main effect, typ3 : also check interaction among conditions
  476. anova_result['name'] = name
  477. results.append(anova_result)
  478. combined_result = pd.concat(results)
  479. print(combined_result)
  480. return combined_result.drop('Residual', axis=0)
  481. TOT_pca_tot = pca_total[0]
  482. TOT_pca_rn = pca_Rn_all[0]
  483. pc_formulas = {'PC1 ~ training': 'PC1 ~ C(training)', 'PC2 ~ training': 'PC2 ~ C(training)'}
  484. pc_tots = [TOT_pca_tot, TOT_pca_rn]
  485. pc_names = ['All trials','Retention only']
  486. pc_res = []
  487. for i in range(2) :
  488. pcto = pc_tots[i]
  489. title = pc_names[i]
  490. pcs = run_anova_pcv2(pcto, pc_formulas).loc['C(training)']
  491. pcs['trial'] = title
  492. pcs['name'] = ['PC1 ~ training', 'PC2 ~ training']
  493. pc_res.append(pcs)
  494. table_pcs = format_anova_table(pd.concat(pc_res))
  495. table_pcs2 = table_pcs[['trial', 'name', 'df', 'F', 'p', 'sig']].reset_index(drop=True)
  496. table_pcs2.to_csv(datapath+'01.PC1_anova_YKTR.csv')
  497. # Just to save and fix the PC1
  498. NEW_PC1 = pca_Rn_all[0]
  499. NEW_PC1 = NEW_PC1.sort_values('PC1')[['ID','treatment','trialNum','PC1','PC2']]
  500. NEW_PC1 = NEW_PC1.reset_index(drop = True)
  501. NEW_PC1.to_csv(datapath+'00.NEW_PC1.csv') # for the reference

01.behavior_analysis.py at commit a6bee7c, no license · at the source

Overview

Authors: Jiyeon Han1,2, Alejandro Grau‐Perales1, Rayna M Harris3, Edith Lesburguères1, Hsin‐Yi Kao1, Asit Pal2,4, Juan Marcos Alarcon5, Todd C Sacktor6, Stefano Martiniani1,2,4,7, Hans A Hofmann3, André A Fenton1,8
  1. Center for Neural Science, New York University, New York, New York, USA
  2. Center for Soft Matter Physics, Department of Physics, New York University, New York, New York, USA
  3. Department of Integrative Biology and Institute for Neuroscience, The University of Texas. Austin, Austin, Texas, USA
  4. Simons Center For Computational Physical Chemistry, Department of Chemistry, New York University, New York, New York, USA
  5. Department of Pathology. State University of New York, Downstate Health Sciences University, Brooklyn, New York, USA
  6. Departments of Physiology and Pharmacology, Anesthesiology, and Neurology, State University of New York, Downstate Health Sciences University, Brooklyn, New York, USA
  7. Courant Institute of Mathematical Sciences, New York University, New York, New York, USA
  8. Neuroscience Institute at the New York University Langone Medical Center, New York, New York, USA
Institutions: New York University (United States); The University of Texas at Austin (United States); SUNY Downstate Health Sciences University (United States); Courant Institute of Mathematical Sciences (United States); NYU Langone Health (United States)
Journal: Advanced science (Weinheim, Baden-Wurttemberg, Germany), volume 13, issue 28, article e21254
Dates: received 24 October 2025; accepted 23 February 2026; published online 13 March 2026; in print May 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.1002/advs.202521254 · PMID 41824523 · PMCID PMC13185853 · OpenAlex W7135220679
Open access: gold, a free copy (OpenAlex)
Status: code verified
Categories: genetics / omics (modality), histology / microscopy (modality), rat (organism), cellular / molecular (subfield)
Methods: Statistics, Smoothing, state filtering, decompositions, Connectivity, fMRI & imaging
Keywords: engram, gene co‐expression networks, immunohistochemistry, transcriptome, trisynaptic pathway
MeSH: Avoidance Learning*, Hippocampus*, Memory, Long-Term*, Protein Kinase C*, Animals, Gene Expression Profiling, Protein Kinase C zeta, Rats, Transcriptome (* major topic)
Topic: Hippo pathway signaling and YAP/TAZ (Cell Biology, Biochemistry, Genetics and Molecular Biology), according to OpenAlex
Funding: Chan Zuckerberg Initiative (CP2-1-0000000614, CP2‐1‐0000000614); NIMH NIH HHS (R01 MH132204, R01 MH115304); National Institutes of Health (R01MH115304, R01MH132204); NIH HHS (R01MH132204, R01MH115304); Simons Foundation (839534); UT Austin Continuing Fellowship to RMH
Citations: cited by 4 papers (Europe PMC); 183 references in the paper

Abstract

Long‐term memory formation transiently activates Ca2+‐calmodulin kinase II and atypical protein kinase C isoform iota/lambda, whereas persistent activation of the other atypical PKC, protein kinase M zeta (PKMζ), together with its interacting partner, the scaffolding‐protein KIBRA (Wwc1), are necessary for maintaining potentiated synapses and memory. Here, we use immediate‐early gene (IEG) Arc activation during active place avoidance memory expression to tag memory‐activated neurons with EYFP‐ChR2. PKMζ immunohistochemistry identified persistently altered hippocampal somatodendritic domains. EYFP‐PKMζ colocalization persistently increases in the hippocampal trisynaptic pathway (dentate gyrus [DG]→CA3→CA1) tracing a 1‐month PKMζ engram. DG, CA3, and CA1 transcriptional profiling identifies that memory persistence correlates with upregulated IEGs Arc, Fos, and NPas4 in DG, but not with Prkcz, the PKMζ gene, or most genes known to be crucial for LTP and memory. This rules out strong memory‐related transcriptional but not translational regulation or altered stability of such “shadow proteins” like PKMζ that, despite being crucial for memory maintenance, evade detection by unbiased transcriptome profiling. In contrast, our method Correlation Signal Co‐cluster Reduction (C‐SCoRe) incorporates weak linear and non‐linear gene correlations and highlights network interaction changes predicting memory, and related IEG and Prkcz/Wwc1 expression. Manifold transcriptional relationships can reveal shadow molecular components of long‐term memory.

Reproduced under the paper's license (CC BY), from the paper cited above.

Repository

Its files are read in the Code ↔ Paper reader above, with 9 matches between paragraphs and lines of code.

sommerJY/APA_PKMZ

License: none: the authors keep all their rights
State: the link answers, verified on 30 September 2026
Evidence: files inventoried
Commit: a6bee7c09597cae106cd652954945bf64bce55e2, 24 October 2025
Languages: Python (6), R (2)
Size: 121 files, 8 scripts
Software Heritage: not archived
Found in: “Data Availability Statement”
Holds: README
Not found: license file, CITATION.cff, environment file, tests, continuous integration, documentation
Tools: Matplotlib (6 files), NumPy (6 files), pandas (6 files), SciPy (6 files), seaborn (5 files), scikit-learn (4 files), ggplot2 (2 files), NetworkX (2 files), statsmodels (2 files), cowplot (1 file), DESeq2 (1 file), Plotly (1 file), tidyverse (1 file), UMAP (1 file), WGCNA (1 file)
Availability: 1 check, the latest on 30 September 2026: the link answers
  • 30 September 2026: the link answers
9 files

The paper's code and data availability statement is in the Data section.

Tracing map

Proposed by the machine: these links were found in the paper and verified at the source, without human review. The map will receive a Zenodo DOI once one of the paper's authors has validated it with their ORCID.

What the map holds:

  • 1 repository of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
  • 8 scripts, each with its path and the digest of its content;
  • 9 matches between paragraphs of the paper and lines of the code (method lexical-v1);
  • neither the text of the paper nor the code itself.

Its JSON (tracing-map.json) is deposited on Zenodo with its DOI once the map is validated.

Data

Datasets cited

Data Availability Statement

Raw sequence data and differential gene expression data are available in NCBI's Gene Expression Omnibus Database (accession: GSE100225 (https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE100225)). All data, code, and results are publicly available on GitHub (https://github.com/sommerJY/APA_PKMZ).

Reproduced under the paper's license (CC BY), from the paper cited above.

Versions

The history of this record: each version stored by the harvester or made by a correction of its authors or of the maintainers of its code, and what changed in its facts. The texts of the paper (its abstract, its availability statements) are not part of it; versions that changed only those are not listed.

Version 1, 30 September 2026: the first record

Recorded: type, language, journal, volume, issue, pages, dates, 11 authors, 5 keywords, 9 MeSH terms, 6 funders, 171 references.

Cite

This paper

Han, J., Grau‐Perales, A., Harris, R. M., Lesburguères, E., Kao, H., Pal, A., Alarcon, J. M., Sacktor, T. C., Martiniani, S., Hofmann, H. A., & Fenton, A. A. (2026). Persistently Increased Expression of PKMzeta and Unbiased Gene Expression Profiles Identify Hippocampal Molecular Traces of a Long-Term Active Place Avoidance Memory and "Shadow" Proteins. Advanced science (Weinheim, Baden-Wurttemberg, Germany), 13(28), e21254. https://doi.org/10.1002/advs.202521254

BibTeX

@article{han2026persistently,
author = {Han, Jiyeon and Grau‐Perales, Alejandro and Harris, Rayna M and Lesburguères, Edith and Kao, Hsin‐Yi and Pal, Asit and Alarcon, Juan Marcos and Sacktor, Todd C and Martiniani, Stefano and Hofmann, Hans A and Fenton, André A},
title = {{Persistently Increased Expression of PKMzeta and Unbiased Gene Expression Profiles Identify Hippocampal Molecular Traces of a Long-Term Active Place Avoidance Memory and "Shadow" Proteins}},
journal = {Advanced science (Weinheim, Baden-Wurttemberg, Germany)},
year = {2026},
month = mar,
volume = {13},
number = {28},
pages = {e21254},
publisher = {Wiley},
issn = {2198-3844},
doi = {10.1002/advs.202521254},
url = {https://doi.org/10.1002/advs.202521254},
pmid = {41824523},
pmcid = {PMC13185853}
}

RIS

TY - JOUR
AU - Han, Jiyeon
AU - Grau‐Perales, Alejandro
AU - Harris, Rayna M
AU - Lesburguères, Edith
AU - Kao, Hsin‐Yi
AU - Pal, Asit
AU - Alarcon, Juan Marcos
AU - Sacktor, Todd C
AU - Martiniani, Stefano
AU - Hofmann, Hans A
AU - Fenton, André A
TI - Persistently Increased Expression of PKMzeta and Unbiased Gene Expression Profiles Identify Hippocampal Molecular Traces of a Long-Term Active Place Avoidance Memory and "Shadow" Proteins
T2 - Advanced science (Weinheim, Baden-Wurttemberg, Germany)
J2 - Adv Sci (Weinh)
PY - 2026
DA - 2026/03/13
VL - 13
IS - 28
SP - e21254
SN - 2198-3844
PB - Wiley
DO - 10.1002/advs.202521254
UR - https://doi.org/10.1002/advs.202521254
LA - en
ER -

CSL-JSON

{
"id": "10.1002/advs.202521254",
"type": "article-journal",
"title": "Persistently Increased Expression of PKMzeta and Unbiased Gene Expression Profiles Identify Hippocampal Molecular Traces of a Long-Term Active Place Avoidance Memory and \"Shadow\" Proteins",
"container-title": "Advanced science (Weinheim, Baden-Wurttemberg, Germany)",
"author": [
{
"family": "Han",
"given": "Jiyeon"
},
{
"family": "Grau‐Perales",
"given": "Alejandro"
},
{
"family": "Harris",
"given": "Rayna M"
},
{
"family": "Lesburguères",
"given": "Edith"
},
{
"family": "Kao",
"given": "Hsin‐Yi"
},
{
"family": "Pal",
"given": "Asit"
},
{
"family": "Alarcon",
"given": "Juan Marcos"
},
{
"family": "Sacktor",
"given": "Todd C"
},
{
"family": "Martiniani",
"given": "Stefano"
},
{
"family": "Hofmann",
"given": "Hans A"
},
{
"family": "Fenton",
"given": "André A"
}
],
"container-title-short": "Adv Sci (Weinh)",
"volume": "13",
"issue": "28",
"page": "e21254",
"DOI": "10.1002/advs.202521254",
"PMID": "41824523",
"PMCID": "PMC13185853",
"ISSN": "2198-3844",
"publisher": "Wiley",
"URL": "https://doi.org/10.1002/advs.202521254",
"language": "en",
"issued": {
"date-parts": [
[
2026,
3,
13
]
]
}
}

The tracing map gets a citation of its own once an author has validated it and it has a DOI.

Similar papers

The papers with a page that share the most with this one: the tools found in their code, their categories, datasets, cited references and authors, the rarest counting most.

[1] doi:10.1093/bioinformatics/btag592 [code]
Network-based stratification of allele-specific expression reveals patient subgroups in Huntington's disease.
Journal: Bioinformatics (Oxford, England)
In common: WGCNA, UMAP, DESeq2, 11 other tools, genetics / omics, 2 references
[2] doi:10.1016/j.xcrm.2026.102766 [code]
A longitudinal single-cell and spatial multiomic atlas of pediatric high-grade glioma.
Journal: Cell reports. Medicine
In common: WGCNA, UMAP, DESeq2, 11 other tools, genetics / omics, cellular / molecular, 1 reference
[3] doi:10.1038/s42003-026-10957-8 [code]
Brain defence by the extracellular matrix protein Cochlin.
Journal: Communications biology
In common: WGCNA, UMAP, DESeq2, 11 other tools, cellular / molecular, 1 reference
[4] doi:10.1038/s41467-026-76675-1 [code]
Long-read proteogenomic atlas of human neuronal differentiation reveals isoform diversity informing neurodevelopmental risk mechanisms.
Journal: Nature communications
In common: WGCNA, UMAP, DESeq2, 10 other tools, genetics / omics, 1 reference
[5] doi:10.1038/s41586-026-10629-x [code]
Whole-genome duplication shaped cell-type evolution in the vertebrate brain.
Journal: Nature
In common: UMAP, DESeq2, NetworkX, 10 other tools, genetics / omics, cellular / molecular, 1 reference
[6] doi:10.1038/s41467-026-72598-z [code]
Functional impact of genetic background on variable expressivity in neurodevelopmental disorders.
Journal: Nature communications
In common: WGCNA, DESeq2, NetworkX, 8 other tools, 3 references
[7] doi:10.1016/j.xcrm.2026.102651 [code]
Integrative CSF profiling identifies disease-specific immune responses in leptomeningeal disease.
Journal: Cell reports. Medicine
In common: UMAP, DESeq2, NetworkX, 9 other tools, genetics / omics, cellular / molecular
[8] doi:10.1016/j.xcrm.2026.102800 [code]
Recombinant dimeric PICK1 peptide inhibitors for long-term relief of chronic pain by AAV therapeutics.
Journal: Cell reports. Medicine
In common: WGCNA, UMAP, DESeq2, 9 other tools
[9] doi:10.1126/sciadv.aeg3223 [code]
The extreme diversity of retinal amacrine cells has deep evolutionary roots.
Journal: Science advances
In common: WGCNA, DESeq2, Plotly, 9 other tools, genetics / omics, cellular / molecular
[10] doi:10.7554/elife.93664 [code]
Drug-induced changes in connectivity to midbrain dopamine cells revealed by rabies monosynaptic tracing.
Journal: eLife
In common: UMAP, cowplot, statsmodels, 8 other tools, cellular / molecular, 2 references

Contribute

The authors of this paper can claim it, correct its record and validate its tracing map, and the maintainers of its code (its owner, or a public member of its organization) correct what it says of their repository; anyone signed in can ask for its removal. Every request goes to OSCR's own machine, which answers it; your account page follows them.

Sign in with ORCID to claim this paper as one of its authors, correct its record or validate its tracing map: when the paper's metadata lists your ORCID iD, you are recognized at once. Maintainers of its code: sign in with GitHub, then claim the repository on your account page.

Request its removal

To ask OSCR to remove this record, the copies of its authors' scripts or its tracing map, use the removal request page: signed in, you say who you are, what to remove and why, then review and confirm the request. Published rules decide every request (how).

Discussion, reproductions, activity

Discussion: questions and error reports about this paper and its code, from signed-in readers and its authors. It opens with sign-in.

Reproductions: reports from readers who ran the authors' code: what they reproduced, with which environment, commit and data. It opens with sign-in.

Activity: what happens around this paper: new versions of its record, its map's validation, discussions and reproductions. It opens with sign-in.