OSCR

Protocol for pH correction of FRET-based fluorescent biosensor imaging in dissociated Drosophila neurons.

Code ↔ Paper

The paper beside its authors' code: matches between them have not been computed for this paper yet.

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

R · 448 lines · 16 KB · no license

  1. # =================================================================
  2. # Laconic Fluorescence Analysis Script
  3. # =================================================================
  4. # This script analyzes fluorescence microscopy data from dual-channel imaging
  5. # It processes both Laconic sensor and pHrodo measurements
  6. # Performs background subtraction, photobleaching correction, and pH corrections
  7. # =================================================================
  8. # INPUT FILE REQUIREMENTS
  9. # =================================================================
  10. # 1. File Naming Convention:
  11. # - Laconic sensor files should be named: [SampleName]_Laconic.csv
  12. # - pHrodo files should be named: [SampleName]_pHrodo.csv
  13. # - Each Laconic file must have a matching pHrodo file
  14. # Example: "Sample1_Laconic.csv" and "Sample1_pHrodo.csv"
  15. #
  16. # 2. Laconic File Format:
  17. # - CSV file with the following columns:
  18. # - Column 1: treatments
  19. # - Column 2: time
  20. # - Columns 3-n: mTFP channel measurements (#1_TFP - #n_TFP)
  21. # - Columns n+2-2n: Venus channel measurements (#n+2_YFP -#2n_YFP)
  22. # - Last column in each channel should be background measurement (n+1 and 2n+1, respectively)
  23. #
  24. # 3. pHrodo File Format:
  25. # - CSV file with the following columns:
  26. # - Column 1: treatments
  27. # - Column 2: time
  28. # - Columns 3-11: TRITC (pHrodo) channel measurements (#1_phrodo - #n_phrodo)
  29. # - Last column should be background measurement
  30. #
  31. # 4. Data Requirements:
  32. # - Both files must have the same number of time points
  33. # - Time points must be aligned between Laconic and pHrodo files
  34. # - Background measurements must be included as the last column
  35. # - No missing values allowed in measurement columns
  36. # =================================================================
  37. # Load required packages
  38. library(tidyverse) # For data manipulation and visualization
  39. library(readr) # For reading CSV files
  40. library(rowr) # For row operations
  41. library(MESS) # For AUC calculations
  42. library(broom) # For converting statistical objects to tidy data frames
  43. library(varhandle) # For variable handling
  44. library(plotrix) # For error calculations
  45. library(aomisc) # For curve fitting
  46. library(CausalImpact) # For time series analysis
  47. # Set working directory and file paths
  48. setwd("~/") # Change this to your working directory
  49. input_path <- "abc" # Directory containing input files
  50. output_path <- "xyz" # Directory for saving results
  51. # Get list of input files
  52. list1 <- as.data.frame(list.files(path=input_path))
  53. colnames(list1) <- c("files")
  54. # Separate pHrodo and Laconic files
  55. list2 <- as.data.frame(list1[c(which(grepl("pHrodo",list1$files)==T)),])
  56. colnames(list2) <- c("files")
  57. list1 <- as.data.frame(list1[-c(which(grepl("pHrodo",list1$files)==T)),])
  58. colnames(list1) <- c("files")
  59. # Process each Laconic file
  60. for (list_files in 1:(nrow(list1))) {
  61. # Read current file
  62. file_uploaded <- as.character(list1[c(list_files),])
  63. ratio_file <- read_csv(paste0(input_path,file_uploaded))
  64. # Remove NA rows if present
  65. rem1 <- which(is.na(ratio_file$time)==T)
  66. if (is_empty(rem1)==F){
  67. ratio_file <- ratio_file[-c(rem1),]
  68. }
  69. # Separate mTFP and Venus channels
  70. col_names <- as.data.frame(colnames(ratio_file))
  71. rem_cols <- which(grepl("TFP",col_names$`colnames(ratio_file)`)==T)
  72. ratio_file_Venus <- as.data.frame(ratio_file[,-c(rem_cols)])
  73. ratio_file_TFP <- as.data.frame(ratio_file[,c(1,2,rem_cols)])
  74. # Background subtraction for Venus channel
  75. for (j in 3:(ncol(ratio_file_Venus)-1)){
  76. col1 <- as.matrix(ratio_file_Venus[,c(j)])
  77. col_back <- as.matrix(ratio_file_Venus[,c(ncol(ratio_file_Venus))])
  78. ratio_file_Venus[,c(j)] <- col1-col_back
  79. }
  80. ratio_file_Venus[,c(ncol(ratio_file_Venus))] <- NULL
  81. # Background subtraction for TFP channel
  82. for (j in 3:(ncol(ratio_file_TFP)-1)){
  83. col1 <- as.matrix(ratio_file_TFP[,c(j)])
  84. col_back <- as.matrix(ratio_file_TFP[,c(ncol(ratio_file_TFP))])
  85. ratio_file_TFP[,c(j)] <- col1-col_back
  86. }
  87. ratio_file_TFP[,c(ncol(ratio_file_TFP))] <- NULL
  88. # Get treatment time point
  89. time_add <- ratio_file[c(which(is.na(ratio_file$treatments)==F)),2]
  90. time_add <- time_add$time
  91. # Get baseline period data
  92. ratio_file_TFP_back <- filter(ratio_file_TFP,ratio_file_TFP$time<time_add[1])
  93. ratio_file_Venus_back <- filter(ratio_file_Venus,ratio_file_Venus$time<time_add[1])
  94. # Photobleaching correction
  95. # Uses exponential decay fitting to correct for fluorescence bleaching
  96. for (i in 3:ncol(ratio_file_TFP)){
  97. # Process TFP channel
  98. full_data <- ratio_file_TFP_back[,c(2,i)]
  99. colnames(full_data) <- c("X","Y")
  100. # Try exponential decay fit
  101. a <- try(nls(Y ~ NLS.expoDecay(X, a, k),data = full_data),silent = TRUE)
  102. if (grepl("Error",a[1])==T){
  103. # If fitting fails, normalize to mean
  104. ratio_file_TFP[,c(i)] <- ratio_file_TFP[,c(i)]/mean(full_data$Y)
  105. } else {
  106. # Apply exponential decay correction
  107. nlsfit <- nls(Y ~ NLS.expoDecay(X, a, k),data = full_data)
  108. nlsfit_vals <- as.data.frame(tidy(nlsfit))
  109. full_data2 <- as.data.frame(ratio_file_TFP[,c(2,i)])
  110. colnames(full_data2) <- c("X","Y")
  111. Y0 <- as.numeric(nlsfit_vals[1,2])
  112. k <- as.numeric(nlsfit_vals[2,2])
  113. # Calculate corrected values
  114. full_data2 <- full_data2 %>%
  115. mutate(Y2=(Y0)*exp((-k)*full_data2$X))
  116. full_data2 <- full_data2 %>%
  117. mutate(Y3=full_data2$Y/full_data2$Y2)
  118. full_data2 <- full_data2 %>%
  119. mutate(Y4=full_data2$Y3*full_data2$Y)
  120. # Apply correction based on trend
  121. if (full_data2[1,3]>full_data2[nrow(full_data2),3]){
  122. ratio_file_TFP[,c(i)] <- full_data2$Y4
  123. } else {
  124. ratio_file_TFP[,c(i)] <- full_data2$Y
  125. }
  126. }
  127. # Repeat process for Venus channel
  128. full_data <- ratio_file_Venus_back[,c(2,i)]
  129. colnames(full_data) <- c("X","Y")
  130. if (grepl("Error",a[1])==T){
  131. ratio_file_Venus[,c(i)] <- ratio_file_Venus[,c(i)]/mean(full_data$Y)
  132. } else {
  133. full_data2 <- as.data.frame(ratio_file_Venus[,c(2,i)])
  134. colnames(full_data2) <- c("X","Y")
  135. full_data2 <- full_data2 %>%
  136. mutate(Y2=(Y0)*exp((-k)*full_data2$X))
  137. full_data2 <- full_data2 %>%
  138. mutate(Y3=full_data2$Y/full_data2$Y2)
  139. full_data2 <- full_data2 %>%
  140. mutate(Y4=full_data2$Y3*full_data2$Y)
  141. ratio_file_Venus[,c(i)] <- full_data2$Y4
  142. }
  143. }
  144. # Calculate TFP/Venus ratios
  145. final_ratios <- ratio_file_Venus
  146. for (k in 3:ncol(final_ratios)){
  147. Venus <- ratio_file_Venus[,c(k)]
  148. TFP <- ratio_file_TFP[,c(k)]
  149. final_ratios[,c(k)] <- TFP/Venus
  150. }
  151. final_ratios_original <- final_ratios
  152. # Normalize to baseline
  153. for (i in 3:ncol(final_ratios)){
  154. col1 <- as.data.frame(final_ratios[,c(i)])
  155. col2 <- col1[c(which(final_ratios$time<time_add[1])),]
  156. norm_val <- mean(col2)
  157. final_ratios[,c(i)] <- final_ratios[,c(i)]/norm_val
  158. }
  159. # Normalization to the pre-mixing baselines using exponential fit
  160. final_ratios_baseline <- final_ratios
  161. final_ratios_corrected <- final_ratios
  162. k_table <- as.data.frame(matrix(0,nrow=(ncol(final_ratios)-2)),ncol=1)
  163. for (i in 3:ncol(final_ratios)){
  164. # Process each trace
  165. full_data <- final_ratios[,c(1,2,i)]
  166. full_data <- filter(full_data,full_data$time<time_add[1])
  167. full_data[,c(1)] <- NULL
  168. colnames(full_data) <- c("X","Y")
  169. # Try different fitting methods
  170. a <- try(nlsfit <- nls(Y ~ NLS.expoDecay(X, a, k),data = full_data),silent = TRUE)
  171. if (grepl("Error",a[1])==T){
  172. b <- try(nls(Y ~ SSasymp(X, yf, y0, log_alpha), data = full_data),silent = TRUE)
  173. if (grepl("Error",b[1])==F){
  174. # Asymptotic regression fit
  175. nlsfit <- nls(Y ~ SSasymp(X, yf, y0, log_alpha), data = full_data)
  176. nlsfit_vals <- as.data.frame(tidy(nlsfit))
  177. full_data2 <- as.data.frame(final_ratios[,c(2,i)])
  178. colnames(full_data2) <- c("X","Y")
  179. # Extract parameters
  180. Y0 <- as.numeric(nlsfit_vals[2,2])
  181. k <- exp(as.numeric(nlsfit_vals[3,2]))
  182. Yf <- as.numeric(nlsfit_vals[1,2])
  183. # Calculate corrections
  184. full_data2 <- full_data2 %>%
  185. mutate(Y2=((Y0-Yf)*exp((-1*k)*full_data2$X))+Yf)
  186. full_data2 <- full_data2 %>%
  187. mutate(Y3=(full_data2$Y/full_data2$Y2)*as.numeric(full_data2[1,2]))
  188. final_ratios_baseline[,c(i)] <- full_data2$Y2
  189. final_ratios_corrected[,c(i)] <- full_data2$Y3
  190. } else {
  191. # If both fits fail
  192. final_ratios_baseline[,c(i)] <- NA
  193. final_ratios_corrected[,c(i)] <- final_ratios[,c(i)]
  194. }
  195. } else {
  196. # Exponential decay fit
  197. nlsfit <- nls(Y ~ NLS.expoDecay(X, a, k),data = full_data)
  198. nlsfit_vals <- as.data.frame(tidy(nlsfit))
  199. full_data2 <- as.data.frame(final_ratios[,c(2,i)])
  200. colnames(full_data2) <- c("X","Y")
  201. # Extract parameters
  202. Y0 <- as.numeric(nlsfit_vals[1,2])
  203. k <- as.numeric(nlsfit_vals[2,2])
  204. # Calculate corrections
  205. full_data2 <- full_data2 %>%
  206. mutate(Y2=(Y0)*exp((-k)*full_data2$X))
  207. full_data2 <- full_data2 %>%
  208. mutate(Y3=(full_data2$Y/full_data2$Y2)*as.numeric(full_data2[1,2]))
  209. final_ratios_baseline[,c(i)] <- full_data2$Y2
  210. final_ratios_corrected[,c(i)] <- full_data2$Y3
  211. k_table[(i-2),] <- k
  212. }
  213. }
  214. # Save baseline correction results
  215. write.csv(final_ratios_corrected,paste0(output_path,"/Laconic_ratios_",file_uploaded))
  216. # Calculate mean and SEM
  217. final_ratios <- final_ratios_corrected
  218. final_ratiosb <- as.data.frame(final_ratios[,c(1,2)])
  219. final_ratiosc <- as.data.frame(final_ratios[,-c(1,2)])
  220. final_ratiosb[,c(3)] <- rowMeans(final_ratiosc)
  221. for (m in 1:nrow(final_ratiosc)){
  222. final_ratiosb[c(m),c(4)] <- std.error(t(final_ratiosc[c(m),]))
  223. }
  224. write.csv(final_ratiosb,paste0(output_path,"/Laconic_ratios_mean_SEM_",file_uploaded))
  225. # Process pHrodo files
  226. # =================================================================
  227. downloaded_file <- as.character(list2[c(list_files),])
  228. pHRed <- read_csv(paste0(input_path, downloaded_file))
  229. # Remove NA rows if present
  230. rem2 <- which(is.na(pHRed$time)==T)
  231. if (is_empty(rem2)==F){
  232. pHRed <- pHRed[-c(rem2),]
  233. }
  234. # Background subtraction for pHrodo data
  235. for (j in 3:(ncol(pHRed)-1)){
  236. col1 <- as.matrix(pHRed[,c(j)])
  237. col1 <- as.numeric(col1)
  238. col_back <- as.matrix(pHRed[,c(ncol(pHRed))])
  239. pHRed[,c(j)] <- col1-col_back
  240. }
  241. pHRed[,c(ncol(pHRed))] <- NULL
  242. # Get baseline period data
  243. pHRed_back <- filter(pHRed, pHRed$time < time_add[1])
  244. # Photobleaching correction for pHrodo
  245. for (i in 3:ncol(pHRed)){
  246. full_data <- pHRed_back[,c(2,i)]
  247. colnames(full_data) <- c("X","Y")
  248. # Try exponential decay fit
  249. a <- try(nls(Y ~ NLS.expoDecay(X, a, k), data = full_data), silent = TRUE)
  250. if (grepl("Error",a[1])==T){
  251. # If fitting fails, normalize to mean
  252. pHRed[,c(i)] <- pHRed[,c(i)]/mean(full_data$Y)
  253. } else {
  254. # Apply exponential decay correction
  255. nlsfit <- nls(Y ~ NLS.expoDecay(X, a, k), data = full_data)
  256. nlsfit_vals <- as.data.frame(tidy(nlsfit))
  257. full_data2 <- as.data.frame(pHRed[,c(2,i)])
  258. colnames(full_data2) <- c("X","Y")
  259. # Extract parameters
  260. Y0 <- as.numeric(nlsfit_vals[1,2])
  261. k <- as.numeric(nlsfit_vals[2,2])
  262. # Calculate corrections
  263. full_data2 <- full_data2 %>%
  264. mutate(Y2=(Y0)*exp((-k)*full_data2$X))
  265. full_data2 <- full_data2 %>%
  266. mutate(Y3=full_data2$Y/full_data2$Y2)
  267. full_data2 <- full_data2 %>%
  268. mutate(Y4=full_data2$Y3*full_data2$Y)
  269. # Apply correction based on trend
  270. if (full_data2[1,3]>full_data2[nrow(full_data2),3]){
  271. pHRed[,c(i)] <- full_data2$Y4
  272. } else {
  273. pHRed[,c(i)] <- full_data2$Y
  274. }
  275. }
  276. }
  277. # Store original and normalized data
  278. pHRed_original <- pHRed
  279. # Normalize to baseline
  280. for (i in 3:ncol(pHRed)){
  281. col1 <- as.data.frame(pHRed[,c(i)])
  282. col2 <- col1[c(which(pHRed$time<time_add[1])),]
  283. norm_val <- mean(col2)
  284. pHRed[,c(i)] <- pHRed[,c(i)]/norm_val
  285. }
  286. # Calculate mean and SEM for normalized data
  287. pHRed_1b <- as.data.frame(pHRed[,c(1,2)])
  288. pHRed_1c <- as.data.frame(pHRed[,-c(1,2)])
  289. pHRed_1b[,c(3)] <- rowMeans(pHRed_1c)
  290. for (m in 1:nrow(pHRed_1c)){
  291. pHRed_1b[c(m),c(4)] <- std.error(t(pHRed_1c[c(m),]))
  292. }
  293. # Save pHrodo results
  294. write.csv(pHRed, paste0(output_path, "/pHRed_", downloaded_file))
  295. write.csv(pHRed_1b, paste0(output_path, "/pHRed_mean_SEM_", downloaded_file))
  296. # pH correction for Laconic sensor data
  297. # =================================================================
  298. final_ratios_corrected <- final_ratios
  299. for (l in 3:ncol(final_ratios)){
  300. # Combine Laconic and pHrodo data
  301. new_col <- as.data.frame(cbind(final_ratios[,c(l)], pHRed[,c(l)]))
  302. colnames(new_col) <- c("laconic","pHRed")
  303. # Separate and normalize baseline and post-treatment periods
  304. new_col2a <- new_col[c(which(final_ratios$time<time_add[1])),]
  305. new_col2b <- new_col[c((which(final_ratios$treatments=="ammonium")-1):nrow(new_col)),]
  306. new_col2b[,1] <- new_col2b[,1]/new_col2b[1,1]
  307. new_col2b[,2] <- new_col2b[,2]/new_col2b[1,2]
  308. new_col2b <- as.data.frame(new_col2b[-c(1),])
  309. new_col3 <- as.data.frame(rbind(new_col2a,new_col2b))
  310. new_col3 <- new_col3-1
  311. write.csv(new_col3,"Desktop/new_col3.csv")
  312. # Linear regression of Laconic vs pH changes
  313. lm_laconic_pH = lm(laconic~pHRed, data = new_col3)
  314. lm_laconic_pH_vals <- as.data.frame(tidy(lm_laconic_pH))
  315. m <- as.numeric(lm_laconic_pH_vals[2,2])
  316. c <- as.numeric(lm_laconic_pH_vals[1,2])
  317. # Apply pH correction
  318. new_col <- new_col-1
  319. new_col <- new_col %>%
  320. mutate(laconic_corrected = m*(new_col$pHRed)+c)
  321. new_col <- new_col %>%
  322. mutate(laconic_corrected2 = 1+(new_col$laconic-new_col$laconic_corrected))
  323. new_col <- new_col %>%
  324. mutate(laconic_corrected2 = (new_col$laconic_corrected2*mean(final_ratios[c(which(final_ratios$time<time_add[1])),l]))/mean(new_col[c(which(final_ratios$time<time_add[1])),4]))
  325. final_ratios_corrected[,c(l)] <- new_col$laconic_corrected2
  326. }
  327. # Calculate mean and SEM for pH-corrected data
  328. final_ratios_correctedb <- as.data.frame(final_ratios_corrected[,c(1,2)])
  329. final_ratios_correctedc <- as.data.frame(final_ratios_corrected[,-c(1,2)])
  330. final_ratios_correctedb[,c(3)] <- rowMeans(final_ratios_correctedc)
  331. for (m in 1:nrow(final_ratios_correctedc)){
  332. final_ratios_correctedb[c(m),c(4)] <- std.error(t(final_ratios_correctedc[c(m),]))
  333. }
  334. # Save pH-corrected results
  335. write.csv(final_ratios_corrected, paste0(output_path, "/laconic_ratios_pH_corrected_", file_uploaded))
  336. write.csv(final_ratios_correctedb, paste0(output_path, "/laconic_ratios_pH_corrected_mean_SEM_", file_uploaded))
  337. # Calculate area under curve for pH-corrected data
  338. area_list1 <- as.data.frame(matrix(0,nrow=0,ncol=1))
  339. for (k in 3:ncol(final_ratios_corrected)){
  340. # Get treatment period data
  341. col1 <- as.data.frame(final_ratios_corrected[c(which(final_ratios_corrected$time>time_add[1] & final_ratios_corrected$time<time_add[2])),c(2,k)])
  342. colnames(col1) <- c("time","ratio")
  343. # Get baseline period data
  344. precol1 <- as.data.frame(final_ratios_corrected[c(final_ratios_corrected$time<time_add[1]),c(2,k)])
  345. colnames(precol1) <- c("time","ratio")
  346. precol2 <- as.data.frame(rbind(precol1,col1))
  347. # Set up periods for causal impact analysis
  348. pre.period <- c(1,nrow(precol1))
  349. post.period <- c((nrow(precol1)+1),nrow(precol2))
  350. precol2 <- as.data.frame(precol2[,order(ncol(precol2):1)])
  351. # Perform causal impact analysis
  352. impact <- CausalImpact(precol2, pre.period, post.period)
  353. impact_vals <- as.data.frame(impact$series)
  354. impact_vals <- as.data.frame(impact_vals[-c(1:nrow(precol1)),])
  355. # Calculate area under curve
  356. col1 <- col1 %>% mutate(base=impact_vals$point.pred)
  357. time1 <- as.numeric(min(col1$time))
  358. time2 <- as.numeric(max(col1$time))
  359. area1 <- auc(col1$time, col1$ratio, from=time1, to=time2)
  360. area2 <- auc(col1$time, col1$base, from=time1, to=time2)
  361. area <- as.data.frame((area1-area2)/nrow(col1))
  362. # Store results
  363. colnames(area) <- c("area")
  364. colnames(area_list1) <- colnames(area)
  365. area_list1 <- as.data.frame(rbind(area_list1, area))
  366. }
  367. # Save pH-corrected AUC results
  368. write.csv(area_list1, paste0(output_path, "/AUC_per_time_pH_corrected_", file_uploaded))
  369. }

