Blood-based circular RNAs for early diagnosis of Alzheimer's disease.
The 2 matches
- [1] § Methods › Linear transcript identification ↔ linear_pipeline_circ_alignment/src/linear_RNA_pipeline.py, lines 318–325 · score 0.82 · Picard Collect RNA, Collect Alignment, Summary Metrics, linear RNA, FastQC, seq
- [2] § Methods › Linear transcript identification ↔ linear_pipeline_circ_alignment/src/run_Picard_QC.py, lines 24–36 · score 0.68 · Collect Alignment Summary, Picard Collect, Metrics, sequence, QC, linear
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 · 353 lines · 18 KB · no license · 1 match
- #!/usr/bin/env python3
- import argparse
- import logging
- import sys
- import shutil
- import re
- sys.path.append("/src")
- from fastq_to_ubam import *
- from run_STAR_js import align_STAR_normal, cram_samtools, index_samtools, sort_samtools, cram_samtools
- from run_Picard_QC import picard_collect_RNA_metrics, picard_collect_alignment_metrics, picard_mark_dups
- from run_Salmon import salmon_quant
- from run_tin import calc_tin
- from run_fastqc import fastqc_fastq_PE, fastqc_SE
- ################################################################################
- # Setup
- ################################################################################
- # Argparse to get all the input
- parser = argparse.ArgumentParser(description='Run linear RNAseq pipeline')
- # to do maybe make this one argument that sometimes needs two values
- parser.add_argument('-r1', '--raw_input', help='Path to raw data (Read 1 for PE data)', required = True)
- parser.add_argument('-r2', '--input_read_2', help = 'Path to raw data read 2 file for PE data')
- parser.add_argument('--sample', help = 'Sample name', required = True)
- # TODO maybe add a crammed option?
- parser.add_argument('--file_type', help = 'Input file type for -r1 and -r2', choices = ["ubam", "fastq", "bam"], required = True)
- parser.add_argument('--tmp_dir', help ='Path to directory for temporary files', required = True)
- parser.add_argument('--read_type', help = 'Paired end or Single end reads', choices = ['PE', 'SE'], required = True)
- parser.add_argument('--stranded', help = 'Include for strand specific libraries', default = "NONE", choices = ["NONE", "FIRST_READ_TRANSCRIPTION_STRAND", "SECOND_READ_TRANSCRIPTION_STRAND"])
- parser.add_argument('--cohort', help = 'Full RNAseq cohort name', required = True )
- parser.add_argument('--tissue', help = 'Sample tissue type for hydra dir path', choices = ['brain', 'blood_pax', 'ipsc', 'plasma', 'csf'])
- parser.add_argument('--STAR_index', help = "Path to the directory with the STAR genome index refernce", required = True)
- parser.add_argument('--ref_flat', help = "Path to reference annotation in flat format", required = True)
- parser.add_argument('--annotation', help = "Path to annotaiton file for Salmon", required = True)
- parser.add_argument('--annote_bed', help = "Path to annotation in bed format for TIN", required = True)
- parser.add_argument('--rib_int', help = "Ribosomal (rRNA) interval list", required = True)
- parser.add_argument('--transcripts', help = "Path to Salmon transcripts index", required = True)
- parser.add_argument('--adapter_seq', default = 'null', help ="Adapter sequence for picard")
- parser.add_argument('--out_dir', help = 'Directory for output', required = True)
- parser.add_argument('--out_struct', help = "Directory structure of output", default = 'none', choices = ['none', 'hydra'])
- parser.add_argument( '-d', '--delete',\
- nargs = '*',\
- choices = ["input", "aligned_bam", "aligned_sorted_bam", "bais", "STAR_extras", "ubam", "aligned_transcriptome_bam", "md_bam"],\
- help = 'Include to delete one or more following files: input files, .Aligned.out.bam, Aligned.sortedByCoord.out.bam, all .bai files,\
- ._STARgenome and ._STARpass1, _unmapped.bam, .Aligned.toTranscriptome.out.bam, and .Aligned.sortedByCoord.out.md.bam respectively')
- parser.add_argument('-c', '--cram', action = 'store_true', help = 'Cram the following bams: Aligned.sortedByCoord.out.md.bam')
- parser.add_argument('--ref', help = 'Path to reference genome fasta (for cramming)', required= True) # TODO change this to be required only when cramming
- parser.add_argument('--input_to_merge', help = 'Path to secondary input file to concatenate with primary input (ie MSBB which is separated into aligned and unaligend reads)')
- parser.add_argument('--merge_file_type', help = 'Input file type for --input_to_merge', choices = ["ubam", "fastq", "bam"], default = "fastq")
- args = parser.parse_args()
- if args.read_type == 'PE' and args.file_type == 'fastq' and args.input_read_2 is None:
- parser.error("--input_read_2 required if input is fastq and read type is PE")
- if args.out_struct == 'hydra' and args.tissue is None:
- parser.error("--tissue required if output structure is hydra")
- # Maybe make this an error later
- if args.raw_input == args.input_read_2:
- parser.error('--input_read_2 and --raw_input cannot be the same file. Please check input.')
- # set up logs
- log_file_name = args.cohort + '_linear_pipeline.log'
- log_path = os.path.join(args.out_dir, log_file_name)
- # Create logger
- linear_logs = logging.getLogger('linear_RNA_pipeline')
- linear_logs.setLevel(logging.DEBUG)
- # Handler 1: file for all info+ logs
- log_file = logging.FileHandler(log_path)
- file_format = logging.Formatter("%(asctime)s:%(levelname)s:%(message)s")
- log_file.setLevel(logging.INFO)
- log_file.setFormatter(file_format)
- # Handler 2: stream for all warning +
- stream = logging.StreamHandler()
- streamformat = logging.Formatter("%(levelname)s:%(module)s:%(message)s")
- stream.setLevel(logging.WARNING)
- stream.setFormatter(streamformat)
- # Add handlers to logs
- linear_logs.addHandler(log_file)
- linear_logs.addHandler(stream)
- ################################################################################
- # Pipeline Steps
- ################################################################################
- def check_refs_exist(star_ref, flat_ref, annot_ref, annot_bed_ref, rib_int_ref, transcript_ref):
- star_exists = os.path.exists(star_ref)
- flat_exists = os.path.exists(flat_ref)
- annot_exists = os.path.exists(annot_ref)
- annot_bed_exists = os.path.exists(annot_bed_ref)
- rib_int_exists = os.path.exists(rib_int_ref)
- transcript_exists = os.path.exists(transcript_ref)
- if not star_exists:
- sys.exit(f'STAR reference not found: {star_ref}, exiting')
- if not flat_exists:
- sys.exit(f'flat reference not found: {flat_ref}, exiting')
- if not annot_exists:
- sys.exit(f'Annotation not found: {annot_ref}, exiting')
- if not annot_bed_exists:
- sys.exit(f'Bed format annotation not found: {annot_bed_ref}, exiting')
- if not rib_int_exists:
- sys.exit(f'Ribosomal interval list not found: {rib_int_ref}, exiting')
- if not transcript_exists:
- sys.exit(f'Salmon transcripts index not found: {transcript_ref}, exiting')
- def create_out_dir(dir_to_create):
- already_exists = os.path.exists(dir_to_create)
- if not already_exists:
- os.makedirs(dir_to_create, exist_ok = True) #note this will make any dirs missing on the path
- def setup_output_dirs(output_struct, out_dir, cohort_name, tissue, sample_id):
- if output_struct == "hydra":
- if tissue == "brain":
- tissue_folder = "01-Brain"
- elif tissue == "blood_pax":
- tissue_folder = "02-Blood_PAXgene"
- elif tissue == "ipsc":
- tissue_folder = "03-iPSC"
- elif tissue == "plasma":
- tissue_folder = "04-Plasma"
- else:
- tissue_folder = "05-CSF"
- linear_logs.info(f'Setting up output structure to comply with Hydras dir structure and placing in {out_dir}')
- #If outstructure = hydra create paths for :
- # 02-Processed/<tissue>/<cohort>/01-FastQC/${SAMPLEID} -- fastqc.htlm, fastqc.zip, picard qc
- fastqc_out_dir = os.path.join(out_dir, '02-Processed/02-GRCh38/', tissue_folder, cohort_name, '01-FastQC', sample_id)
- create_out_dir(fastqc_out_dir)
- # 02-Processed/<tissue>/<cohort>/02-Linear_TIN/${SAMPLEID} -- .bam, .bai, .tin.csv, .tin.xls, salmon
- linear_tin_processed_dir = os.path.join(out_dir, '02-Processed/02-GRCh38/', tissue_folder, cohort_name, '02-Linear_TIN', sample_id)
- create_out_dir(linear_tin_processed_dir)
- output_dirs = {"fastqc": fastqc_out_dir, "linear_tin": linear_tin_processed_dir}
- else:
- print(f'Placing all output in dir: {out_dir}')
- output_dirs = {"fastqc": out_dir, "linear_tin": out_dir }
- return output_dirs
- def convert_to_ubam(out_dir, sample_name, file_type, read_type, raw_input, input_read_2, tmp_dir, rg_name = 'A'):
- ubam_out = os.path.join(out_dir, f"{sample_name}_unmapped.bam")
- if file_type == 'fastq':
- print('Converting fastq to ubam')
- if read_type == 'PE':
- print('Using ' + raw_input + ' and ' + input_read_2 +' as input for ummaped bam')
- fastq_to_ubam_PE(raw_input, input_read_2, ubam_out, sample_name, rg_name)
- star_input = ubam_out
- else:
- print('Converting single fq to unmapped bam')
- fastq_to_ubam_SE(raw_input, ubam_out, sample_name, rg_name)
- star_input = ubam_out
- elif args.file_type == 'bam':
- bam_to_ubam(raw_input, ubam_out, tmp_dir, by_readgroup = 'false'),
- star_input = ubam_out
- else:
- print('Input data already ubam, proceeding to alignment')
- star_input = raw_input
- return star_input
- def align_with_star(star_input, sample_name, read_type, STAR_index, out_dir, tmp_dir):
- out_prefix = os.path.join(out_dir, f'{sample_name}.')
- print('Aligning ubam with STAR')
- STAR_file_input = "SAM "+ read_type
- align_STAR_normal( star_input, out_prefix, STAR_file_input, STAR_index, tmp_dir)
- aligned_bam_out = f"{out_prefix}Aligned.out.bam"
- aligned_transcript_bam = f"{out_prefix}Aligned.toTranscriptome.out.bam"
- return (aligned_bam_out, aligned_transcript_bam)
- def sort(out_dir, sample_name, aligned_bam_in):
- print('Sorting with samtools')
- out_prefix = os.path.join(out_dir, sample_name)
- sort_samtools(aligned_bam_in, out_prefix)
- sorted_bam_out = f"{out_prefix}.Aligned.sortedByCoord.out.bam"
- return sorted_bam_out
- def index(sorted_bam_out):
- print('Indexing with samools')
- index_samtools(sorted_bam_out)
- indexed_bam_out = f"{sorted_bam_out}.bai"
- return indexed_bam_out
- def fastqc(out_dir, sample_name, input_file_type, input_read_type, raw_input, raw_input2):
- if input_file_type == 'fastq' and input_read_type == 'PE':
- fastqc_fastq_PE(raw_input, raw_input2, sample_name, out_dir)
- else:
- fastqc_SE(raw_input, sample_name, out_dir)
- def delete_extras(delete, sample_name, aligned_bam, sorted_bam, indexed_bam, STAR_dir, indexed_md_bam, merged_ubam, input_2, transcriptome_bam, md_bam):
- if delete is not None:
- print("Deleting files specified with --delete option")
- if 'input' in args.delete:
- print('Deleting input file(s)')
- os.remove(args.raw_input)
- linear_logs.info(f'Deleting file: {args.raw_input}')
- if args.input_read_2 is not None:
- os.remove(args.input_read_2)
- linear_logs.info(f'Deleting file: {input_2}')
- if 'aligned_bam' in args.delete:
- print('Deleting aligned bam')
- os.remove(aligned_bam)
- linear_logs.info(f'Deleting file: {aligned_bam}')
- if 'md_bam' in args.delete and args.cram is not True: # added cram qualification -- if cramming is turned on then this file won't exist
- print('Deleting md bam')
- os.remove(md_bam)
- linear_logs.info(f'Deleting file: {md_bam}')
- if 'aligned_sorted_bam' in args.delete:
- print('Deleting STAR aligned & sorted bam')
- os.remove(sorted_bam)
- linear_logs.info(f'Deleting file: {sorted_bam}')
- if 'bais' in args.delete:
- print('Deleting bai files')
- os.remove(indexed_bam)
- os.remove(indexed_md_bam)
- linear_logs.info(f'Deleting file: {indexed_bam} and {indexed_md_bam}')
- if 'ubam' in args.delete:
- print('Deleting unmapped bam file')
- unmapped_bam = os.path.join(STAR_dir, f"{sample_name}_unmapped.bam")
- os.remove(unmapped_bam)
- linear_logs.info(f'Deleting file: {unmapped_bam}')
- # remove the input to merge if it exists
- if input_2 is not None:
- os.remove(merged_ubam)
- unmapped_bam_input2 = os.path.join(STAR_dir, f"{sample_name}_input2_unmapped.bam")
- os.remove(unmapped_bam_input2)
- if 'STAR_extras' in args.delete:
- print('Deleting ._STARgenome and ._STARpass1')
- STAR_pass1 = os.path.join(STAR_dir, f"{sample_name}._STARpass1")
- STAR_genome = os.path.join(STAR_dir,f"{sample_name}._STARgenome" )
- shutil.rmtree(STAR_pass1)
- shutil.rmtree(STAR_genome)
- linear_logs.info(f'Deleting files: {STAR_pass1} and {STAR_genome}')
- if 'aligned_transcriptome_bam' in args.delete:
- print('Deleting STAR aligned to transcriptome bam file')
- os.remove(transcriptome_bam)
- linear_logs.info(f'Deleting file: {transcriptome_bam}')
- def cram_bams(cram, mark_dups_bam, ref, sample_name, out_dir ):
- if cram is True:
- print(f"Cramming {mark_dups_bam_out}")
- out_prefix = os.path.join(out_dir, sample_name)
- md_cram_out = f"{out_prefix}.Aligned.sortedByCoord.out.md.cram"
- cram_samtools(mark_dups_bam, md_cram_out, ref )
- linear_logs.info(f"Cramming: {mark_dups_bam}")
- #then delete the orginal bam
- linear_logs.info(f"Deleting {mark_dups_bam}")
- os.remove(mark_dups_bam)
- def get_MSBB_read_group(sample_name):
- #MSBB read group ID is just the sample name UNLESS it has a third _ in name -- then it is everything before this underscore
- regex = re.compile('^[^_]+_[^_]+_[^_]+')
- read_group_id = regex.findall(sample_name)[0]
- return read_group_id
- # Note: currently only setup to work with SE reads -- for MSBB
- def merge_files(out_dir, sample_name, input_1_ubam, input_2, input_2_file_type, read_type, read_2, tmp_dir):
- if input_2 is not None:
- # fix sample names so they are different
- sample_name_input2 = f"{sample_name}_input2"
- # convert second file to ubam (first file should already be)
- #get the read group for MSBB -- TODO probably should make this check if this is MSBB
- msbb_read_group = get_MSBB_read_group(sample_name)
- input_2_ubam = convert_to_ubam(out_dir, sample_name_input2, input_2_file_type, read_type, input_2, read_2, tmp_dir, msbb_read_group)
- # concatenate with samtools
- unmapped_cat_bam = os.path.join(out_dir, f"{sample_name}_input1_input2_cat.bam")
- concat_ubams(input_1_ubam, input_2_ubam, unmapped_cat_bam)
- return unmapped_cat_bam
- else:
- return input_1_ubam
- # 0.1 check all references exist (so that don't have to quit half way thorugh):
- check_refs_exist(args.STAR_index, args.ref_flat, args.annotation, args.annote_bed, args.rib_int, args.transcripts)
- # 0.2 Set up output paths -- have an option to have this automatically structure like hydra
- out_dirs = setup_output_dirs(args.out_struct, args.out_dir, args.cohort, args.tissue, args.sample)
- print(f'''Output locations: \n fastqc: {out_dirs["fastqc"]} \n linear and tin processed: {out_dirs["linear_tin"]}
- salmon quant: {out_dirs["linear_tin"]} \n tin_summary: {out_dirs["linear_tin"]}''')
- # 0.3 set up tmp dir -- include JOB ID in path to prevent conflicts
- tmp_dir_path = os.path.join(args.tmp_dir, os.getenv('LSB_JOBID'))
- create_out_dir(tmp_dir_path)
- print(f'''tmp location: {tmp_dir_path}''')
- # 1. Run fastqc (if we don't need to merge files first)
- if args.input_to_merge is None:
- fastqc(out_dirs["fastqc"], args.sample, args.file_type, args.read_type, args.raw_input, args.input_read_2)
- # 2. convert to Ubam (from fastq or aligned bam)
- ubam_out = convert_to_ubam(out_dirs["linear_tin"], args.sample, args.file_type, args.read_type, args.raw_input, args.input_read_2, tmp_dir_path)
- # 2.1 concatenate if needed
- merged_ubam_out = merge_files(out_dirs["linear_tin"], args.sample, ubam_out, args.input_to_merge, args.merge_file_type, args.read_type, args.input_read_2, tmp_dir_path)
- # 2.1.2 run fastqc on concatenated bams
- if args.input_to_merge is not None:
- fastqc(out_dirs["fastqc"], args.sample, "ubam", args.read_type, merged_ubam_out, args.input_read_2)
- # 3. Align with STAR
- aligned_bam_out, aligned_transcript_bam_out = align_with_star(merged_ubam_out, args.sample, args.read_type, args.STAR_index, out_dirs["linear_tin"], tmp_dir_path)
- # 4. samtools sort
- sorted_bam_out = sort(out_dirs["linear_tin"], args.sample, aligned_bam_out)
- # 5. samtools index
- indexed_bam_out = index(sorted_bam_out)
- # 6. Post Alignment Picard QC ( Collect RNAseq metrics, Collect Alignemt summary metrics, Mark dups)
- RNAseq_metrics_out = os.path.join(out_dirs["fastqc"], f"{args.sample}.RNA_Metrics.txt")
- picard_collect_RNA_metrics(sorted_bam_out, RNAseq_metrics_out, args.ref_flat, args.rib_int, tmp_dir_path, args.stranded)
- Alignment_metrics_out = os.path.join(out_dirs["fastqc"], f"{args.sample}.Summary_metrics.txt")
- picard_collect_alignment_metrics(sorted_bam_out, Alignment_metrics_out, tmp_dir_path, args.adapter_seq)
- mark_dups_bam_out = os.path.join(out_dirs["linear_tin"], f"{args.sample}.Aligned.sortedByCoord.out.md.bam")
- mark_dups_txt_out = os.path.join(out_dirs["fastqc"],f"{args.sample}.marked_dup_metrics.txt")
- picard_mark_dups(sorted_bam_out, mark_dups_bam_out, mark_dups_txt_out, tmp_dir_path )
- # 7. quantify with salmon
- salmon_out = os.path.join(out_dirs["linear_tin"],f'{args.sample}_salmon')
- salmon_quant(aligned_transcript_bam_out, salmon_out, args.annotation, args.transcripts)
- # 8. TIN
- # first index md bam
- indexed_md_bam_out = index(mark_dups_bam_out)
- #then run tin.py
- calc_tin(mark_dups_bam_out, args.annote_bed)
- # move summary tin ouput
- tin_summary_current = f"{args.sample}.Aligned.sortedByCoord.out.md.summary.txt"
- tin_summary_new_loc = os.path.join(out_dirs["linear_tin"], f"{args.sample}.Aligned.sortedByCoord.out.md.summary.txt")
- tin_xls_current = f"{args.sample}.Aligned.sortedByCoord.out.md.tin.xls"
- tin_xls_new_loc = os.path.join(out_dirs["linear_tin"], f"{args.sample}.Aligned.sortedByCoord.out.md.tin.xls")
- shutil.move(tin_summary_current, tin_summary_new_loc)
- shutil.move(tin_xls_current, tin_xls_new_loc)
- # cram bams
- cram_bams(args.cram, mark_dups_bam_out, args.ref, args.sample, out_dirs["linear_tin"])
- ## 9. Clean up
- # delete the intermediate files we don't normally keep -- as requested by user with --delete argument
- delete_extras(args.delete, args.sample, aligned_bam_out, sorted_bam_out, indexed_bam_out, out_dirs["linear_tin"], \
- indexed_md_bam_out, merged_ubam_out, args.input_to_merge, aligned_transcript_bam_out, mark_dups_bam_out)
linear_RNA_pipeline.py at commit c6fc549, no license · at the source
Overview
- Department of Psychiatry, Washington University School of Medicine, St. Louis, MO USA
- NeuroGenomics and Informatics Center, Washington University School of Medicine, St. Louis, MO USA
- Vanderbilt Memory and Alzheimer’s Center, Vanderbilt University Medical Center, Nashville, TN USA
- Department of Neurology, Vanderbilt University Medical Center, Nashville, TN USA
- Circular Genomics, San Diego, CA USA
- Department of Neurology, Massachusetts General Hospital, Harvard Medical School, Boston, MA USA
- Center for Alzheimer’s Research and Treatment, Brigham and Women’s Hospital, Harvard Medical School, Boston, MA USA
- School of Psychological Sciences, University of Melbourne, Melbourne, Victoria Australia
- Department of Neurology, Washington University School of Medicine, St. Louis, MO USA
- Department of Pathology and Immunology, Washington University School of Medicine, St. Louis, MO USA
- Knight Alzheimer Disease Research Center, Washington University School of Medicine, St. Louis, MO USA
- Department of Radiology, Washington University School of Medicine, St. Louis, MO USA
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.
Repository
Its files are read in the Code ↔ Paper reader above, with 2 matches between paragraphs and lines of code.
neurogenomicsandinformatics/rnaseq_pipeline
c6fc54934abcbc152f2df339a29fc07126cae036, 18 March 2026Availability: 1 check, the latest on 27 September 2026: the link answers
- 27 September 2026: the link answers
10 files
- circ_quant_DCC/
circFilter.py , Python, 157 lines - circ_quant_DCC/
genecount.py , Python, 325 lines - linear_pipeline_circ_ali
gnment/ , Python, 425 linessrc/ circ_RNA_pipeline.py - linear_pipeline_circ_ali
gnment/ , Python, 95 linessrc/ fastq_to_ubam.py - linear_pipeline_circ_ali
gnment/ , Python, 353 lines, 1 matchsrc/ linear_RNA_pipeline.py - linear_pipeline_circ_ali
gnment/ , Python, 55 lines, 1 matchsrc/ run_Picard_QC.py - linear_pipeline_circ_ali
gnment/ , Python, 114 linessrc/ run_STAR_js.py - linear_pipeline_circ_ali
gnment/ , Python, 19 linessrc/ run_Salmon.py - linear_pipeline_circ_ali
gnment/ , Python, 38 linessrc/ run_fastqc.py - linear_pipeline_circ_ali
gnment/ , Python, 14 linessrc/ run_tin.py
Code availability statement
The paper has a code availability statement. Its license (CC BY-NC-ND) does not allow reproducing it here; in short, from what the harvester recognized in it:
- it points to the authors' code: neurogenomicsandinformat
ics/ rnaseq_pipeline
Read it in the paper: doi.org/10.1038/s41591-026-04485-5.
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;
- 10 scripts, each with its path and the digest of its content;
- 2 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
No dataset and no data link were found in the paper.
Data availability statement
The paper has a data availability statement. Its license (CC BY-NC-ND) does not allow reproducing it here; in short, from what the harvester recognized in it:
- no repository, dataset or request procedure was recognized in it
Read it in the paper: doi.org/10.1038/s41591-026-04485-5.
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
- Publisher: n/a → Nature Portfolio
Version 1, 27 September 2026: the first record
Recorded: type, language, journal, volume, issue, pages, dates, 25 authors, 4 keywords, 11 MeSH terms, 3 funders, 39 references.
Cite
This paper
Phillips, B., Sanford, J., Janve, V. A., Liu, M., Johnson, M., Gong, K., Bergmann, K., Lowery, J., Flynn, A., Brock, W., Montejo, B. S., Sykora, N., Budde, J., Mellios, N., Papageorgiou, G., Sperling, R. A., Buckley, R. F., Seto, M., Morris, J. C., . . . Cruchaga, C. (2026). Blood-based circular RNAs for early diagnosis of Alzheimer's disease. Nature medicine, 32(8), 2857-2864. https://
BibTeX
@article{phillips2026blo
author = {Phillips, Bridget and Sanford, Jessie and Janve, Vaibhav A and Liu, Menghan and Johnson, Matt and Gong, Katherine and Bergmann, Kristy and Lowery, Joseph and Flynn, Allison and Brock, William and Montejo, Brenda Sanchez and Sykora, Nicholas and Budde, John and Mellios, Nikolaos and Papageorgiou, Grigorios and Sperling, Reisa A and Buckley, Rachel F and Seto, Mabel and Morris, John C and Perlmutter, Joel S and Kotzbauer, Paul T and Perrin, Richard J and Hohman, Timothy J and Ibanez, Laura and Cruchaga, Carlos},
title = {{Blood-based circular RNAs for early diagnosis of Alzheimer's disease}},
journal = {Nature medicine},
year = {2026},
month = jul,
volume = {32},
number = {8},
pages = {2857--2864},
publisher = {Nature Portfolio},
issn = {1078-8956},
doi = {10.1038/
url = {https://
pmid = {42387213},
pmcid = {PMC13472853}
}
RIS
TY - JOUR
AU - Phillips, Bridget
AU - Sanford, Jessie
AU - Janve, Vaibhav A
AU - Liu, Menghan
AU - Johnson, Matt
AU - Gong, Katherine
AU - Bergmann, Kristy
AU - Lowery, Joseph
AU - Flynn, Allison
AU - Brock, William
AU - Montejo, Brenda Sanchez
AU - Sykora, Nicholas
AU - Budde, John
AU - Mellios, Nikolaos
AU - Papageorgiou, Grigorios
AU - Sperling, Reisa A
AU - Buckley, Rachel F
AU - Seto, Mabel
AU - Morris, John C
AU - Perlmutter, Joel S
AU - Kotzbauer, Paul T
AU - Perrin, Richard J
AU - Hohman, Timothy J
AU - Ibanez, Laura
AU - Cruchaga, Carlos
TI - Blood-based circular RNAs for early diagnosis of Alzheimer's disease
T2 - Nature medicine
J2 - Nat Med
PY - 2026
DA - 2026/
VL - 32
IS - 8
SP - 2857
EP - 2864
SN - 1078-8956
PB - Nature Portfolio
DO - 10.1038/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1038/
"type": "article-journal",
"title": "Blood-based circular RNAs for early diagnosis of Alzheimer's disease",
"container-title": "Nature medicine",
"author": [
{
"family": "Phillips",
"given": "Bridget"
},
{
"family": "Sanford",
"given": "Jessie"
},
{
"family": "Janve",
"given": "Vaibhav A"
},
{
"family": "Liu",
"given": "Menghan"
},
{
"family": "Johnson",
"given": "Matt"
},
{
"family": "Gong",
"given": "Katherine"
},
{
"family": "Bergmann",
"given": "Kristy"
},
{
"family": "Lowery",
"given": "Joseph"
},
{
"family": "Flynn",
"given": "Allison"
},
{
"family": "Brock",
"given": "William"
},
{
"family": "Montejo",
"given": "Brenda Sanchez"
},
{
"family": "Sykora",
"given": "Nicholas"
},
{
"family": "Budde",
"given": "John"
},
{
"family": "Mellios",
"given": "Nikolaos"
},
{
"family": "Papageorgiou",
"given": "Grigorios"
},
{
"family": "Sperling",
"given": "Reisa A"
},
{
"family": "Buckley",
"given": "Rachel F"
},
{
"family": "Seto",
"given": "Mabel"
},
{
"family": "Morris",
"given": "John C"
},
{
"family": "Perlmutter",
"given": "Joel S"
},
{
"family": "Kotzbauer",
"given": "Paul T"
},
{
"family": "Perrin",
"given": "Richard J"
},
{
"family": "Hohman",
"given": "Timothy J"
},
{
"family": "Ibanez",
"given": "Laura"
},
{
"family": "Cruchaga",
"given": "Carlos"
}
],
"container-title-short":
"volume": "32",
"issue": "8",
"page": "2857-2864",
"DOI": "10.1038/
"PMID": "42387213",
"PMCID": "PMC13472853",
"ISSN": "1078-8956",
"publisher": "Nature Portfolio",
"URL": "https://
"language": "en",
"issued": {
"date-parts": [
[
2026,
7,
1
]
]
}
}
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/s41467-026-71682-8 [code]
- GWAS meta-analysis of cerebrospinal fluid Alzheimer's biomarkers reveals loci regulating lipids, brain volume and autophagy.Journal: Nature communicationsIn common: NumPy, Alzheimer's / dementia, genetics / omics, 1 reference, 4 authors
- [2] doi:10.1038/s41588-026-02722-8 [code]
- A multiancestry polygenic risk score for Alzheimer's disease is associated with cognitive decline and neuropathological hallmarks in diverse populations.Journal: Nature geneticsIn common: Alzheimer's / dementia, genetics / omics, 3 references, 2 authors
- [3] doi:10.64898/2026.05.06.26352540 [code]
- Generating synthetic tau-PET scans in Alzheimer’s disease from MRI, blood biomarkers and demographics with deep learningJournal: medRxiv (preprint)In common: NumPy, Alzheimer's / dementia, clinical / translational, 4 references
- [4] doi:10.1038/s41467-026-74515-w [code]
- Advancing fair and explainable machine learning for neuroimaging dementia pattern classification in multi-racial and multi-ethnic populations.Journal: Nature communicationsIn common: NumPy, Alzheimer's / dementia, 1 reference, author Timothy Hohman
- [5] doi:10.1093/brain/awaf375 [code]
- Reference proteins to improve Core 1 and Core 2 Alzheimer's disease CSF and plasma biomarkers.Journal: Brain : a journal of neurologyIn common: NumPy, Alzheimer's / dementia, clinical / translational, 4 references
- [6] doi:10.1186/s13195-026-02119-z
- Age-dependent diagnostic and correlational architecture of multiplex plasma biomarkers in Alzheimer's disease: a cross-ethnic, cross-platform validation study.Journal: Alzheimer's research & therapyIn common: Alzheimer's / dementia, clinical / translational, 4 references
- [7] doi:10.1038/s44400-026-00094-8 [code]
- Haplotype-resolved DNA methylation at the &
lt;i& gt;APOE& lt;/ i& gt; locus identifies allele-specific epigenetic signatures relevant to Alzheimer's disease risk. Journal: NPJ dementiaIn common: pysam, NumPy, Alzheimer's / dementia, genetics / omics, 2 references - [8] doi:10.3389/fneur.2026.1822479 [code]
- Circulating neuron-derived cfDNA for blood-based detection of Alzheimer's and other neurodegenerative conditions.Journal: Frontiers in neurologyIn common: pysam, NumPy, Alzheimer's / dementia, clinical / translational, genetics / omics, 1 reference
- [9] doi:10.1038/s41586-026-10454-2 [code]
- White matter micro- and macrostructure brain charts for the human lifespan.Journal: NatureIn common: NumPy, author Timothy Hohman
- [10] doi:10.1007/s00401-026-03042-1
- Tau368 improves p-tau diagnostic accuracy for FTLD-tau from FTLD-TDP.Journal: Acta neuropathologicaIn common: Alzheimer's / dementia, clinical / translational, 3 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.
Claim this paper
Correct its record
Say what each link of this record is, remove the ones that are not the paper's, add the ones that are missing. The correction becomes a new version of the record, in its Versions section.
Validate its tracing map
You validate the map as this page shows it: 1 repository of the authors' code, each at its verified commit and with its license, 10 scripts, and 2 matches between paragraphs and code (see the Code and Map sections). It then receives a DOI on Zenodo, with you (your ORCID iD) and OSCR as its creators; the code itself is not deposited.
The map's fingerprint: sha256:a8066ce769f61ad6…
Add the badge to its README
The badge links the code to this page. Copy one of these into the README of the paper's code: only you decide where it goes, and nothing is changed for you.
Markdown
[, paste the snippet at the top, then “Commit changes…” and, to review it first, “Create a new branch and start a pull request”. You open the pull request; OSCR asks for no permission.
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.
