OSCR

Single-cell profiling of DNA methylation in autism spectrum disorder prefrontal cortex reveals distinct regulatory and aging signatures.

Code ↔ Paper

6 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 6 matches
  1. [1] § STAR★Methods › Quantification and statistical analysis › Bioinformatic alignment and feature quantification ↔ Notebooks/A06_mapping_star.ipynb, lines 16–63 · score 1.00 · BySJout, EndToEnd, alignEndsType, alignIntronMax, alignMatesGapMax, alignSJDBoverhangMin
  2. [2] § STAR★Methods › Quantification and statistical analysis › Bioinformatic alignment and feature quantification ↔ Notebooks/A06_mapping_star.ipynb, lines 545–630 · score 0.90 · pixel distance, optical duplicates, MarkDuplicates, samtools view, score, flags
  3. [3] § STAR★Methods › Quantification and statistical analysis › Bioinformatic alignment and feature quantification ↔ Notebooks/A04_mapping_bismark.ipynb, lines 425–501 · score 0.85 · pixel distance, optical duplicates, MarkDuplicates, conversion, samtools, mapped
  4. [4] § STAR★Methods › Quantification and statistical analysis › Bioinformatic alignment and feature quantification ↔ Notebooks/A03_trimming.ipynb, lines 57–196 · score 0.83 · adapter_fasta, cut_right, adapter sequences, snmCTseq, demultiplexing, trimmed
  5. [5] § STAR★Methods › Quantification and statistical analysis › Bioinformatic alignment and feature quantification ↔ Scripts/A02a_demultiplex_fastq.pl, lines 2–49 · score 0.53 · cell barcodes, demultiplexing, fasta, v0, nuclei, plates
  6. [6] § STAR★Methods › Quantification and statistical analysis › Enrichment analyses ↔ Notebooks/A00_environment_and_genome_setup.ipynb, lines 437–555 · score 0.51 · GENCODE v40, gtf, kb, downstream, exon, gene

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