Laconic analysis with pH correction.R at commit edf2365, no license · at the source

Overview

Authors: Matthew S Price1,2, Elham Rastegari1, Kartik Venkatachalam1,2,3
  1. Department of Integrative Biology and Pharmacology, McGovern Medical School at the University of Texas Health Sciences Center (UTHealth), Houston, TX, USA
  2. Neuroscience Graduate Program, The University of Texas MD Anderson Cancer Center UTHealth Houston Graduate School of Biomedical Sciences, Houston, TX, USA
  3. Molecular and Translational Biology Graduate Program, The University of Texas MD Anderson Cancer Center UTHealth Houston Graduate School of Biomedical Sciences, Houston, TX, USA
Journal: STAR protocols, volume 7, issue 3, article 104802
Dates: published online 27 August 2026; in print August 2026
Type: Research article · Language: English
License: CC BY-NC-ND
Identifiers: DOI 10.1016/j.xpro.2026.104802 · PMID 42664056 · PMCID PMC13546833 · OpenAlex W7204460820
Open access: gold, a free copy (OpenAlex)
Status: code verified
Categories: histology / microscopy (modality), drosophila (organism)
Methods: Statistics, fMRI & imaging
Keywords: Cell Biology, Single Cell, Microscopy, Model Organisms, Neuroscience
Topic: Advanced Fluorescence Microscopy Techniques (Biophysics, Biochemistry, Genetics and Molecular Biology), according to OpenAlex
Funding: NIA NIH HHS (R21 AG087381, R01 AG069076, RF1 AG072176, R01 AG072176, RF1 AG069076)
Citations: not cited yet (Europe PMC); 8 references in the paper
Research resources: w∗;; d42-GAL4 (Drosophila line) RRID:BDSC_8816, R Studio RRID:SCR_000432, R Project for Statistical Computing RRID:SCR_001905, Classint R package RRID:SCR_024515, UTHealth Houston RRID:SCR_025962

