做启动子相关研究的人,几乎都经历过这个场面:从某个数据库里下了一段“启动子序列”,实验做完才发现方向是反的,或者坐标版本对不上,又或者拿到的其实只是转录本的一部分。我早期也在这上面栽过跟头,后来把整套取启动子序列的流程理顺之后才明白,大部分问题都出在一件事上——没在UCSC里先把启动子的边界定义清楚。这篇就来聊聊我日常怎么用UCSC高效获取启动子序列:怎么从基因名快速定位到转录起始位点(TSS),怎么用浏览器视图和Table Browser两种方式提取序列,怎么一次性批量拿几十上百个基因的启动子,以及我踩过的一些坑和校验套路。内容兼顾生信入门者和经常做启动子克隆、转录因子结合位点预测、启动子区变异筛查的实验研究人员,拿到手就能照着操作。1. 启动子序列这件事,为什么绕不开UCSC1.1 启动子不是一个“一键下载”的固定对象很多人以为启动子就是基因上游某一段固定长度的序列,比如“上游2000 bp”,输个坐标就能拿到。实际操作起来远没这么简单——启动子不是一个数据库里标注好的“实体”,而是转录起始位点(TSS)上游和下游的一段调控区域,不同数据库、不同转录本注释给出的TSS可能相差几十到几百个碱基。同一条染色体上,同一个基因经常有多个转录本(isoform),每个转录本都可能拥有自己的TSS和启动子区域。哪怕你指定“chr1:1000-3000”这样一个坐标区间,得到的也只是这段位置的基因组序列,至于这段序列算不算某个基因的启动子,取决于你以哪个转录本的TSS为锚点。所以“取启动子序列”的正确第一步,永远是先确定你关心的是哪个TSS、哪个转录本,然后在这个锚点上定义上下游边界。绕开这个前提直接去爬序列,后面大概率要返工。1.2 为什么我优先用UCSC,而不是NCBI或EnsemblNCBI Gene可以查到基因坐标,Ensembl也能下载启动子序列,但我日常还是最常用UCSC,原因是它的操作路径更贴近“先定TSS,再取序列”这个逻辑。对比项UCSC Genome BrowserNCBI GeneEnsemblTSS定位速度输入基因名直接跳到转录本结构,多个isoform并列展示能看到转录本信息,但要逐层点进细节页定位准确,但页面层级较多序列导出Table Browser一键输出FASTA,自动处理方向一般需要手工确认区域和链向有序列下载入口,批量不如Table Browser顺手调控注释同屏TSS旁边就是CpG岛、组蛋白修饰、转录因子ChIP-seq等track注释分散也有调控track,但配置稍复杂批量获取支持粘贴ID列表,一次输出上百条序列不便批量可用BioMart,但学习成本更高可重复性配置可以保存Session,便于复现一般一般UCSC的Table Browser在批量导出序列时,会自动按基因方向返回上游序列,这一点非常省事。相比之下,在NCBI里取负链基因的启动子,经常要自己手动做反向互补,一不留神就反了。1.3 拿到启动子之后要做什么之所以强调“高效获取”,是因为启动子序列从来不是终点,而是很多实验和分析的共同起点。最常见的用途包括:启动子克隆加荧光素酶报告基因实验,验证某个片段有没有转录活性;转录因子结合位点预测,把FASTA喂给JASPAR或MEME Suite扫描motif;启动子区SNP或变异筛查,看突变落在哪个可能的调控元件上;启动子甲基化检测引物设计,需要精确定位CpG岛附近区域;还有近几年比较火的CRISPR干扰启动子筛选,也需要以启动子坐标为基础设计sgRNA。在这些场景里,序列的边界、方向、版本一旦出错,后面所有分析都会跟着错。所以下面的内容重点放在“如何拿得对、拿得全、拿得快”上。2. 从基因名到启动子坐标:先理清边界再取序列2.1 三个关键概念:转录本、TSS、上游方向在动手操作UCSC之前,我建议先把三个概念在脑子里过一遍。第一个是转录本。同一个基因可以转录出多个mRNA异构体,UCSC里会按RefSeq、Ensembl等来源列出多个ID。不同转录本的起始外显子可能不同,TSS就不同,启动子区域也因此不同。所以取序列前要明确“以哪个转录本为准”。第二个是TSS。转录起始位点是启动子坐标的锚点。通常说的“上游2000 bp”,指的是TSS上游2000 bp,不是基因最左边坐标往左2000 bp。正链基因的TSS坐标是起始位点,负链基因的TSS位于基因结构的最右侧,取上游时实际坐标是递减方向。第三个最容易出错:上游方向。很多人在浏览器里看到一个负链基因,直接复制“chr1:1000-2000”这段正链坐标的序列,然后拿去设计引物,结果把基因的“下游”当成了“上游”。原因就在于这段坐标对应的序列是基因组正链的序列,而负链基因的启动子是以负链为模板转录的,正链坐标提取出的序列和实际启动子序列正好是反向互补关系。2.2 第一步操作:在UCSC里定位目标转录本和TSSUCSC定位操作的完整路径并不复杂,但每一个选项都有讲究。打开UCSC Genome Browser主页,点击顶部“Genomes”下拉框,先选物种,再选基因组版本。人类数据最常用的是GRCh38/hg38,老一些的项目可能用GRCh37/hg19。这里一定要记下版本号,后面所有坐标都基于这个版本。在搜索框输入基因名或转录本ID。基因名输入后会出现匹配下拉列表,如果多个物种有同名的基因,注意物种标识。输入RefSeq登录号(比如带NM_前缀的编号)则能直接锁定某个具体转录本。点击进入基因详情页,页面会展示该基因的多个转录本结构,以及它们在染色体上的起止坐标和链向。每个转录本条目下能看到CDS、UTR、外显子位置。从转录本列表里找到你打算用的那个。判断标准通常是:是否带NM_前缀的代表性转录本,是否有“reviewed”或“canonical”标记,是否在你的研究体系里被文献经常引用。记录该转录本的起始坐标、终止坐标、TSS坐标和链方向。2.3 第二步操作:圈定启动子区间有了TSS,就可以定义启动子区间了。不同研究目的对区间长度的需求不一样。如果只是做转录因子结合位点预测,取TSS上游2000 bp(即-2000到-1)基本够用,很多数据库和工具也默认这个范围。如果要做启动子克隆和报告基因实验,强烈建议把区间取为TSS上游2000 bp到TSS下游200 bp左右,也就是-2000到+200。因为核心启动子元件通常分布在TSS上下游几十个碱基内,只取上游容易把Inr、DPE这类元件切掉,克隆出来的片段转录活性显著下降。坐标换算很简单。假设某个正链转录本的TSS位于chr1:12,345,678(虚拟位置举例),取-2000到+200的区间就是:起点:chr1:12,343,678终点:chr1:12,345,878如果基因在负链,TSS在转录本最右侧,则“上游”是坐标递减的方向,-2000区域对应的坐标是TSS坐标减2000。这里务必先做一次正向和反向验证,再进入序列提取环节。3. 两种取序列的路径:浏览器视图与Table Browser批处理3.1 路径一:浏览器里调整窗口,用“DNA”功能导出FASTA单基因、临时查看、想同时确认启动子区域在基因组上的上下文时,我一般直接用浏览器视图提取,操作最快。把2.3算好的坐标区间输入UCSC页面上方的位置框,比如“chr1:12,343,678-12,345,878”,点击“go”跳转。窗口会居中显示这段区域。此时注意观察轨道里基因模型的方向箭头——如果基因是负链,箭头应该指向左侧,这时候取到的“正向”序列仍然不是启动子的模板链序列。接下来点击顶部菜单栏“View”下的“DNA”,或者直接点工具栏里的“DNA”按钮。弹出的对话框中最重要的选项是“Mask repeats and lower-case”:如果要做PCR引物设计或克隆,记得选择不要屏蔽重复序列,也就是让输出尽量保留原始大写的A/T/G/C。重复序列被转成小写并不会改变序列本身,但会给引物设计软件带来干扰。点击“Submit”后会得到一段FASTA。标题行包含坐标和链信息,序列就是该坐标区间的单链DNA序列。如果想要反向互补序列,网页上通常也有对应选项,或者拿到序列后用其他工具处理一下。这条路径适合一两个基因的快速提取,它的最大优点是直观——你能眼睁睁看到取出的区域对不对、基因方向对不对。缺点是如果要做几十个基因,一天都在重复点击,效率太低。3.2 路径二:Table Browser参数化导出序列当任务变成“按基因列表批量取启动子序列”,我会改用Table Browser,操作可重复、参数明确、一次能处理大量基因。进入UCSC主页后点击“Tools”菜单下的“Table Browser”,然后按下面的参数设置:设置项推荐取值说明cladeMammal按物种分类选择genomeHuman(或其他物种)与你的实验一致assemblyGRCh38/hg38和定位TSS时保持同一个版本groupGenes and Gene Prediction Tracks找基因注释类数据trackNCBI RefSeq常用基因注释来源,ID稳定region坐标区间或粘贴基因ID列表根据任务选择output formatsequence输出序列不是表格Sequence Retrieval Method5' upstream按基因方向取上游序列upstream bases2000需要多长就填多少设置完点击“get output”后,会进入序列检索选项页。把“Sequence Retrieval Method”选成“5' upstream”,填入上游碱基数2000,然后提交。工具会按基因所在链的方向自动提取TSS上游指定长度的序列,并自动处理反向互补。这一步是Table Browser最有价值的地方:你不用自己判断正链负链,工具返回的就是以基因为方向的上游序列。拿到FASTA后,每条序列的标题会带上基因ID和坐标信息,保存成文本即可。3.3 什么时候用哪条路径我的习惯是:1到3个基因,用浏览器视图路径,边看边取,心里踏实;10个以上基因,直接上Table Browser;如果是需要反复更新的长期项目,把Table Browser的配置保存到UCSC Session里,下次直接调用。这里也提醒一句,Table Browser的region如果选“position”,一次只能输入一个区间。真要批量处理,要用它的“paste IDs”模式,具体操作在下一节展开。4. 高通量场景:几十个基因的启动子批量获取与下游衔接4.1 批量思路一:在Table Browser里粘贴基因ID列表需要一次性取几十个基因的启动子时,不建议用region里的“position”逐条输入坐标,而是用Table Browser的标识符列表模式。在region下拉框里选择“define regions”,然后选择“paste IDs”。此时可以输入一组RefSeq基因ID或基因名,每行一个。UCSC会识别这些ID并映射到对应的基因组区间。粘贴完成后,其余输出设置不变,仍然选择“sequence”格式,Sequence Retrieval Method选“5' upstream”,填好碱基数。提交后返回的FASTA文件里包含全部基因的上游序列,每条的标题行带着基因ID,方便后续按ID拆分。我实测过几百个基因的规模,这个方式一次也能完成,只是输出页面的加载时间会长一些。如果网络环境不稳,建议把列表拆成几十个一组分批提交,避免超时报错。输出结果保存为本地文本文件,就是一个可以直接给下游工具用的启动子序列集。4.2 批量思路二:先导坐标表,再用脚本从本地基因组提取如果不想每次取序列都依赖网页交互,或者后续要做更灵活的分析(比如同时提取-2000到+200的区域、不同基因用不同长度),可以在Table Browser里把基因坐标表导成BED格式,再用脚本从本地基因组序列文件里提取。之所以推荐BED坐标表,因为它是一个标准格式,染色体、起止位置、链方向都在同一行,可以被很多工具和处理流程复用。导出BED时,在Table Browser的output format里选“BED”,得到的内容类似:chr1 12343678 12345878 geneX 0 + chr2 987654 989654 geneY 0 -拿到BED后,可以用pyfaidx读取本地基因组FASTA,按每条记录起止切片,负链记录做reverse complement,然后写成统一的FASTA。下面是示意代码,步骤不复杂:from pyfaidx import Fasta genome = Fasta("hg38.fa") promoter_length = 2000 results = [] # bed_lines: 从BED文件读入的 [chrom, start, end, name, score, strand] for chrom, start, end, name, _, strand in bed_lines: if strand == "+": seq = genome[chrom][start-promoter_length:start] else: seq = genome[chrom][end:end+promoter_length] # 负链取上游,实际坐标为[end, end+length],再反向互补 seq = str(seq.reverse_complement()) results.append(f">{name}|{chrom}:{start}-{end}|{strand}\n{seq}")这段代码的关键在于负链的处理逻辑:负链基因的启动子位于转录本坐标的右侧,所以切片要切在end和end+length之间,然后对整个片段做reverse complement,得到以负链为方向的上游序列。用本地脚本的好处是可追溯、可重现,整个提取过程完全由坐标表驱动,不容易受网页改版影响。缺点是需要先准备对应版本的基因组FASTA文件,这个文件可以从公共数据源下载,第一次准备时多花点时间,后续一劳永逸。4.3 拿到批量序列后怎么衔接下游工具批量拿到FASTA后,先别急着丢进分析工具,花两分钟检查一下文件里每条序列的标题和长度。我见过不少情况,基因ID列表里混入了某个基因的非编码转录本,导致输出序列对应的是非启动子区域。做完基本检查后,就可以按目的接入下游了。做引物设计,把序列给Primer3或Primer-BLAST,设计时注意避开SNP位点;做转录因子结合位点预测,取TSS上游500 bp到下游50 bp这个更保守的区域,提交给MEME Suite或JASPAR;做启动子区变异注释,把启动子坐标区间提取出来,用VEP或ANNOVAR注释;做克隆,则直接把FASTA序列加酶切位点合成引物。这里有个容易被忽略的细节:批量FASTA的下游处理工具,大部分按序列标题中的ID来跟踪来源。因此在导出时就要保证ID可读,比如包含基因名和坐标。如果默认的标题格式里只有一串字母数字编号,建议先解析文件,重命名后再继续,否则后面很难回溯哪条序列属于哪个基因。5. 启动子提取的常见坑与校验方法5.1 方向坑:负链基因的启动子最容易拿反我在第2章提过这个坑,但因为它太常见,值得单独拿出来讲。负链基因的转录方向是染色体坐标递减方向,它的“上游”序列位于转录本在浏览器显示位置的右侧,也就是坐标更大的那一边。很多人取序列时习惯复制浏览器里显示的坐标区间,但浏览器默认显示的是正链方向。如果直接拿这个区间的序列去设计上游引物,等于把启动子序列完全反向了。用Table Browser的“5' upstream”功能可以避免这个问题,因为它会自动按基因方向处理。实在要用浏览器视图取序列,取完后务必确认输出结果的标题里有strand信息,或者手动做一次反向互补再使用。5.2 版本坑:hg19还是hg38,坐标差几千甚至几十万碱基不同基因组版本之间的坐标差异,可能只有几个碱基,也可能相距甚远,完全取决于基因组结构在那个区域有没有大的重排。我见过有人在一个项目里混合使用hg19注释的启动子坐标和hg38版本的基因组序列,最后实验发现PCR条带位置完全不对。怎么核对版本?最简单是看UCSC页面左上角的assembly标签,或者看BLAT结果里的版本信息。如果项目里多人协作,建议在文件名、记录表里统一标明版本号。启动子坐标表里加一列“assembly”写上hg38或hg19,能避免后面很多麻烦。5.3 多转录本坑:同一个基因,不同TSS对应不同启动子基因的多个转录本不只影响注释ID,也直接改变TSS和启动子区间。选择不同的TSS,得到的上游序列可能完全不同。特别是基因结构复杂、有多个转录起始外显子时,启动子区域可能相差数万碱基。遇到这种情况,我的处理原则是:优先选择代表功能蛋白的经典转录本,例如RefSeq里带NM_前缀的主要转录本,或Ensembl标注为canonical的转录本。如果课题关注某特定组织或细胞类型里的表达,还要结合这个细胞里实际表达的转录本异构体来判断,不要盲目套用一个永远“最经典”的TSS。5.4 序列内容坑:小写重复区域、N碱基和个体SNP从UCSC输出序列时,如果保留了默认的重复序列屏蔽设置,Alu、LINE等重复区域会被转成小写。小写本身无害,但有些工具会把小写区域当低质量数据,或者在做引物设计时错误避开。如果目的是拿完整序列,建议在DNA输出页面选择不屏蔽。另一个更麻烦的是基因组组装空缺,某些区域在参考基因组里就是一连串的N。如果启动子刚好落在这种gap区,扩增引物可能根本没有扩增产物,这时候要换个转录本或者明确记录数据缺失。还有一点容易忽略:参考基因组序列是共识序列,不等于你手上样本的序列。启动子区的单个SNP可能影响转录因子结合位点,也可能让PCR引物错配。设计引物时尽量在引物位置排除群体频率较高的SNP,可以用dbSNP或Ensembl VEP做一次快速筛查。5.5 一套稳妥的校验链路每次提取完启动子序列,我都建议走一遍校验链路,步骤不多但能拦住绝大多数低级错误。第一步是BLAT回帖。把提取的序列粘贴到UCSC的BLAT工具里,查看结果是否落回预期的染色体位置,链方向是否和预期一致。正链基因的启动子序列回帖后应该显示在正链,负链基因如果做了正确的反向互补,回帖后应该显示在负链,坐标和来源位置一致。第二步是交叉对比。从Ensembl或NCBI的对应区域下载同样长度的序列,和UCSC结果做比对。一般启动子区域保守性不如编码区,但两套数据库在同版本下的坐标一致,序列完全可以对齐。第三步是实验验证。如果是做克隆实验,最后判断标准仍然是PCR产物条带大小是否正确、克隆测序结果是否与参考序列一致。这一步没有多说的余地,序列本身对不对,跑一次PCR就知道。我在实际使用中最深的体会是:取启动子序列这件事,80%的错误不是操作问题,而是概念模糊——没确认TSS,没确认版本,没确认链方向。把这几个点先理清楚,UCSC的取序列功能几乎是零门槛的。最后再分享一个不常见的小技巧。每次取启动子序列时,哪怕你只需要上游2000 bp,也建议顺手把区间延伸到TSS下游的100到200 bp。很多启动子克隆片段活性差,不是启动子不够长,而是TSS下游的Inr、DPE等核心启动子元件被丢掉了。我后来统一取-2000到+200,实验稳定了很多。如果你现在还只取上游序列,下次可以试试这个边界,尤其在报告基因实验里,差异会非常明显。
做启动子相关研究的人,几乎都经历过这个场面:从某个数据库里下了一段“启动子序列”,实验做完才发现方向是反的,或者坐标版本对不上,又或者拿到的其实只是转录本的一部分。我早期也在这上面栽过跟头,后来把整套取启动子序列的流程理顺之后才明白,大部分问题都出在一件事上——没在UCSC里先把启动子的边界定义清楚。这篇就来聊聊我日常怎么用UCSC高效获取启动子序列:怎么从基因名快速定位到转录起始位点(TSS),怎么用浏览器视图和Table Browser两种方式提取序列,怎么一次性批量拿几十上百个基因的启动子,以及我踩过的一些坑和校验套路。内容兼顾生信入门者和经常做启动子克隆、转录因子结合位点预测、启动子区变异筛查的实验研究人员,拿到手就能照着操作。1. 启动子序列这件事,为什么绕不开UCSC1.1 启动子不是一个“一键下载”的固定对象很多人以为启动子就是基因上游某一段固定长度的序列,比如“上游2000 bp”,输个坐标就能拿到。实际操作起来远没这么简单——启动子不是一个数据库里标注好的“实体”,而是转录起始位点(TSS)上游和下游的一段调控区域,不同数据库、不同转录本注释给出的TSS可能相差几十到几百个碱基。同一条染色体上,同一个基因经常有多个转录本(isoform),每个转录本都可能拥有自己的TSS和启动子区域。哪怕你指定“chr1:1000-3000”这样一个坐标区间,得到的也只是这段位置的基因组序列,至于这段序列算不算某个基因的启动子,取决于你以哪个转录本的TSS为锚点。所以“取启动子序列”的正确第一步,永远是先确定你关心的是哪个TSS、哪个转录本,然后在这个锚点上定义上下游边界。绕开这个前提直接去爬序列,后面大概率要返工。1.2 为什么我优先用UCSC,而不是NCBI或EnsemblNCBI Gene可以查到基因坐标,Ensembl也能下载启动子序列,但我日常还是最常用UCSC,原因是它的操作路径更贴近“先定TSS,再取序列”这个逻辑。对比项UCSC Genome BrowserNCBI GeneEnsemblTSS定位速度输入基因名直接跳到转录本结构,多个isoform并列展示能看到转录本信息,但要逐层点进细节页定位准确,但页面层级较多序列导出Table Browser一键输出FASTA,自动处理方向一般需要手工确认区域和链向有序列下载入口,批量不如Table Browser顺手调控注释同屏TSS旁边就是CpG岛、组蛋白修饰、转录因子ChIP-seq等track注释分散也有调控track,但配置稍复杂批量获取支持粘贴ID列表,一次输出上百条序列不便批量可用BioMart,但学习成本更高可重复性配置可以保存Session,便于复现一般一般UCSC的Table Browser在批量导出序列时,会自动按基因方向返回上游序列,这一点非常省事。相比之下,在NCBI里取负链基因的启动子,经常要自己手动做反向互补,一不留神就反了。1.3 拿到启动子之后要做什么之所以强调“高效获取”,是因为启动子序列从来不是终点,而是很多实验和分析的共同起点。最常见的用途包括:启动子克隆加荧光素酶报告基因实验,验证某个片段有没有转录活性;转录因子结合位点预测,把FASTA喂给JASPAR或MEME Suite扫描motif;启动子区SNP或变异筛查,看突变落在哪个可能的调控元件上;启动子甲基化检测引物设计,需要精确定位CpG岛附近区域;还有近几年比较火的CRISPR干扰启动子筛选,也需要以启动子坐标为基础设计sgRNA。在这些场景里,序列的边界、方向、版本一旦出错,后面所有分析都会跟着错。所以下面的内容重点放在“如何拿得对、拿得全、拿得快”上。2. 从基因名到启动子坐标:先理清边界再取序列2.1 三个关键概念:转录本、TSS、上游方向在动手操作UCSC之前,我建议先把三个概念在脑子里过一遍。第一个是转录本。同一个基因可以转录出多个mRNA异构体,UCSC里会按RefSeq、Ensembl等来源列出多个ID。不同转录本的起始外显子可能不同,TSS就不同,启动子区域也因此不同。所以取序列前要明确“以哪个转录本为准”。第二个是TSS。转录起始位点是启动子坐标的锚点。通常说的“上游2000 bp”,指的是TSS上游2000 bp,不是基因最左边坐标往左2000 bp。正链基因的TSS坐标是起始位点,负链基因的TSS位于基因结构的最右侧,取上游时实际坐标是递减方向。第三个最容易出错:上游方向。很多人在浏览器里看到一个负链基因,直接复制“chr1:1000-2000”这段正链坐标的序列,然后拿去设计引物,结果把基因的“下游”当成了“上游”。原因就在于这段坐标对应的序列是基因组正链的序列,而负链基因的启动子是以负链为模板转录的,正链坐标提取出的序列和实际启动子序列正好是反向互补关系。2.2 第一步操作:在UCSC里定位目标转录本和TSSUCSC定位操作的完整路径并不复杂,但每一个选项都有讲究。打开UCSC Genome Browser主页,点击顶部“Genomes”下拉框,先选物种,再选基因组版本。人类数据最常用的是GRCh38/hg38,老一些的项目可能用GRCh37/hg19。这里一定要记下版本号,后面所有坐标都基于这个版本。在搜索框输入基因名或转录本ID。基因名输入后会出现匹配下拉列表,如果多个物种有同名的基因,注意物种标识。输入RefSeq登录号(比如带NM_前缀的编号)则能直接锁定某个具体转录本。点击进入基因详情页,页面会展示该基因的多个转录本结构,以及它们在染色体上的起止坐标和链向。每个转录本条目下能看到CDS、UTR、外显子位置。从转录本列表里找到你打算用的那个。判断标准通常是:是否带NM_前缀的代表性转录本,是否有“reviewed”或“canonical”标记,是否在你的研究体系里被文献经常引用。记录该转录本的起始坐标、终止坐标、TSS坐标和链方向。2.3 第二步操作:圈定启动子区间有了TSS,就可以定义启动子区间了。不同研究目的对区间长度的需求不一样。如果只是做转录因子结合位点预测,取TSS上游2000 bp(即-2000到-1)基本够用,很多数据库和工具也默认这个范围。如果要做启动子克隆和报告基因实验,强烈建议把区间取为TSS上游2000 bp到TSS下游200 bp左右,也就是-2000到+200。因为核心启动子元件通常分布在TSS上下游几十个碱基内,只取上游容易把Inr、DPE这类元件切掉,克隆出来的片段转录活性显著下降。坐标换算很简单。假设某个正链转录本的TSS位于chr1:12,345,678(虚拟位置举例),取-2000到+200的区间就是:起点:chr1:12,343,678终点:chr1:12,345,878如果基因在负链,TSS在转录本最右侧,则“上游”是坐标递减的方向,-2000区域对应的坐标是TSS坐标减2000。这里务必先做一次正向和反向验证,再进入序列提取环节。3. 两种取序列的路径:浏览器视图与Table Browser批处理3.1 路径一:浏览器里调整窗口,用“DNA”功能导出FASTA单基因、临时查看、想同时确认启动子区域在基因组上的上下文时,我一般直接用浏览器视图提取,操作最快。把2.3算好的坐标区间输入UCSC页面上方的位置框,比如“chr1:12,343,678-12,345,878”,点击“go”跳转。窗口会居中显示这段区域。此时注意观察轨道里基因模型的方向箭头——如果基因是负链,箭头应该指向左侧,这时候取到的“正向”序列仍然不是启动子的模板链序列。接下来点击顶部菜单栏“View”下的“DNA”,或者直接点工具栏里的“DNA”按钮。弹出的对话框中最重要的选项是“Mask repeats and lower-case”:如果要做PCR引物设计或克隆,记得选择不要屏蔽重复序列,也就是让输出尽量保留原始大写的A/T/G/C。重复序列被转成小写并不会改变序列本身,但会给引物设计软件带来干扰。点击“Submit”后会得到一段FASTA。标题行包含坐标和链信息,序列就是该坐标区间的单链DNA序列。如果想要反向互补序列,网页上通常也有对应选项,或者拿到序列后用其他工具处理一下。这条路径适合一两个基因的快速提取,它的最大优点是直观——你能眼睁睁看到取出的区域对不对、基因方向对不对。缺点是如果要做几十个基因,一天都在重复点击,效率太低。3.2 路径二:Table Browser参数化导出序列当任务变成“按基因列表批量取启动子序列”,我会改用Table Browser,操作可重复、参数明确、一次能处理大量基因。进入UCSC主页后点击“Tools”菜单下的“Table Browser”,然后按下面的参数设置:设置项推荐取值说明cladeMammal按物种分类选择genomeHuman(或其他物种)与你的实验一致assemblyGRCh38/hg38和定位TSS时保持同一个版本groupGenes and Gene Prediction Tracks找基因注释类数据trackNCBI RefSeq常用基因注释来源,ID稳定region坐标区间或粘贴基因ID列表根据任务选择output formatsequence输出序列不是表格Sequence Retrieval Method5' upstream按基因方向取上游序列upstream bases2000需要多长就填多少设置完点击“get output”后,会进入序列检索选项页。把“Sequence Retrieval Method”选成“5' upstream”,填入上游碱基数2000,然后提交。工具会按基因所在链的方向自动提取TSS上游指定长度的序列,并自动处理反向互补。这一步是Table Browser最有价值的地方:你不用自己判断正链负链,工具返回的就是以基因为方向的上游序列。拿到FASTA后,每条序列的标题会带上基因ID和坐标信息,保存成文本即可。3.3 什么时候用哪条路径我的习惯是:1到3个基因,用浏览器视图路径,边看边取,心里踏实;10个以上基因,直接上Table Browser;如果是需要反复更新的长期项目,把Table Browser的配置保存到UCSC Session里,下次直接调用。这里也提醒一句,Table Browser的region如果选“position”,一次只能输入一个区间。真要批量处理,要用它的“paste IDs”模式,具体操作在下一节展开。4. 高通量场景:几十个基因的启动子批量获取与下游衔接4.1 批量思路一:在Table Browser里粘贴基因ID列表需要一次性取几十个基因的启动子时,不建议用region里的“position”逐条输入坐标,而是用Table Browser的标识符列表模式。在region下拉框里选择“define regions”,然后选择“paste IDs”。此时可以输入一组RefSeq基因ID或基因名,每行一个。UCSC会识别这些ID并映射到对应的基因组区间。粘贴完成后,其余输出设置不变,仍然选择“sequence”格式,Sequence Retrieval Method选“5' upstream”,填好碱基数。提交后返回的FASTA文件里包含全部基因的上游序列,每条的标题行带着基因ID,方便后续按ID拆分。我实测过几百个基因的规模,这个方式一次也能完成,只是输出页面的加载时间会长一些。如果网络环境不稳,建议把列表拆成几十个一组分批提交,避免超时报错。输出结果保存为本地文本文件,就是一个可以直接给下游工具用的启动子序列集。4.2 批量思路二:先导坐标表,再用脚本从本地基因组提取如果不想每次取序列都依赖网页交互,或者后续要做更灵活的分析(比如同时提取-2000到+200的区域、不同基因用不同长度),可以在Table Browser里把基因坐标表导成BED格式,再用脚本从本地基因组序列文件里提取。之所以推荐BED坐标表,因为它是一个标准格式,染色体、起止位置、链方向都在同一行,可以被很多工具和处理流程复用。导出BED时,在Table Browser的output format里选“BED”,得到的内容类似:chr1 12343678 12345878 geneX 0 + chr2 987654 989654 geneY 0 -拿到BED后,可以用pyfaidx读取本地基因组FASTA,按每条记录起止切片,负链记录做reverse complement,然后写成统一的FASTA。下面是示意代码,步骤不复杂:from pyfaidx import Fasta genome = Fasta("hg38.fa") promoter_length = 2000 results = [] # bed_lines: 从BED文件读入的 [chrom, start, end, name, score, strand] for chrom, start, end, name, _, strand in bed_lines: if strand == "+": seq = genome[chrom][start-promoter_length:start] else: seq = genome[chrom][end:end+promoter_length] # 负链取上游,实际坐标为[end, end+length],再反向互补 seq = str(seq.reverse_complement()) results.append(f">{name}|{chrom}:{start}-{end}|{strand}\n{seq}")这段代码的关键在于负链的处理逻辑:负链基因的启动子位于转录本坐标的右侧,所以切片要切在end和end+length之间,然后对整个片段做reverse complement,得到以负链为方向的上游序列。用本地脚本的好处是可追溯、可重现,整个提取过程完全由坐标表驱动,不容易受网页改版影响。缺点是需要先准备对应版本的基因组FASTA文件,这个文件可以从公共数据源下载,第一次准备时多花点时间,后续一劳永逸。4.3 拿到批量序列后怎么衔接下游工具批量拿到FASTA后,先别急着丢进分析工具,花两分钟检查一下文件里每条序列的标题和长度。我见过不少情况,基因ID列表里混入了某个基因的非编码转录本,导致输出序列对应的是非启动子区域。做完基本检查后,就可以按目的接入下游了。做引物设计,把序列给Primer3或Primer-BLAST,设计时注意避开SNP位点;做转录因子结合位点预测,取TSS上游500 bp到下游50 bp这个更保守的区域,提交给MEME Suite或JASPAR;做启动子区变异注释,把启动子坐标区间提取出来,用VEP或ANNOVAR注释;做克隆,则直接把FASTA序列加酶切位点合成引物。这里有个容易被忽略的细节:批量FASTA的下游处理工具,大部分按序列标题中的ID来跟踪来源。因此在导出时就要保证ID可读,比如包含基因名和坐标。如果默认的标题格式里只有一串字母数字编号,建议先解析文件,重命名后再继续,否则后面很难回溯哪条序列属于哪个基因。5. 启动子提取的常见坑与校验方法5.1 方向坑:负链基因的启动子最容易拿反我在第2章提过这个坑,但因为它太常见,值得单独拿出来讲。负链基因的转录方向是染色体坐标递减方向,它的“上游”序列位于转录本在浏览器显示位置的右侧,也就是坐标更大的那一边。很多人取序列时习惯复制浏览器里显示的坐标区间,但浏览器默认显示的是正链方向。如果直接拿这个区间的序列去设计上游引物,等于把启动子序列完全反向了。用Table Browser的“5' upstream”功能可以避免这个问题,因为它会自动按基因方向处理。实在要用浏览器视图取序列,取完后务必确认输出结果的标题里有strand信息,或者手动做一次反向互补再使用。5.2 版本坑:hg19还是hg38,坐标差几千甚至几十万碱基不同基因组版本之间的坐标差异,可能只有几个碱基,也可能相距甚远,完全取决于基因组结构在那个区域有没有大的重排。我见过有人在一个项目里混合使用hg19注释的启动子坐标和hg38版本的基因组序列,最后实验发现PCR条带位置完全不对。怎么核对版本?最简单是看UCSC页面左上角的assembly标签,或者看BLAT结果里的版本信息。如果项目里多人协作,建议在文件名、记录表里统一标明版本号。启动子坐标表里加一列“assembly”写上hg38或hg19,能避免后面很多麻烦。5.3 多转录本坑:同一个基因,不同TSS对应不同启动子基因的多个转录本不只影响注释ID,也直接改变TSS和启动子区间。选择不同的TSS,得到的上游序列可能完全不同。特别是基因结构复杂、有多个转录起始外显子时,启动子区域可能相差数万碱基。遇到这种情况,我的处理原则是:优先选择代表功能蛋白的经典转录本,例如RefSeq里带NM_前缀的主要转录本,或Ensembl标注为canonical的转录本。如果课题关注某特定组织或细胞类型里的表达,还要结合这个细胞里实际表达的转录本异构体来判断,不要盲目套用一个永远“最经典”的TSS。5.4 序列内容坑:小写重复区域、N碱基和个体SNP从UCSC输出序列时,如果保留了默认的重复序列屏蔽设置,Alu、LINE等重复区域会被转成小写。小写本身无害,但有些工具会把小写区域当低质量数据,或者在做引物设计时错误避开。如果目的是拿完整序列,建议在DNA输出页面选择不屏蔽。另一个更麻烦的是基因组组装空缺,某些区域在参考基因组里就是一连串的N。如果启动子刚好落在这种gap区,扩增引物可能根本没有扩增产物,这时候要换个转录本或者明确记录数据缺失。还有一点容易忽略:参考基因组序列是共识序列,不等于你手上样本的序列。启动子区的单个SNP可能影响转录因子结合位点,也可能让PCR引物错配。设计引物时尽量在引物位置排除群体频率较高的SNP,可以用dbSNP或Ensembl VEP做一次快速筛查。5.5 一套稳妥的校验链路每次提取完启动子序列,我都建议走一遍校验链路,步骤不多但能拦住绝大多数低级错误。第一步是BLAT回帖。把提取的序列粘贴到UCSC的BLAT工具里,查看结果是否落回预期的染色体位置,链方向是否和预期一致。正链基因的启动子序列回帖后应该显示在正链,负链基因如果做了正确的反向互补,回帖后应该显示在负链,坐标和来源位置一致。第二步是交叉对比。从Ensembl或NCBI的对应区域下载同样长度的序列,和UCSC结果做比对。一般启动子区域保守性不如编码区,但两套数据库在同版本下的坐标一致,序列完全可以对齐。第三步是实验验证。如果是做克隆实验,最后判断标准仍然是PCR产物条带大小是否正确、克隆测序结果是否与参考序列一致。这一步没有多说的余地,序列本身对不对,跑一次PCR就知道。我在实际使用中最深的体会是:取启动子序列这件事,80%的错误不是操作问题,而是概念模糊——没确认TSS,没确认版本,没确认链方向。把这几个点先理清楚,UCSC的取序列功能几乎是零门槛的。最后再分享一个不常见的小技巧。每次取启动子序列时,哪怕你只需要上游2000 bp,也建议顺手把区间延伸到TSS下游的100到200 bp。很多启动子克隆片段活性差,不是启动子不够长,而是TSS下游的Inr、DPE等核心启动子元件被丢掉了。我后来统一取-2000到+200,实验稳定了很多。如果你现在还只取上游序列,下次可以试试这个边界,尤其在报告基因实验里,差异会非常明显。