Jupyter notebook · 1,120 lines · 33 KB · no license · 2 matches

  1. # %%
  2. # ## overall commands
  3. # ## might be cleaner to wait for STAR mapping to finish 100% (run A04a only --> check output)
  4. # ## in lieu of submitting all of the below, but technically could run all cmds at once
  5. # # * = job array based on "platenum"
  6. # # † = job array based on "batchnum" (two rows at a time)
  7. # qsub Scripts/A06a_star_mapping.sub # †
  8. # qsub Scripts/A06b_star_filtering.sub # †
  9. # qsub Scripts/A06c_check_star.sub
  10. # qsub Scripts/A06d_featurecounts.sub # *
  11. # qsub Scripts/A06e_star_bam_stats.sub # †
  12. # %% [markdown]
  13. # ## (A06a) star mapping
  14. # %%
  15. %%bash
  16. cat > ../Scripts/A06a_star_mapping.sub
  17. #!/bin/bash
  18. #$ -cwd
  19. #$ -o sublogs/A06a_star.$JOB_ID.$TASK_ID
  20. #$ -j y
  21. #$ -l h_rt=12:00:00,h_data=8G,exclusive
  22. #$ -pe shared 8
  23. #$ -N A06a_star
  24. #$ -t 1-512
  25. #$ -hold_jid_ad A03a_trim
  26. echo "Job $JOB_ID.$SGE_TASK_ID started on: " `hostname -s`
  27. echo "Job $JOB_ID.$SGE_TASK_ID started on: " `date `
  28. echo " "
  29. # environment init -------------------------------------------------------------
  30. . /u/local/Modules/default/init/modules.sh # <--
  31. module load anaconda3 # <--
  32. conda activate snmCTseq # <--
  33. export $(cat snmCT_parameters.env | grep -v '^#' | xargs) # <--
  34. skip_complete=true # <-- for help with incomplete jobs
  35. overwrite_partial=true # <-- for help with incomplete jobs
  36. # (most of the) STAR settings
  37. # originally adapted from ENCODE guidelines
  38. star_params="--runThreadN 8 \
  39. --genomeDir ${ref_starfolder} --genomeLoad LoadAndKeep \
  40. –alignEndsType EndToEnd --outSAMtype BAM Unsorted \
  41. --outSAMattributes NH HI AS NM MD --outSAMstrandField intronMotif \
  42. --sjdbOverhang 149 --outFilterType BySJout \
  43. --outFilterMultimapNmax 20 --alignSJoverhangMin 8 \
  44. --alignSJDBoverhangMin 1 –outFilterMismatchNmax 999 \
  45. --outFilterMismatchNoverLmax 0.04 --alignIntronMin 20 \
  46. --alignIntronMax 1000000 --alignMatesGapMax 1000000 --readFilesCommand zcat "
  47. # extract target filepaths -----------------------------------------------------
  48. # helper functions
  49. query_metadat () {
  50. awk -F',' -v targetcol="$1" \
  51. 'NR==1 {
  52. for (i=1;i<=NF;i++) {
  53. if ($i==targetcol) {assayout=i; break} }
  54. print $assayout
  55. }
  56. NR>1 {
  57. print $assayout
  58. }' ${metadat_well}
  59. }
  60. # extract target wells, print values for log
  61. batchnum=($(query_metadat "batchnum"))
  62. nwells=${#batchnum[@]}
  63. target_well_rows=()
  64. for ((row=1; row<=nwells; row++))
  65. do
  66. if [[ "${batchnum[$row]}" == "${SGE_TASK_ID}" ]]
  67. then
  68. target_well_rows+=($row)
  69. fi
  70. done
  71. # filepaths associated with target rows in well-level metadata -----------------
  72. wellprefix=($(query_metadat "wellprefix"))
  73. dir_well=($(query_metadat "A06a_dir_star"))
  74. # .fastqs for input to PE mapping (properly paired read pairs)
  75. fastq_r1p=($(query_metadat "A03a_fqgz_paired_R1"))
  76. fastq_r2p=($(query_metadat "A03a_fqgz_paired_R2"))
  77. # .fastqs for input to SE mapping, including singletons from trimming & unaligned in PE-mapping
  78. fastq_r1singletrim=($(query_metadat "A03a_fqgz_singletrim_R1"))
  79. fastq_r2singletrim=($(query_metadat "A03a_fqgz_singletrim_R2"))
  80. # temporary/intermediate mapping files -----------------------------------------
  81. # (expected output generated by STAR, given outname prefixes PE., SE1., SE2.)
  82. fastq_pe_unmap1=PE.Unmapped.out.mate1
  83. fastq_pe_unmap2=PE.Unmapped.out.mate2
  84. bam_pe=PE.Aligned.out.bam
  85. bam_se1=SE1.Aligned.out.bam
  86. bam_se2=SE2.Aligned.out.bam
  87. # run STAR mapping -------------------------------------------------------------
  88. if [[ ! -s mapping_star ]]
  89. then
  90. mkdir mapping_star
  91. fi
  92. cd ${dir_proj}/mapping_star
  93. # load genome index [5~10 min]
  94. # creates some apparent .log, .sam out despite just loading genome
  95. # so putting in mapping_star to keep these files in one place
  96. STAR --runThreadN 8 --genomeDir ${ref_starfolder} --genomeLoad LoadAndExit
  97. # loop through each well to map ------------------------------------------------
  98. for row in ${target_well_rows[@]}
  99. do
  100. # check directory/prior mapping --------------------------------------------
  101. cd ${dir_proj}
  102. # check for existing mapping output
  103. # if final outputs exist, skip; else run mapping .bam
  104. if [[ -s ${dir_well[$row]}/${bam_pe} \
  105. && -s ${dir_well[$row]}/${bam_se1} \
  106. && -s ${dir_well[$row]}/${bam_se2} \
  107. && "${skip_complete}"=="true" ]]
  108. then
  109. echo -e "final aligned .bams for '${wellprefix[$row]}' already exist. skipping this well.'"
  110. else
  111. echo -e "\n\napplying STAR to '${wellprefix[$row]}'...\n\n"
  112. # remove old directory if one exists to deal with incomplete files
  113. # albeit the only issue i've seen are .bai and .tbi indices
  114. # (these often are not overwritten by software in the pipeline,
  115. # resulting in "index is older than file" errors later on)
  116. if [[ -e ${dir_well[$row]} && "${overwrite_partial}" == "true" ]]
  117. then
  118. echo -e "\n\nWARNING: folder for '${wellprefix[$row]}' exists, but not its final .bam alignments."
  119. echo "because overwrite_partial=true, deleting the directory and re-mapping."
  120. rm -rf ${dir_well[$row]}
  121. fi
  122. mkdir ${dir_well[$row]}
  123. cd ${dir_well[$row]}
  124. # run alignments -----------------------------------------------------------
  125. # in: .fastqs from trimming: four .fastqs,
  126. # properly paired ($fastq_r2p, $fastq_r1p) and
  127. # trimming singletons ($fastq_r1singletrim, $fastq_r2singletrim)
  128. # out: - paired-end, single-end .bam alignments out (${bam_pe}, ${bam_se1}, ${bam_se2})
  129. # - key log files (e.g., mapping rate)
  130. # --------------------------------------------------------------------------
  131. # (i) paired-end mapping [<1-3 min] ----------------------------------------
  132. # assumptions: pairs that map ambiguously in paired-end mode should be discarded
  133. STAR ${star_params} \
  134. --outFileNamePrefix PE. \
  135. --readFilesIn ${dir_proj}/${fastq_r1p[$row]} ${dir_proj}/${fastq_r2p[$row]} \
  136. --outReadsUnmapped Fastx
  137. # .fq --> .fq.gz for future storage/help match STAR's expected input type [<1-2 min]
  138. bgzip ${fastq_pe_unmap1}
  139. bgzip ${fastq_pe_unmap2}
  140. # (ii.) single-end, R1 [<1-3 min] ------------------------------------------
  141. # includes Read 1 singletons from trimming and STAR mapping in (i)
  142. STAR ${star_params} \
  143. --outFileNamePrefix SE1. \
  144. --readFilesIn ${dir_proj}/${fastq_r1singletrim[$row]},${fastq_pe_unmap1}.gz
  145. # (iii.) single-end, R2 [<1-3 min] -----------------------------------------
  146. # includes Read 2 singletons from trimming and STAR mapping in (i)
  147. STAR ${star_params} \
  148. --outFileNamePrefix SE2. \
  149. --readFilesIn ${dir_proj}/${fastq_r2singletrim[$row]},${fastq_pe_unmap2}.gz
  150. # (iv.) optional clean-up (comment out as desired)
  151. # *.Log.final.out contains mapping rate; other *.out
  152. # have STAR internals that can be discarded
  153. rm -rf *_STARtmp
  154. rm -rf *SJ.out.tab
  155. rm "${fastq_pe_unmap1}.gz" "${fastq_pe_unmap2}.gz"
  156. fi
  157. done
  158. # unload genome from mem at end ------------------------------------------------
  159. STAR --genomeDir ${ref_starfolder} --genomeLoad Remove
  160. echo -e "\n\n'A06a_star_mapping' completed.\n\n"
  161. echo "Job $JOB_ID.$SGE_TASK_ID ended on: " `hostname -s`
  162. echo "Job $JOB_ID.$SGE_TASK_ID ended on: " `date `
  163. echo " "
  164. # %% [markdown]
  165. # ## (A06b) star filtering
  166. # %%
  167. %%bash
  168. cat > ../Scripts/A06b_classify_mCT_reads_STAR.pl
  169. #!/usr/bin/perl -w
  170. use strict;
  171. # A06b_classify_mCT_reads_STAR.pl, v0.2 =====================================================
  172. # based loosely on original perl script written by Dr. Chongyuan Luo (@luogenomics)
  173. # modifications by Choo Liu (@chooliu):
  174. # - readability/documentation
  175. # - changes in logic for paired-end mapping (fwd/rev strand) & more efficient parsing of MD:Z flag
  176. # incl looking at only C/G positions in read vs. ref changes, calculating # cytosines, etc
  177. # inputs: - .sam file from STAR (compatible with single-end or paired-end alignments)
  178. # outputs: - "_annotations" .tsv recording each alignment's:
  179. # number of cytosines, mC/C fraction, and call (DNA, RNA, ambiguous)
  180. # this annotation file is subsequently appended to the. bam to keep RNA reads
  181. # typical usage: perl A06b_classify_mCT_reads_STAR.pl alignments.sam
  182. # =====================================================================================
  183. # reading in .sam file
  184. my ($samfile)=($ARGV[0]);
  185. my @sample; my @samline;
  186. my $read; my @read; my @ref; my $ref; my @md; my $dir; my $unmch;
  187. # determining read classification
  188. my $filter_num_CH=3;
  189. my $filter_frac_mCHmin=0.5; # DNA (mCH/CH <0.5)
  190. my $filter_frac_mCHmax=0.9; # RNA (mCH/CH >0.9)
  191. my $mch_fraction; my $totalch; my $totcpg; my @call;
  192. # load .sam file, loop through lines in .sam
  193. # exports info on each read to "(input .sam file name)_annotations"
  194. # for each line in .sam file, --------------------------------------------------------
  195. # count unmethylated and methylated cytosines in CHG and CHH context based on XR-tag
  196. # notes:
  197. # - skip header header rows (starting with @)
  198. # - assumes the XR-tag is in column 10 (STAR output), $samline[9]
  199. # - currently ignores indels
  200. # - default settings: keep reads with >=3 CHNs and mCHN/CHN fraction >=0.9 [*]
  201. # at present, we only retain call="RNA" and discard all others
  202. open sam_in, "$samfile" or die $!;
  203. open sam_annotations, ">$samfile\_annotations" or die $!;
  204. while (<sam_in>)
  205. {
  206. chop $_;
  207. if (substr($_,0,1) eq '@') { print sam_annotations "\n"; }
  208. else
  209. {
  210. @samline = split(/\t/,$_);
  211. $read = $samline[9];
  212. @read = split(//,$read);
  213. @ref = @read;
  214. @md=split( /(\d+)/ , $samline[15]);
  215. # check mapping orientation relative to reference genome ----------------------------
  216. # dir=1 if fwd (99, 163, 0, 73), =0 if reverse (147, 83, 16, 89)
  217. # flaw in script is that these numbers manually specified--if see strange results,
  218. # check mapping output for other flags before filtering / add interpreter
  219. $dir = 0 + ( ($samline[1] eq 99) or ($samline[1] eq 163 ) or ($samline[1] eq 0) or ($samline[1] eq 73) );
  220. # compare read to reference genome --------------------------------------------------
  221. # split MD:Z: flag by numbers then examine resulting length
  222. # e.g., MD:Z:10A0B121 --> MD:Z: 10 A 0 B 121 has $num_md_features=5
  223. # assume fully methylated if perfect match to genomic ref
  224. # (if MD stores a single number indicating no changes, $#md = 1)
  225. my $unmch = 0;
  226. my $num_md_features=$#md;
  227. if ($num_md_features == 1) { }
  228. # <-- start ELSE for num_md_features != 1
  229. # otherwise, attempt to reconstruct reference sequence,
  230. # looping through positions in read where the read != ref nucleotide
  231. else {
  232. my $pos=0;
  233. for (my $i=1; $i<=$num_md_features; $i += 2) {
  234. # loop through bases where there are changes
  235. $pos = $pos + @md[$i];
  236. # do nothing if starts with "^" (deletion)
  237. # modify @ref sequence if differences
  238. if ( (rindex("@md[$i+1]", "^", 0) == 0) or ($i+1 > $num_md_features)) { }
  239. else {
  240. @ref[$pos] = @md[$i + 1];
  241. }
  242. # increment base by 1
  243. $pos += 1;
  244. }
  245. # tabulate # unmethylated cytosines ---------------------------------------------------
  246. # again looping through each position where read != ref
  247. # (although same loop as above, re-loop because potential cases where adjacent bases differ btwn ref & read)
  248. my $pos=0;
  249. for (my $i=1; $i<=$num_md_features; $i += 2) {
  250. $pos = $pos + @md[$i];
  251. # if read maps to forward strand of genome
  252. # check if at a CH-site, and unmethylated cytosine converted to "T"
  253. if ( ($dir eq 1) and
  254. (@ref[$pos] eq "C") and (@ref[$pos + 1] ne "G") and (@read[$pos] eq "T") ) {
  255. $unmch += 1;
  256. }
  257. # if read maps to reverse strand of genome
  258. # STAR rev compliments the $read sequence, so cytosines are represented by "G"
  259. # check if at a CH-site, and unmethylated cytosine converted to "A"
  260. # (note: mCH underestimated in niche case where dir=0 &
  261. # first base is cytosine, as @ref[$pos - 1] is undefined)
  262. if ( ($dir eq 0) and
  263. (@ref[$pos] eq "G") and (@ref[$pos - 1] ne "C") and (@read[$pos] eq "A") ) {
  264. $unmch += 1;
  265. }
  266. $pos += 1;
  267. }
  268. } # <-- end ELSE statement for num_md_features != 1
  269. $ref = join('', @ref);
  270. # count cytosines in CH-context --------------------------------------------------
  271. # note: since done via regex, faster to count [# C] and subtract [# CG] vs searching wild flag C[ACT]
  272. if ($dir eq 1) {
  273. my @totalch = $ref =~ /C/g;
  274. $totalch = scalar @totalch;
  275. my @totcpg = $ref =~ /CG/g;
  276. $totcpg = scalar @totcpg;
  277. }
  278. if ($dir eq 0) {
  279. my @totalch = $ref =~ /G/g;
  280. $totalch = scalar @totalch;
  281. my @totcpg = $ref =~ /CG/g;
  282. $totcpg = scalar @totcpg;
  283. }
  284. my $totalch = $totalch - $totcpg;
  285. # classify each read into modalities ----------------------------------------------
  286. if ($totalch==0) { # avoid div by zero error
  287. $mch_fraction=-999;
  288. @call="amb";
  289. } else {
  290. $mch_fraction = 1 - ($unmch/$totalch);
  291. if (($totalch>=$filter_num_CH) and ($mch_fraction < $filter_frac_mCHmin)) { @call="DNA"; }
  292. elsif (($totalch>=$filter_num_CH) and ($mch_fraction >= $filter_frac_mCHmax)) { @call="RNA"; }
  293. else { @call="amb"; } # exclude (low # CH or ambiguous mCH between 0.5-0.9)
  294. }
  295. print sam_annotations "${totalch}\t${mch_fraction}\t@call\n";
  296. }
  297. }
  298. close bam_in;
  299. # %%
  300. %%bash
  301. cat > ../Scripts/A06b_star_filtering.sub
  302. #!/bin/bash
  303. #$ -cwd
  304. #$ -o sublogs/A06b_starfilt.$JOB_ID.$TASK_ID
  305. #$ -j y
  306. #$ -l h_rt=6:00:00,h_data=16G
  307. #$ -N A06b_starfilt
  308. #$ -t 1-512
  309. #$ -hold_jid_ad A06a_star
  310. echo "Job $JOB_ID.$SGE_TASK_ID started on: " `hostname -s`
  311. echo "Job $JOB_ID.$SGE_TASK_ID started on: " `date `
  312. echo " "
  313. # environment init -------------------------------------------------------------
  314. . /u/local/Modules/default/init/modules.sh # <--
  315. module load anaconda3 # <--
  316. conda activate snmCTseq # <--
  317. export $(cat snmCT_parameters.env | grep -v '^#' | xargs) # <--
  318. skip_complete=true # <-- for help with incomplete jobs
  319. # extract target filepaths -----------------------------------------------------
  320. # helper functions
  321. query_metadat () {
  322. awk -F',' -v targetcol="$1" \
  323. 'NR==1 {
  324. for (i=1;i<=NF;i++) {
  325. if ($i==targetcol) {assayout=i; break} }
  326. print $assayout
  327. }
  328. NR>1 {
  329. print $assayout
  330. }' ${metadat_well}
  331. }
  332. # extract target wells, print values for log
  333. batchnum=($(query_metadat "batchnum"))
  334. nwells=${#batchnum[@]}
  335. target_well_rows=()
  336. for ((row=1; row<=nwells; row++))
  337. do
  338. if [[ "${batchnum[$row]}" == "${SGE_TASK_ID}" ]]
  339. then
  340. target_well_rows+=($row)
  341. fi
  342. done
  343. # filepaths associated with target rows in well-level metadata -----------------
  344. wellprefix=($(query_metadat "wellprefix"))
  345. dir_well=($(query_metadat "A06a_dir_star"))
  346. # set naming convention within each well folder --------------------------------
  347. # .bam files in (from A06a)
  348. bam_in_pe=PE.Aligned.out.bam
  349. bam_in_se1=SE1.Aligned.out.bam
  350. bam_in_se2=SE2.Aligned.out.bam
  351. # de-duplicated .bam
  352. bam_dedupe_pe=pe_dedupe.bam
  353. bam_dedupe_se1=se1_dedupe.bam
  354. bam_dedupe_se2=se2_dedupe.bam
  355. # de-duplication logs
  356. picard_log_pe=star_dedupe_pe.log
  357. picard_log_se1=star_dedupe_se1.log
  358. picard_log_se2=star_dedupe_se2.log
  359. # final .sam
  360. sam_q10_pe=q10_pe.sam
  361. sam_q10_se1=q10_se1.sam
  362. sam_q10_se2=q10_se2.sam
  363. # final .bam
  364. bam_final_pe=PE.Final.bam
  365. bam_final_se1=SE1.Final.bam
  366. bam_final_se2=SE2.Final.bam
  367. # map each well
  368. for row in ${target_well_rows[@]}
  369. do
  370. # check directory/prior mapping -------------------------------------------
  371. # check for existing mapping output
  372. # if final outputs exist, skip; else run filtering of direct STAR align
  373. cd ${dir_proj}
  374. if [[ -s ${dir_well[$row]}/${bam_final_pe} \
  375. && -s ${dir_well[$row]}/${bam_final_se1} \
  376. && -s ${dir_well[$row]}/${bam_final_se2} \
  377. && "${skip_complete}"=="true" ]]
  378. then
  379. echo -e "final aligned .bams for '${wellprefix[$row]}' already exist. skipping this well.'"
  380. else
  381. echo -e "\n\napplying STAR to '${wellprefix[$row]}'...\n\n"
  382. cd ${dir_proj}/${dir_well[$row]}
  383. # proceed if all input files exist
  384. if [[ -s ${bam_in_pe} && -s ${bam_in_se1} && -s ${bam_in_se2} ]]
  385. then
  386. # clear intermediate files (if not all of them exist)
  387. rm ${bam_final_pe} ${bam_final_se1} ${bam_final_se2} 2>&1 >/dev/null
  388. # run RNA filtering -------------------------------------------------------
  389. # in: three .bams from STAR mapping: $bam_in_* (paired-end, single-end read 1, read 2)
  390. # out: - MAPQ and f ($bam_final_*)
  391. # - key log files (e.g., mapping rate)
  392. # -------------------------------------------------------------------------
  393. # STAR will output singletons in .bam file
  394. # (e.g., read 2 maps but read 1 doesn't; samtools view -f 8 ${bam_in_pe})
  395. # hence the "-f 0x0002" flag for "proper pairs" only, and SE alignments merged with...
  396. # in later sections, "-f 0x0048" (the read is R1; it mapped but R2 mate didn't map)
  397. # and "-f 0x0088" (the read is R2; it mapped but R1 mate didn't map)
  398. # if both R1 & R2 of pair need to pass filtering criteria (AND instead of OR),
  399. # needs an added annotations --> wide step like the below
  400. # sed '$!N;s/\n/ /' ${sam_q10_pe}_annotations \
  401. # | awk '{print ( ($3 == "RNA") && ($6 == "RNA") )}' \
  402. # | awk '{print $0}1' > ${sam_q10_pe}_annotations_bothpairs
  403. # then awk filter off of this 'bothpairs' file
  404. # each step usually ~3-5 min
  405. # (i) paired-end
  406. picard MarkDuplicates -I ${bam_in_pe} \
  407. --ASSUME_SORT_ORDER "queryname" --OPTICAL_DUPLICATE_PIXEL_DISTANCE 2500 \
  408. --ADD_PG_TAG_TO_READS false --REMOVE_DUPLICATES \
  409. -O ${bam_dedupe_pe} -M ${picard_log_pe}
  410. samtools view -h -q 10 -f 0x0002 ${bam_dedupe_pe} > ${sam_q10_pe}
  411. perl ${dir_proj}/Scripts/A06b_classify_mCT_reads_STAR.pl ${sam_q10_pe}
  412. awk 'NR == FNR { if ($0=="" || $3=="RNA") line[NR]; next } (FNR in line)' \
  413. ${sam_q10_pe}_annotations ${sam_q10_pe} |
  414. samtools view -b - | samtools sort - > ${bam_final_pe}
  415. samtools index ${bam_final_pe}
  416. # (ii) single-end, read 1
  417. picard MarkDuplicates -I ${bam_in_se1} \
  418. --ASSUME_SORT_ORDER "queryname" --OPTICAL_DUPLICATE_PIXEL_DISTANCE 2500 \
  419. --ADD_PG_TAG_TO_READS false --REMOVE_DUPLICATES \
  420. -O ${bam_dedupe_se1} -M ${picard_log_se1}
  421. samtools view -h -q 10 ${bam_dedupe_se1} > ${sam_q10_se1}
  422. perl ${dir_proj}/Scripts/A06b_classify_mCT_reads_STAR.pl ${sam_q10_se1}
  423. awk 'NR == FNR { if ($0=="" || $3=="RNA") line[NR]; next } (FNR in line)' \
  424. ${sam_q10_se1}_annotations ${sam_q10_se1} |
  425. samtools view -b - | samtools sort - > ${bam_final_se1}
  426. samtools index ${bam_final_se1}
  427. # (iii) single-end, read 2
  428. picard MarkDuplicates -I ${bam_in_se2} \
  429. --ASSUME_SORT_ORDER "queryname" --OPTICAL_DUPLICATE_PIXEL_DISTANCE 2500 \
  430. --ADD_PG_TAG_TO_READS false --DUPLICATE_SCORING_STRATEGY RANDOM --REMOVE_DUPLICATES \
  431. -O ${bam_dedupe_se2} -M ${picard_log_se2}
  432. samtools view -h -q 10 ${bam_dedupe_se2} > ${sam_q10_se2}
  433. perl ${dir_proj}/Scripts/A06b_classify_mCT_reads_STAR.pl ${sam_q10_se2}
  434. awk 'NR == FNR { if ($0=="" || $3=="RNA") line[NR]; next } (FNR in line)' \
  435. ${sam_q10_se2}_annotations ${sam_q10_se2} |
  436. samtools view -b - | samtools sort - > ${bam_final_se2}
  437. samtools index ${bam_final_se2}
  438. # (iv.) optional clean-up (comment out as desired)
  439. rm ${bam_dedupe_pe} ${bam_dedupe_se1} ${bam_dedupe_se2}
  440. rm ${sam_q10_pe} ${sam_q10_se1} ${sam_q10_se2}
  441. # rm *annotations
  442. fi
  443. fi
  444. done
  445. echo -e "\n\n'A06b_star_filtering' completed.\n\n"
  446. echo "Job $JOB_ID.$SGE_TASK_ID ended on: " `hostname -s`
  447. echo "Job $JOB_ID.$SGE_TASK_ID ended on: " `date `
  448. echo " "
  449. # %% [markdown]
  450. # ## (A06b) check star output
  451. # %%
  452. %%bash
  453. cat > ../Scripts/A06c_check_star.sub
  454. #!/bin/bash
  455. #$ -cwd
  456. #$ -o sublogs/A06c_check_star.$JOB_ID
  457. #$ -j y
  458. #$ -l h_rt=1:00:00,h_data=8G
  459. #$ -N A06c_starcheck
  460. #$ -hold_jid A06a_star
  461. echo "Job $JOB_ID started on: " `hostname -s`
  462. echo "Job $JOB_ID started on: " `date `
  463. echo " "
  464. # environment init -------------------------------------------------------------
  465. export $(cat snmCT_parameters.env | grep -v '^#' | xargs) # <--
  466. # helper functions / extract target filepaths ----------------------------------
  467. query_metadat () {
  468. awk -F',' -v targetcol="$1" \
  469. 'NR==1 {
  470. for (i=1;i<=NF;i++) {
  471. if ($i==targetcol) {assayout=i; break} }
  472. print $assayout
  473. }
  474. NR>1 {
  475. print $assayout
  476. }' ${metadat_well}
  477. }
  478. check_filepaths_in_assay() {
  479. for file in $@
  480. do
  481. if [[ ! -s ${file} ]]
  482. then
  483. echo "missing '${file}'"
  484. fi
  485. done
  486. }
  487. check_filepath_by_batch() {
  488. target_array=($@)
  489. batches_to_rerun=()
  490. for ((target_batch=1; target_batch<=nbatches; target_batch++))
  491. do
  492. target_well_rows=()
  493. for ((row=1; row<=nwells; row++))
  494. do
  495. if [[ "${batchnum[$row]}" == "${target_batch}" ]]
  496. then
  497. target_well_rows+=($row)
  498. fi
  499. done
  500. batch_file_list=${target_array[@]: ${target_well_rows[0]}:${#target_well_rows[@]} }
  501. num_files_missing=$(check_filepaths_in_assay ${batch_file_list[@]} | wc -l)
  502. if [[ ${num_files_missing} > 0 ]]
  503. then
  504. batches_to_rerun+=(${target_batch})
  505. echo -e "${target_batch} \t ${num_files_missing}"
  506. fi
  507. done
  508. if [[ ${#batches_to_rerun[@]} > 0 ]]
  509. then
  510. echo "batches to re-run:"
  511. echo "${batches_to_rerun[*]}"
  512. fi
  513. }
  514. batchnum=($(query_metadat "batchnum"))
  515. nwells=${#batchnum[@]}
  516. nbatches=${batchnum[-1]}
  517. # apply checks for A06a output -------------------------------------------------
  518. echo "-----------------------------------------------------------------"
  519. echo "A. printing number of missing STAR mapping .bam files missing (by batch)... "
  520. echo "-----------------------------------------------------------------"
  521. bam_star_pe=($(query_metadat "A06a_bam_star_PE"))
  522. bam_star_se1=($(query_metadat "A06a_bam_star_SE1"))
  523. bam_star_se2=($(query_metadat "A06a_bam_star_SE2"))
  524. echo -e "\n\n\nchecking PE.Aligned.out.bam ----------------------------------------------------"
  525. echo -e "batchnum\tnum_missing"
  526. check_filepath_by_batch ${bam_star_pe[@]}
  527. echo -e "\n\n\nchecking SE1.Aligned.out.bam ---------------------------------------------------"
  528. echo -e "batchnum\tnum_missing"
  529. check_filepath_by_batch ${bam_star_se1[@]}
  530. echo -e "\n\n\nchecking SE2.Aligned.out.bam ---------------------------------------------------"
  531. echo -e "batchnum\tnum_missing"
  532. check_filepath_by_batch ${bam_star_se2[@]}
  533. echo "-----------------------------------------------------------------"
  534. echo "B. printing number of missing filtered .bam files missing (by batch)... "
  535. echo "-----------------------------------------------------------------"
  536. bam_starfilt_pe=($(query_metadat "A06b_bam_starfilt_PE"))
  537. bam_starfilt_se1=($(query_metadat "A06b_bam_starfilt_SE1"))
  538. bam_starfilt_se2=($(query_metadat "A06b_bam_starfilt_SE2"))
  539. echo -e "\n\n\nchecking PE.Final.out.bam ------------------------------------------------------"
  540. echo -e "batchnum\tnum_missing"
  541. check_filepath_by_batch ${bam_starfilt_pe[@]}
  542. echo -e "\n\n\nchecking SE1.Final.out.bam -----------------------------------------------------"
  543. echo -e "batchnum\tnum_missing"
  544. check_filepath_by_batch ${bam_starfilt_se1[@]}
  545. echo -e "\n\n\nchecking SE2.Final.out.bam -----------------------------------------------------"
  546. echo -e "batchnum\tnum_missing"
  547. check_filepath_by_batch ${bam_starfilt_se2[@]}
  548. echo -e "\n\n\nsuggest re-running and checking sublog output of above batches."
  549. echo -e "\n\n-----------------------------------------------------------------"
  550. echo "C. checking log files for issues."
  551. echo -e "-----------------------------------------------------------------\n"
  552. echo -e "\n\nchecking if 'completed' in sublogs/A06a_star* output."
  553. echo "if any filename is printed, the associated batch may have not completed mapping."
  554. grep -c "'A06a_star_mapping' completed" sublogs/A06a_star* | awk -F ":" '$2==0 {print $1}'
  555. echo -e "\n\nchecking if 'completed' is in sublogs/A06b_starfilt* output."
  556. echo "if any filename is printed, the associated batch may have not completed mapping."
  557. grep -c "A06b_star_filtering" sublogs/A06b_starfilt* | awk -F ":" '$2==0 {print $1}'
  558. echo -e "\n\nchecking if 'Exception' is in sublogs/A06b_starfilt* output."
  559. echo "if any filename is printed, may be issues with .bams from STAR mapping."
  560. echo "(e.g., stale file handle, premature end of file, unexpected compressed block length)"
  561. grep -c "Exception" sublogs/A06b_starfilt* | awk -F ":" '$2!=0 {print $1}'
  562. echo -e "\n\n'A06c_starcheck' completed.\n\n"
  563. echo "Job $JOB_ID ended on: " `hostname -s`
  564. echo "Job $JOB_ID ended on: " `date `
  565. echo " "
  566. # %% [markdown]
  567. # ## (A06d) feature counts
  568. # %%
  569. %%bash
  570. cat > ../Scripts/A06d_featurecounts.sub
  571. #!/bin/bash
  572. #$ -cwd
  573. #$ -o sublogs/A06d_featurecounts.$JOB_ID.$TASK_ID
  574. #$ -j y
  575. #$ -l h_rt=3:00:00,h_data=24G
  576. #$ -N A06d_featurecounts
  577. #$ -t 1-32
  578. #$ -hold_jid A06b_starfilt
  579. echo "Job $JOB_ID.$SGE_TASK_ID started on: " `hostname -s`
  580. echo "Job $JOB_ID.$SGE_TASK_ID started on: " `date `
  581. echo " "
  582. # environment init -------------------------------------------------------------
  583. . /u/local/Modules/default/init/modules.sh # <--
  584. module load anaconda3 # <--
  585. conda activate snmCTseq # <--
  586. export $(cat snmCT_parameters.env | grep -v '^#' | xargs) # <--
  587. dir_out_gene=featurecounts_gene/ # <--
  588. dir_out_exon=featurecounts_exon/ # <--
  589. quantify_exons="true" # <-- (typically we analyze combined exon+intron)
  590. # extract target filepaths -----------------------------------------------------
  591. # helper functions
  592. query_metadat () {
  593. awk -F',' -v targetcol="$1" \
  594. 'NR==1 {
  595. for (i=1;i<=NF;i++) {
  596. if ($i==targetcol) {assayout=i; break} }
  597. print $assayout
  598. }
  599. NR>1 {f
  600. print $assayout
  601. }' ${metadat_well}
  602. }
  603. # extract target wells, print values for log
  604. platenum=($(query_metadat "platenum"))
  605. nwells=${#platenum[@]}
  606. target_well_rows=()
  607. for ((row=1; row<=nwells; row++))
  608. do
  609. if [[ "${platenum[$row]}" == "${SGE_TASK_ID}" ]]
  610. then
  611. target_well_rows+=($row)
  612. fi
  613. done
  614. # filepaths associated with target rows in well-level metadata -----------------
  615. wellprefix=($(query_metadat "wellprefix"))
  616. dir_well=($(query_metadat "A06a_dir_star"))
  617. bam_pe=($(query_metadat "A06b_bam_starfilt_PE"))
  618. bam_se1=($(query_metadat "A06b_bam_starfilt_SE1"))
  619. bam_se2=($(query_metadat "A06b_bam_starfilt_SE2"))
  620. # extract valid .bam filepaths -------------------------------------------------
  621. # checks only if the .bam exists (otherwise featureCounts may terminate with error)
  622. # could also wrap in check that number of alignments in file is > 0
  623. # for greater future compatibility with featureCounts
  624. pe_files=$(
  625. for file in ${bam_pe[@]: ${target_well_rows[0] }:${#target_well_rows[@] } }
  626. do
  627. if [[ -s ${file} ]]
  628. then
  629. echo ${file}
  630. fi
  631. done)
  632. se1_files=$(
  633. for file in ${bam_se1[@]: ${target_well_rows[0] }:${#target_well_rows[@] } }
  634. do
  635. if [[ -s ${file} ]]
  636. then
  637. echo ${file}
  638. fi
  639. done)
  640. se2_files=$(
  641. for file in ${bam_se2[@]: ${target_well_rows[0] }:${#target_well_rows[@] } }
  642. do
  643. if [[ -s ${file} ]]
  644. then
  645. echo ${file}
  646. fi
  647. done)
  648. # featurecounts on genes -------------------------------------------------------
  649. # usually <1 min/well --> <1 hr/plate
  650. if [[ ! -s ${dir_out_gene} ]]
  651. then
  652. mkdir ${dir_out_gene}
  653. fi
  654. echo "running gene featureCounts on paired-end alignments (mapping_star/*/PE.Final.bam)."
  655. featureCounts -p -T 4 -t gene -a ${ref_gtf} \
  656. -o ${dir_out_gene}/PE_${SGE_TASK_ID} --donotsort --tmpDir ${dir_scratch} ${pe_files}
  657. echo "running gene featureCounts on single-end R1 alignments (mapping_star/*/SE1.Final.bam)."
  658. featureCounts -T 4 -t gene -a ${ref_gtf} \
  659. -o ${dir_out_gene}/SE1_${SGE_TASK_ID} --donotsort --tmpDir ${dir_scratch} ${se1_files}
  660. echo "running gene featureCounts on single-end R2 alignments (mapping_star/*/SE2.Final.bam)."
  661. featureCounts -T 4 -t gene -a ${ref_gtf} \
  662. -o ${dir_out_gene}/SE2_${SGE_TASK_ID} --donotsort --tmpDir ${dir_scratch} ${se2_files}
  663. # featurecounts on exons -------------------------------------------------------
  664. # usually <1 min/well --> <1 hr/plate
  665. if [[ ${quantify_exons} == "true" ]]
  666. then
  667. if [[ ! -s ${dir_out_exon} ]]
  668. then
  669. mkdir ${dir_out_exon}
  670. fi
  671. echo "running exon featureCounts on paired-end alignments (mapping_star/*/PE.Final.bam)."
  672. featureCounts -p -T 4 -t exon -a ${ref_gtf} \
  673. -o ${dir_out_exon}/PE_${SGE_TASK_ID} --donotsort --tmpDir ${dir_scratch} ${pe_files}
  674. echo "running exon featureCounts on single-end R1 alignments (mapping_star/*/SE1.Final.bam)."
  675. featureCounts -T 4 -t exon -a ${ref_gtf} \
  676. -o ${dir_out_exon}/SE1_${SGE_TASK_ID} --donotsort --tmpDir ${dir_scratch} ${se1_files}
  677. echo "running exon featureCounts on single-end R2 alignments (mapping_star/*/SE2.Final.bam)."
  678. featureCounts -T 4 -t exon -a ${ref_gtf} \
  679. -o ${dir_out_exon}/SE2_${SGE_TASK_ID} --donotsort --tmpDir ${dir_scratch} ${se2_files}
  680. fi
  681. echo -e "\n\n'A06d_featurecounts' completed.\n\n"
  682. echo "Job $JOB_ID.$SGE_TASK_ID ended on: " `hostname -s`
  683. echo "Job $JOB_ID.$SGE_TASK_ID ended on: " `date `
  684. echo " "
  685. # %% [markdown]
  686. # ## (A06e) final .bam stats like counts, % intergenic
  687. # %%
  688. %%bash
  689. cat > ../Scripts/A06e_star_bam_stats.sub
  690. #!/bin/bash
  691. #$ -cwd
  692. #$ -o sublogs/A06e_samstat_star.$JOB_ID.$TASK_ID
  693. #$ -j y
  694. #$ -l h_rt=2:00:00,h_data=24G
  695. #$ -N A06e_samstat_star
  696. #$ -t 1-512
  697. #$ -hold_jid_ad A06b_starfilt
  698. echo "Job $JOB_ID.$SGE_TASK_ID started on: " `hostname -s`
  699. echo "Job $JOB_ID.$SGE_TASK_ID started on: " `date `
  700. echo " "
  701. # environment init -------------------------------------------------------------
  702. . /u/local/Modules/default/init/modules.sh # <--
  703. module load anaconda3 # <--
  704. conda activate snmCTseq # <--
  705. export $(cat snmCT_parameters.env | grep -v '^#' | xargs) # <--
  706. skip_complete=true # <-- for help with incomplete jobs
  707. # extract target filepaths -----------------------------------------------------
  708. # helper functions
  709. query_metadat () {
  710. awk -F',' -v targetcol="$1" \
  711. 'NR==1 {
  712. for (i=1;i<=NF;i++) {
  713. if ($i==targetcol) {assayout=i; break} }
  714. print $assayout
  715. }
  716. NR>1 {
  717. print $assayout
  718. }' ${metadat_well}
  719. }
  720. # extract target wells, print values for log
  721. batchnum=($(query_metadat "batchnum"))
  722. nwells=${#batchnum[@]}
  723. target_well_rows=()
  724. for ((row=1; row<=$nwells; row++))
  725. do
  726. if [[ "${batchnum[$row]}" == "${SGE_TASK_ID}" ]]
  727. then
  728. target_well_rows+=($row)
  729. fi
  730. done
  731. # filepaths associated with target rows in well-level metadata -----------------
  732. wellprefix=($(query_metadat "wellprefix"))
  733. dir_well=($(query_metadat "A06a_dir_star"))
  734. # samtools stats on each well in the batch -------------------------------------
  735. # usually <5 seconds per .bam --> <12 min/24 wells
  736. for row in ${target_well_rows[@]}
  737. do
  738. cd ${dir_proj}
  739. if [[ -s ${dir_well[$row]}/samstats_PE \
  740. && -s ${dir_well[$row]}/samstats_SE1 \
  741. && -s ${dir_well[$row]}/samstats_SE2 \
  742. && -s ${dir_well[$row]}/picard_PE \
  743. && -s ${dir_well[$row]}/picard_SE1 \
  744. && -s ${dir_well[$row]}/picard_SE2 ]]
  745. then
  746. echo -e "final metrics for '${wellprefix[$row]}' already exist."
  747. if [[ ${skip_complete} = "true" ]]
  748. then
  749. echo "skip_complete = true. skipping this well."
  750. continue
  751. else
  752. echo "but skip_complete = false. re-running this well."
  753. fi
  754. fi
  755. echo -e "\n\ngetting metrics for '${wellprefix[$row]}'...\n\n"
  756. cd ${dir_well[$row]}
  757. # run samtools stats
  758. samtools stats PE.Final.bam | grep '^SN' | cut -f 2,3 > samstats_PE
  759. samtools stats SE1.Final.bam | grep '^SN' | cut -f 2,3 > samstats_SE1
  760. samtools stats SE2.Final.bam | grep '^SN' | cut -f 2,3 > samstats_SE2
  761. # run picard CollectRnaSeqMetrics
  762. samtools sort PE.Final.bam | \
  763. picard CollectRnaSeqMetrics -I /dev/stdin -O picard_PE \
  764. --REF_FLAT ${ref_flat} -STRAND "NONE" --RIBOSOMAL_INTERVALS ${ref_rrna}
  765. samtools sort SE1.Final.bam | \
  766. picard CollectRnaSeqMetrics -I /dev/stdin -O picard_SE1 \
  767. --REF_FLAT ${ref_flat} -STRAND "NONE" --RIBOSOMAL_INTERVALS ${ref_rrna}
  768. samtools sort SE2.Final.bam | \
  769. picard CollectRnaSeqMetrics -I /dev/stdin -O picard_SE2 \
  770. --REF_FLAT ${ref_flat} -STRAND "NONE" --RIBOSOMAL_INTERVALS ${ref_rrna}
  771. done
  772. echo -e "\n\n'A06e_samstat_star' completed.\n\n"
  773. echo "Job $JOB_ID.$SGE_TASK_ID ended on: " `hostname -s`
  774. echo "Job $JOB_ID.$SGE_TASK_ID ended on: " `date `
  775. echo " "

A06_mapping_star.ipynb at commit 3a5f663, no license · at the source

Overview

Authors: Katherine W Eyring1, Cuining Liu2,3, Nasser Elhajjaoui3, Kevin D Abuhanna3, Yi Zhang3, Zachary von Behren3, Min Jen Tsai3, Eleazar Eskin3,4,5, Daniel H Geschwind1,3,6,7,8, Chongyuan Luo2,3
  1. Department of Neurology, David Geffen School of Medicine, University of California, Los Angeles, Los Angeles, CA 90095, USA
  2. Bioinformatics Interdepartmental Program, University of California, Los Angeles, Los Angeles, CA, USA
  3. Department of Human Genetics, David Geffen School of Medicine, University of California, Los Angeles, Los Angeles, CA 90095, USA
  4. Department of Computer Science, University of California, Los Angeles, Los Angeles, CA 90095, USA
  5. Department of Computational Medicine, University of California, Los Angeles, Los Angeles, CA 90095, USA
  6. Center for Autism Research and Treatment, Semel Institute, David Geffen School of Medicine, University of California, Los Angeles, Los Angeles, CA 90095, USA
  7. Department of Psychiatry, Semel Institute, David Geffen School of Medicine, University of California, Los Angeles, Los Angeles, CA 90095, USA
  8. Institute for Precision Health, University of California, Los Angeles, Los Angeles, CA 90095, USA
Institutions: University of California, Los Angeles (United States)
Journal: Cell genomics, volume 6, issue 7, article 101278
Dates: received 27 July 2025; accepted 19 May 2026; published online 19 June 2026; in print July 2026
Type: Research article · Language: English
License: CC BY-NC
Identifiers: DOI 10.1016/j.xgen.2026.101278 · PMID 42320469 · PMCID PMC13347942 · OpenAlex W7165370473
Open access: gold, a free copy (OpenAlex)
Status: code verified
Categories: genetics / omics (modality), human (organism), autism (population)
Methods: Connectivity, Statistics, Smoothing, state filtering, decompositions, Machine learning
Keywords: neuroscience, neurodevelopment, autism, ASD, DNA methylation, single-cell genomics, multi-omics
MeSH: Aging*, Autism Spectrum Disorder*, DNA Methylation*, Prefrontal Cortex*, Single-Cell Analysis*, Adolescent, Adult, Child, Child, Preschool, Epigenesis, Genetic, Female, Humans, Male, Neurons, Young Adult (* major topic)
Topic: Autism Spectrum Disorder Research (Cognitive Neuroscience, Neuroscience), according to OpenAlex
Funding: NIMH NIH HHS (R01 MH125252, U01 MH130995); National Institute of Mental Health
Citations: cited by 1 paper (Europe PMC); 139 references in the paper
Research resources: Illumina Novaseq 6000 RRID:SCR_016387, Beckman Biomek i7 liquid handler RRID:SCR_018094, TC20 Automated Cell Counter RRID:SCR_025462

Abstract

Autism spectrum disorder (ASD) is a heterogeneous neurodevelopmental condition. Studies of postmortem ASD brain tissue have revealed convergent molecular changes across the cortex. Whether these features are reflected in cell-type-specific epigenetic signatures is unknown. Here, we present a single-cell analysis of DNA methylation (DNAm) coupled with transcriptomics in ASD. Using snmCT-seq, we profiled DNAm and transcript levels from over 60,000 nuclei derived from the prefrontal cortex of 49 donors. We identified over 30,000 differentially methylated regions (DMRs) in ASD that were enriched in promoters and cell-type-specific regulatory elements active across the lifespan. ASD-related methylation changes were uncorrelated with transcript levels and were small in magnitude compared with age-associated effects. Age-DMRs were concentrated in excitatory neurons and revealed distinct roles for CG and non-CG methylation. Age-varying methylation signatures of ASD identified neuron projection development as a key process perturbed in ASD, highlighting the heterogeneous impact of ASD across the lifespan.

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

Repository

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

chooliu/snmCTseq_Pipeline

License: none: the authors keep all their rights
State: the link answers, verified on 27 September 2026
Evidence: files inventoried
Commit: 3a5f663678849c9cdd1f666d79135b11e9c19b70, 17 March 2024
Languages: Python (18), Jupyter (9), Perl (3)
Size: 69 files, 30 scripts
Software Heritage: not archived
Found in: “Data and code availability”
Holds: README, documentation, 9 notebooks
Not found: license file, CITATION.cff, environment file, tests, continuous integration
Tools: pandas (18 files), NumPy (4 files), SAMtools (3 files), FastQC (2 files), STAR (2 files), Subread (featureCounts) (1 file)
Availability: 1 check, the latest on 27 September 2026: the link answers
  • 27 September 2026: the link answers
31 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;
  • 30 scripts, each with its path and the digest of its content;
  • 6 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 and code availability

All original code has been deposited at https://github.com/chooliu/snmCTseq_Pipeline and is publicly available as of the date of publication.

Processed data have been deposited at GEO as series no. GSE298243 (https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE298243) and are publicly available as of June 17, 2025.

Controlled-access data are available here: https://assets.nemoarchive.org/dat-htywcnb.

Any additional information required to reanalyze the data reported in this paper is available from the lead contact upon request.

Reproduced under the paper's license (CC BY-NC), 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, 27 September 2026: the first record

Recorded: type, language, journal, volume, issue, pages, dates, 10 authors, 7 keywords, 15 MeSH terms, 2 funders, 130 references, 3 RRIDs.

Cite

This paper

Eyring, K. W., Liu, C., Elhajjaoui, N., Abuhanna, K. D., Zhang, Y., von Behren, Z., Tsai, M. J., Eskin, E., Geschwind, D. H., & Luo, C. (2026). Single-cell profiling of DNA methylation in autism spectrum disorder prefrontal cortex reveals distinct regulatory and aging signatures. Cell genomics, 6(7), 101278. https://doi.org/10.1016/j.xgen.2026.101278

BibTeX

@article{eyring2026single,
author = {Eyring, Katherine W and Liu, Cuining and Elhajjaoui, Nasser and Abuhanna, Kevin D and Zhang, Yi and von Behren, Zachary and Tsai, Min Jen and Eskin, Eleazar and Geschwind, Daniel H and Luo, Chongyuan},
title = {{Single-cell profiling of DNA methylation in autism spectrum disorder prefrontal cortex reveals distinct regulatory and aging signatures}},
journal = {Cell genomics},
year = {2026},
month = jun,
volume = {6},
number = {7},
pages = {101278},
publisher = {Elsevier},
issn = {2666-979X},
doi = {10.1016/j.xgen.2026.101278},
url = {https://doi.org/10.1016/j.xgen.2026.101278},
pmid = {42320469},
pmcid = {PMC13347942}
}

RIS

TY - JOUR
AU - Eyring, Katherine W
AU - Liu, Cuining
AU - Elhajjaoui, Nasser
AU - Abuhanna, Kevin D
AU - Zhang, Yi
AU - von Behren, Zachary
AU - Tsai, Min Jen
AU - Eskin, Eleazar
AU - Geschwind, Daniel H
AU - Luo, Chongyuan
TI - Single-cell profiling of DNA methylation in autism spectrum disorder prefrontal cortex reveals distinct regulatory and aging signatures
T2 - Cell genomics
J2 - Cell Genom
PY - 2026
DA - 2026/06/19
VL - 6
IS - 7
SP - 101278
SN - 2666-979X
PB - Elsevier
DO - 10.1016/j.xgen.2026.101278
UR - https://doi.org/10.1016/j.xgen.2026.101278
LA - en
ER -

CSL-JSON

{
"id": "10.1016/j.xgen.2026.101278",
"type": "article-journal",
"title": "Single-cell profiling of DNA methylation in autism spectrum disorder prefrontal cortex reveals distinct regulatory and aging signatures",
"container-title": "Cell genomics",
"author": [
{
"family": "Eyring",
"given": "Katherine W"
},
{
"family": "Liu",
"given": "Cuining"
},
{
"family": "Elhajjaoui",
"given": "Nasser"
},
{
"family": "Abuhanna",
"given": "Kevin D"
},
{
"family": "Zhang",
"given": "Yi"
},
{
"family": "von Behren",
"given": "Zachary"
},
{
"family": "Tsai",
"given": "Min Jen"
},
{
"family": "Eskin",
"given": "Eleazar"
},
{
"family": "Geschwind",
"given": "Daniel H"
},
{
"family": "Luo",
"given": "Chongyuan"
}
],
"container-title-short": "Cell Genom",
"volume": "6",
"issue": "7",
"page": "101278",
"DOI": "10.1016/j.xgen.2026.101278",
"PMID": "42320469",
"PMCID": "PMC13347942",
"ISSN": "2666-979X",
"publisher": "Elsevier",
"URL": "https://doi.org/10.1016/j.xgen.2026.101278",
"language": "en",
"issued": {
"date-parts": [
[
2026,
6,
19
]
]
}
}

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.1038/s41593-026-02247-7 [code]
Transcriptomic and phenotypic convergence of neurodevelopmental disorder risk genes in vitro and in vivo.
Journal: Nature neuroscience
In common: autism, genetics / omics, 12 references
[2] doi:10.1038/s42003-026-10059-5 [code]
Transcriptomic analysis in autism spectrum disorder suggests three molecular subtypes with distinct phenotypic profiles and functional pathways.
Journal: Communications biology
In common: FastQC, STAR, SAMtools, autism, genetics / omics, 6 references
[3] doi:10.1016/j.celrep.2026.117073 [code]
Single-cell epigenomics uncovers heterochromatin instability and transcription factor dysfunction during mouse brain aging.
Journal: Cell reports
In common: Subread (featureCounts), SAMtools, pandas, 1 other tool, genetics / omics, 7 references
[4] doi:10.1016/j.xhgg.2026.100652 [code]
CRISPR-engineered deletion of POGZ alters transcription factor binding at promoters of genes involved in synaptic signaling.
Journal: HGG advances
In common: STAR, SAMtools, pandas, 1 other tool, autism, 8 references
[5] 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: STAR, SAMtools, pandas, 1 other tool, autism, genetics / omics, 7 references
[6] doi:10.21203/rs.3.rs-9927928/v1 [code]
Genome-wide and allele-resolved maps of the radial architecture of the mouse genome
Journal: Research Square (preprint)
In common: FastQC, Subread (featureCounts), STAR, 3 other tools, genetics / omics, 4 references
[7] 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: FastQC, Subread (featureCounts), STAR, 3 other tools, genetics / omics, 4 references
[8] doi:10.1038/s41467-026-74320-5 [code]
Spatial architecture of autism pathogenesis reveals mosaic structural disarray during early development.
Journal: Nature communications
In common: pandas, NumPy, autism, genetics / omics, 9 references
[9] doi:10.1038/s41586-026-10512-9 [code]
Astrocyte glucocorticoid receptor signalling restricts neuronal plasticity.
Journal: Nature
In common: Subread (featureCounts), STAR, SAMtools, 2 other tools, 6 references
[10] doi:10.1038/s41586-026-10679-1 [code]
Cortical development dynamics across autism spectrum disorder mouse models.
Journal: Nature
In common: pandas, NumPy, autism, genetics / omics, 10 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.