Abstract

The abstract is not reproduced here: the paper's license (CC BY-NC-ND) does not allow it. Read it in the paper, at the publisher or on Europe PMC.

Repositories

Its files are read in the Code ↔ Paper reader above.

kvenkatachalam-lab/Price_and_Rastegari_2026

License: none: the authors keep all their rights
State: the link answers, verified on 27 September 2026
Evidence: files inventoried
Commit: edf236547b9c14d563fa2823a0933861c4bad482, 11 June 2026
Languages: R (1)
Size: 2 files, 1 script
Software Heritage: not archived
Found in: “Data and code availability”
Holds: README
Not found: license file, CITATION.cff, environment file, tests, continuous integration, documentation
Tools: broom (1 file), tidyverse (1 file)
Availability: 1 check, the latest on 27 September 2026: the link answers
  • 27 September 2026: the link answers
2 files

Zenodo 20649762

License: CC-BY-4.0
State: the link answers, verified on 27 September 2026
Evidence: files inventoried
Size: 1 file
Software Heritage: not checked
Found in: “Data and code availability”
Not found: README, license file, CITATION.cff, environment file, tests, continuous integration, documentation
Tools: broom (1 file), tidyverse (1 file)
Availability: 1 check, the latest on 27 September 2026: the link answers (HTTP 200)
  • 27 September 2026: the link answers (HTTP 200)
2 files
At the source:

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:

  • 2 repositories of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
  • 2 scripts, each with its path and the digest of its content;
  • no match between paragraphs and code yet;
  • 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

No dataset and no data link were found in the paper.

Code and data availability statement

The paper has a code and data availability statement. Its license (CC BY-NC-ND) does not allow reproducing it here; in short, from what the harvester recognized in it:

Read it in the paper: doi.org/10.1016/j.xpro.2026.104802.

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 2, 28 September 2026

  • Authors: added Kartik Venkatachalam (0000-0002-3055-9265); removed Kartik Venkatachalam

Version 1, 27 September 2026: the first record

Recorded: type, language, journal, volume, issue, pages, dates, 3 authors, 5 keywords, 1 funder, 6 references, 5 RRIDs.

Cite

This paper

Price, M. S., Rastegari, E., & Venkatachalam, K. (2026). Protocol for pH correction of FRET-based fluorescent biosensor imaging in dissociated Drosophila neurons. STAR protocols, 7(3), 104802. https://doi.org/10.1016/j.xpro.2026.104802

BibTeX

@article{price2026protocol,
author = {Price, Matthew S and Rastegari, Elham and Venkatachalam, Kartik},
title = {{Protocol for pH correction of FRET-based fluorescent biosensor imaging in dissociated Drosophila neurons}},
journal = {STAR protocols},
year = {2026},
month = aug,
volume = {7},
number = {3},
pages = {104802},
publisher = {Elsevier},
issn = {2666-1667},
doi = {10.1016/j.xpro.2026.104802},
url = {https://doi.org/10.1016/j.xpro.2026.104802},
pmid = {42664056},
pmcid = {PMC13546833}
}

RIS

TY - JOUR
AU - Price, Matthew S
AU - Rastegari, Elham
AU - Venkatachalam, Kartik
TI - Protocol for pH correction of FRET-based fluorescent biosensor imaging in dissociated Drosophila neurons
T2 - STAR protocols
J2 - STAR Protoc
PY - 2026
DA - 2026/08/27
VL - 7
IS - 3
SP - 104802
SN - 2666-1667
PB - Elsevier
DO - 10.1016/j.xpro.2026.104802
UR - https://doi.org/10.1016/j.xpro.2026.104802
LA - en
ER -

CSL-JSON

{
"id": "10.1016/j.xpro.2026.104802",
"type": "article-journal",
"title": "Protocol for pH correction of FRET-based fluorescent biosensor imaging in dissociated Drosophila neurons",
"container-title": "STAR protocols",
"author": [
{
"family": "Price",
"given": "Matthew S"
},
{
"family": "Rastegari",
"given": "Elham"
},
{
"family": "Venkatachalam",
"given": "Kartik"
}
],
"container-title-short": "STAR Protoc",
"volume": "7",
"issue": "3",
"page": "104802",
"DOI": "10.1016/j.xpro.2026.104802",
"PMID": "42664056",
"PMCID": "PMC13546833",
"ISSN": "2666-1667",
"publisher": "Elsevier",
"URL": "https://doi.org/10.1016/j.xpro.2026.104802",
"language": "en",
"issued": {
"date-parts": [
[
2026,
8,
27
]
]
}
}

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.1371/journal.pbio.3003901 [code]
Peroxisomal import is circadian in glia and regulates sleep and lipid metabolism.
Journal: PLoS biology
In common: broom, tidyverse, drosophila
[2] doi:10.1093/braincomms/fcag239 [code]
Extracellular matrix remodelling in degenerative cervical myelopathy.
Journal: Brain communications
In common: broom, tidyverse, histology / microscopy
[3] doi:10.1093/braincomms/fcag272 [code]
Strenuous physical activity is associated with a younger age of amyotrophic lateral sclerosis onset in two independent cohorts.
Journal: Brain communications
In common: broom, tidyverse, histology / microscopy
[4] doi:10.1038/s41467-026-73858-8 [code]
A pegivirus associated with encephalitis in red-legged partridges shows neurotropism across avian species.
Journal: Nature communications
In common: broom, tidyverse, histology / microscopy
[5] doi:10.1038/s41514-026-00391-9 [code]
Region-specific transcriptional signatures of brain aging in the absence of neuropathology at the single-cell level.
Journal: npj aging
In common: broom, tidyverse, histology / microscopy
[6] doi:10.1038/s41467-026-71351-w [code]
Variants in the proteasome regulator PSMF1 cause a phenotypic spectrum from parkinsonism to perinatal lethality.
Journal: Nature communications
In common: tidyverse, drosophila, 1 reference
[7] doi:10.1113/jp288582
Neuronal loss of the pentose phosphate pathway in the living nervous system is causally linked to [NADPH] reduction and elevated oxidative stress.
Journal: The Journal of physiology
In common: drosophila, 1 reference
[8] doi:10.1096/fba.2026-00194 [code]
Glial and Vascular Plasma Biomarkers Across the Alzheimer's Disease Continuum: An ADNI-Based Longitudinal Study.
Journal: FASEB bioAdvances
In common: broom, tidyverse
[9] doi:10.1093/braincomms/fcag279 [code]
Network flexibility facilitates treatment-induced recovery in post-stroke aphasia.
Journal: Brain communications
In common: broom, tidyverse
[10] doi:10.1038/s42003-026-10957-8 [code]
Brain defence by the extracellular matrix protein Cochlin.
Journal: Communications biology
In common: broom, tidyverse

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.