Author Archives: gene_x

从共生到致病:金黄色葡萄球菌在鼻腔定植与人工关节感染过程中的转录表达谱

摘要

金黄色葡萄球菌 (Staphylococcus epidermidis) 是一种常见的皮肤共生菌,能够从无害的定植者转变为侵袭性病原体,常引起人工关节感染(PJI)。这一生活方式转变的分子机制尚不清楚。为此,我们对来自 PJI 患者的鼻拭子与滑液标本进行了 体外转录组分析。通过靶向关键毒力因子、黏附因子、免疫逃逸和代谢相关基因的定量实时 PCR,比较了共生位点(鼻腔)与侵袭位点(滑液)之间的基因表达谱差异。

我们的分析揭示了驱动该共生-致病转变的环境特异性转录程序。观察到三种不同的表达模式:(i)稳定表达的基因,包括免疫逃逸因子(capC、dltA 和 fmtC)和黏附素(sdrG),在两种环境中均表现出高表达,反映其在基本生存中的重要作用;(ii)生活方式特异性基因,在定植与感染状态下表达存在显著差异;(iii)异质性表达基因,提示存在菌株或患者特异性的适应路径。

值得注意的是,中枢代谢相关基因(fumC、gltA、icd)以及 Agr 群体感应系统中的组氨酸激酶 agrC 及其下游靶基因 psmβ1 在滑液中表现出显著下调,说明该环境中外源性营养物质供应充足,并支持该菌采取以持久存在为导向的策略。我们的研究首次提供了 S. epidermidis 在不同环境下的直接 体外 基因表达证据,揭示其生活方式转变的分子机制,有助于深入理解这种临床重要机会致病菌的致病过程。

1 引言

凝固酶阴性葡萄球菌(CoNS)是人体皮肤微生物群的重要组成部分。许多种类的 CoNS 在不同的采样部位被检测到,密度也有所不同(文献)。在所有人类皮肤中常见的 CoNS 中,表皮葡萄球菌(Staphylococcus epidermidis)是最丰富的一种(文献)。表皮葡萄球菌在皮肤稳态中发挥着重要作用,例如提供定植抵抗力、促进组织修复,并参与宿主免疫调节(文献)。有趣的是,表皮葡萄球菌几乎可以定植于人体皮肤的所有区域(文献)。鉴于皮肤微环境条件的多样性,从干燥和需氧(如前臂)到潮湿和厌氧(如脚趾缝)(文献),其作为皮肤定植者的成功强烈表明该物种具有高度灵活的环境适应能力。

表皮葡萄球菌过去被认为是一种无害的皮肤共生菌,几乎没有侵袭性潜力(文献)。然而,在过去几十年中,这种细菌逐渐被认为是医院获得性感染中的重要病原体,为其生物学特性增添了新的维度(文献)。其导致侵袭性疾病的能力与患者本身的易感因素密切相关,尤其是体内植入医疗器械的情况尤为重要。在众多临床使用的植入物中,关节置换术后的感染被认为尤其关键(文献)。人工关节感染(PJI)在关节置换手术后的发生率约为 0.7% 到 1.9%,据估计病例数为 X–Y(文献)。表皮葡萄球菌是延迟发作型(3–12 个月)和晚期发作型(>12 个月)PJI 最常见的致病菌(文献)。目前的 PJI 治疗标准主张移除植入物,并辅以长时间、通常为联合的抗生素治疗(文献)。因此,表皮葡萄球菌引起的 PJI 与显著的发病率和死亡率相关,并造成了严重的经济负担(文献)。

与金黄色葡萄球菌不同,表皮葡萄球菌不携带真正意义上的毒力因子,如毒素、免疫逃避机制或组织破坏性外源酶(文献)。因此,一个关键问题是:尽管缺乏典型的促侵袭因子,表皮葡萄球菌是通过什么机制引发慢性、难以治疗的感染?来自体外研究、装置相关感染动物模型和群体比较分析的证据表明,表皮葡萄球菌的侵袭性至少在一定程度上与一组表型特征有关,即生物膜形成、抗生素耐受性以及在营养匮乏条件下的生长能力(文献)。事实上,已经发现并详细解析了多个积极促进表面定植的机制,例如胞外基质结合蛋白(Embp)、聚集相关蛋白(Aap)、纤维蛋白原结合蛋白(Fbe/SdrG)以及负责释放胞外 DNA 的 AtlE(文献)。一个名为 icaADBC 的操纵子编码了生产细胞间黏附多糖(PIA)的分子机制,促进了生物膜基质的形成和细胞间聚集(文献)。然而,即便在缺乏 icaADBC 的情况下,表皮葡萄球菌也能引发侵袭性疾病(文献)。确实,有多个证据表明,表皮葡萄球菌的机会致病性不能简单归因于某几个遗传因子的有无。相反,其侵袭潜力似乎与某些克隆谱系有关,最近的全基因组关联研究(GWAS)发现,存在于 ST2 和 ST5 中的可移动基因组组分与表皮葡萄球菌的致病性密切相关(文献)。有趣的是,除了 ST2、ST5 和 ST23,还有许多独立的遗传谱系也能引发感染,这一发现强烈表明在感染过程中还存在额外的功能复杂性(文献)。

最近一项针对 PJI 致病菌株的研究为表皮葡萄球菌克隆谱系中侵袭潜能更广泛分布提供了合理解释。对侵袭性菌株群体的基因组分析表明,表皮葡萄球菌能够通过基因组重排(如 SCCmec 元件的缺失)以及宿主内进化(发生在基因调控(如 agr)、代谢与增殖相关基因(如 ackA、rpoB)中)来适应不利环境(文献)。此外,通过转录水平的基因调控也会发生适应性变化,这从模拟感染条件(如血清或新开发的人工滑液(ASF))下的表皮葡萄球菌表达谱分析中可以得出结论(文献)。然而,在人类标本中通过 ex vivo 方法全面探索这种调控机制适应性在感染过程中的重要性,尚未得到充分研究。在近期一项使用 ex vivo 转录分析技术揭示皮肤特异性表达谱的研究基础上(文献),本研究旨在验证这样一个假设:表皮葡萄球菌通过特定的基因表达模式促进从共生状态向侵袭状态的转变。为此,我们开展了一项研究,分析来自经确诊 PJI 患者的鼻腔与滑液配对标本中的 ex vivo 基因表达模式。

3 结果

为了表征和比较人工关节感染(PJI)与无症状定植期间表皮葡萄球菌(S. epidermidis)的体外表达谱(ex vivo expression profiles),研究人员收集了接受感染修复手术患者的关节液(SF)和鼻拭子样本。

3.1 患者特征

本研究共纳入了 12 名 PJI 患者(其中女性 2 名;平均年龄 69 岁)。其中 1 名患者(编号3)为术后急性早期感染,其余均为慢性晚期感染。

根据 EBJIS 诊断标准(文献 PMID: 33380199),所有患者在入院时均符合确诊(n=9)或可能(n=3)的 PJI 标准。

在 12 名患者中,有 10 名患者提供了用于体外转录分析的关节液样本和相应的侵袭性 S. epidermidis 菌株。在这 10 人中,有 4 人同时提供了鼻拭子样本,用于分析 S. epidermidis 在共生生态位(commensal niche)中的体外表达谱。

另外,有 2 名患者(编号10 和 13)仅提供了鼻拭子样本,用于体外转录分析。

患者特征概览详见表1,个体化详细数据见补充表 S1。

3.2 滑液培养所得表皮葡萄球菌的表征

3.2.1 表皮葡萄球菌 PJI 菌株的基因组特征

在手术过程中从滑液中分离的表皮葡萄球菌菌株经过全基因组测序,采用 Illumina 和 Oxford Nanopore Technologies(ONT)平台进行分析(基因组数据存储于 XXX[please release genomes at NCBI or other public data base])。这些菌株被分配到 7 种不同的序列型(ST)中,其中 5 个菌株(共 10 个)属于通常与医院获得性感染相关的 ST 类型(如 ST5、ST23、ST87)。10 个菌株中有 9 个携带 mecA 基因,其中 7 个位于 SCCmec IVa(2B) 类型上。

大多数菌株属于 Agr II 型(6/10)。值得注意的是,菌株 1 无法归类为任何已知的 agr 类型。进一步分析显示,该菌株携带一种罕见的 agrD 序列,无法与 Agr I–III 类型分型系统对齐(参考文献:PMID 25070736)。基因组分析证实了所有菌株均含有 qPCR 靶基因。

3.2.2 表皮葡萄球菌 PJI 菌株的表型特征分析

通过在胰蛋白胨大豆肉汤(TSB)和人工滑液(ASF,参考文献:PMID 35967857)中培养,分析了菌株的生长动态,未发现不同菌株之间存在明显差异。菌株的生物膜形成能力存在差异,其中 4 个菌株(共 10 个)具有生物膜形成能力,其余均为生物膜阴性。培养上清液的溶血活性普遍较低,10 个菌株中有 6 个的溶血活性接近阴性对照,仅有 2 个菌株的溶血水平与阳性对照相当(见图 XC)。在抗生素耐药性方面,10 个菌株中有 6 个在表型测试中表现出对氧西林的耐药性。值得注意的是,仅有 2 个菌株对利福平表现出耐药性(见图 X)。

3.3 与 PJI 相关的鼻腔环境中共生性表皮葡萄球菌的分析

3.3.1 鼻腔菌群中表皮葡萄球菌的宏基因组群体分析

已有研究明确指出,人类鼻腔菌群中含有属于不同基因型的表皮葡萄球菌。为分析所招募患者鼻腔菌群中表皮葡萄球菌谱系的个体组成及其相对丰度,本研究在 6 名 PJI 患者中采用了宏基因组分析方法(PMID: 33243146),其中 4 例患者与 SF 外植体转录组分析组重叠(见表 X)。

在这 6 名患者中,共鉴定出 19 种不同的序列型(ST),每位患者平均检测到 9.5 个 ST(范围为 8–12 个)。在其中 5 名患者中,菌群由单一 ST 主导(占所有序列的 >30%);在 2 名患者中,某一 ST 占比超过 50%(分别为患者 8 的 ST278 和患者 10 的 ST59)(见图 X)。

在所有 6 名患者中均检测到新型 ST 或依据 Epidome 算法无法分类的序列。在其中 2 名患者中,鼻腔菌群的宏基因组分析检测到了与其侵袭性表皮葡萄球菌分离株相对应的 ST(见图 X)。

3.4 体外感染期间人体表皮葡萄球菌的转录分析

为了表征表皮葡萄球菌的体外基因表达模式,直接从患者标本中分离细菌RNA,包括10份滑液标本和6份鼻拭子样本。其中4份鼻拭子来自于成功从滑液中分离出RNA的患者(患者编号为8、12、19和20)。作为参考,RNA还从侵袭性表皮葡萄球菌的体外培养物和原始鼻拭子材料中分离。这些培养物分别在指数生长期和后指数生长期生长,以便进行转录表达的比较分析。主要结果可功能性地归类如下。

3.5 全球调控因子的表达谱 (agrC, apsS, sarA, sigB, yycG, psmß1)

全球调控系统和转录因子协调表皮葡萄球菌中的关键过程,包括粘附、生物膜形成、免疫逃避以及与毒力相关肽类如酚溶性调节肽(PSMs)的产生(文献)。在所分析的调控元件中,研究了转录因子SarA、替代性σ因子B(SigB)以及调控系统ApsXRS、YycFG和Agr群体感应系统中的agrC,在假体关节感染(PJI)期间的转录活性,并将其与共生鼻腔环境中的表达进行了比较。此外,还评估了它们在体外生长条件下的表达谱,为体外观察到的转录变化提供参考。

尽管表达模式存在较大异质性,agrC和sarA在滑液(SF)中的表达相比体外条件表现出显著下降。sarA的下调尤为明显,其在滑液中的表达水平接近指数生长期的基线水平——这一阶段sarA的转录本身就较低(图X,柱状图)。这种模式表明在感染过程中存在特定环境的调控适应,可能反映了代谢状态或免疫逃避策略的转变。

相比之下,鼻腔环境中sarA的转录水平与体外的最高表达水平相当,患者8除外,显示出在定殖期间的强烈表达(图X)。滑液中agrC的表达保持在体外条件观察到的范围内;然而,其靶基因psmβ1的转录显著降低。在个别患者水平(热图表示)上,这些观察结果可能显得矛盾,因为部分表皮葡萄球菌菌株在后指数生长期转录极低。尽管如此,即使是表面上减弱的体外转录活性,agrC的表达仍高于体外水平,这一趋势在患者A、B、C和D以及严格受agr调控的基因psmβ1中均清晰可见(补充图X)。

其他被分析的调控元件,包括sigB、apsXRS和yycFG,均表现出较强的转录活性,但患者间存在较大差异(图X)。这种异质性可能源自宿主特异的微环境,强调了表皮葡萄球菌调控网络在响应不同体内条件时的适应性灵活性。

3.6 代谢基因与编码鞘磷脂酶的基因sph (fumC, gltA, icd, lipA, sph)

由于环境的生理条件影响细菌的适应性和毒力,我们对代谢相关基因的转录情况进行了检测。对三羧酸循环(TCA)相关基因fumC、gltA和icd的转录分析显示,除患者E和H外,所有患者在感染期间这些基因的表达水平均持续偏低(图X)。脂肪酶基因lipA的表达也呈现出类似的表达模式。总体来看,鼻腔环境中的体外转录谱与滑液(SF)中的表达情况高度一致(图X)。然而,编码鞘磷脂酶(该酶负责将鞘磷脂切割为磷酸胆碱和神经酰胺,Zheng等人,20-22年)的sph基因表现出显著的例外。在鼻腔环境中,sph的转录水平通常超过体外最高表达水平,只有患者F和L除外(图X)。相反,sph在滑液中的表达大多低于检测限,只有患者C和H例外(图X)。

3.7 粘附素 (sdrG, sdrH, ebp, tagB, ebh, atlE)

与金黄色葡萄球菌相比,表皮葡萄球菌的毒力武器相对有限,这凸显了介导粘附分子在促进共生定植和感染相关持续性中的关键作用。转录分析显示,编码纤维蛋白原结合蛋白的基因sdrG和sdrH在滑液(SF)样本中显著上调,其中sdrH的表达水平明显高于体外条件或鼻腔环境(图X)。这种在滑液中的显著上调突出表明了感染特异性的纤维蛋白原粘附增强,可能有助于关节感染期间的组织定植和免疫逃避。 同时,tagB和embp/ebh的表达水平在不同患者间差异显著(图X),提示存在菌株特异性的调控机制或不同的宿主相互作用。 尽管存在这种变异,作为初期粘附和生物膜基质形成关键自溶酶的atlE,在感染期间持续表现出转录活性的增加。值得注意的是,类似于SdrH,其在鼻腔中的表达显著降低,提示其在感染组织的炎症环境中可能受到环境依赖性调控,优先支持粘附和生物膜促进功能(图X)。相反,弹性蛋白结合蛋白基因ebpS在人类感染期间转录沉默,暗示其具有利基依赖的表达模式或在滑液定植中作用有限。

3.8 免疫逃避与定植因子 (capC, dltA, fmtC, SE0760, esp, ecpA, sepA)

在感染过程中,细菌采用多种复杂策略来逃避、调节或颠覆宿主免疫防御机制。其中,由cap基因座编码的外多糖聚-γ-谷氨酸(PGA)被认为是抵抗抗菌肽(AMPs)和逃避免疫细胞吞噬清除的关键机制(文献)。转录分析显示,除患者A、E和I外,大多数患者样本中capC基因在体外均表现出强烈表达(图X),突显其在感染期间免疫抵抗中的作用。

除了PGA合成外,还有两种明确机制通过修饰细菌表面,实现表面带正电荷,从而排斥带正电荷的抗菌肽,增强对阳离子抗菌肽的抵抗力。第一种机制由dlt操纵子介导,催化磷壁酸的D-丙氨酸化,显著提高表面电荷,抑制肽类结合。第二种机制涉及MprF介导的修饰,通过将赖氨酸-磷脂酰甘油整合入细胞质膜,进一步增强阳离子抵抗力(文献)。转录分析证实dltA和fmtC(mprF)在假体关节感染期间显著上调(图X),表明它们在感染关节组织的恶劣环境中发挥积极的免疫逃避作用。值得注意的是,这些抗性基因在鼻腔环境中也有活跃表达,表明它们不仅参与感染过程,也涉及定植的持续性。

此外,假定的几丁质酶B(SE0760)——此前报道在皮肤定植期间强烈上调,但在鼻腔环境中基本缺失(文献,Teichmann等)——在大多数患者的感染过程中也表现出转录激活,除患者C、D和H外(图X)。这种环境依赖的激活表明其表达可能是对宿主组织特异性的适应性调整。

相比之下,三类主要催化蛋白酶——金属蛋白酶sepA、丝氨酸蛋白酶esp和半胱氨酸蛋白酶ecpA——的转录分析显示,患者样本之间表达无显著差异(图X)。这一一致的表达模式提示,蛋白水解活性处于基础水平,可能不受宿主微环境或感染状态的影响。

4 讨论

表皮葡萄球菌 (Staphylococcus epidermidis) 是一种分布广泛的秽生性冗余菌,它既是皮肤微生态组成的重要成员,也可能转化为自体内的侵袭性糟病原因。这种“集群体生和侵袭性生活”的集合体让它需要具备很强的环境适应能力。而这种适应能力应该是通过进化的输录模式。本研究首次揭示 S. epidermidis 在故事不同生态下具有环境特密性的输录模式,也引入了三种区别的表达系统:

  • 在不同环境下均表达的基因

  • 根据生态状态特定表达的基因

  • 表达不一致或异调的基因

第一类基因在哪些环境中都显示出高表达,包括免疫逃避和表面类基因 capC、dltA、fmtC 和 sdrG,这些基因可以帮助站立性和逃避主体免疫。

第二类基因包括三醒酸周路基因 fumC,gltA,icd,脂肪酶基因 lipA 和紧张细胞蛋白结合蛋白 ebpS,在两种环境中表达重度低下,揭示经济学上在汤粉液和鼻层有与营养有关的有利环境。

在 Agr 体系中,agrC 和 psm基因在 PJI 和鼻层都显示下调,表示 S. epidermidis 贯选选择持续性存活而非内毒化路径。

PJI 环境中,因为需要附着,附着相关基因显著上调,其中有 sdrH 和 atlE,后者还又参与 biofilm 形成和 eDNA 释放,这对于逃避吞噬非常重要。

而 sph 和 sarA 在鼻环境中表现高表达,显示功能应该在鼻层有具体意义,而在 PJI 中似乎不重要。

第三类基因包括组织调节器、附着因子、能分解酶等,表现显著不一致性,表明表达可能根据不同病原和主体环境自适应。

在很多 PJI 中,公证了特定 ST 系列。本研究中半数由 ST5 和 ST87 形成,其侵袭能力与以下元素相关:哺敛性的留体性某些软化基因和跨基因元件,可能直接或间接解释它们的病原性。

但是,本研究也发现非 ST2/ST5/ST87 的自体内分离附着性力也很强,表明这些冗余菌的病原性在系统上是充分分散的。很多附着性能力,如 biofilm 形成,只在构造环境下有效。ASF 的使用是解析它们侵袭性的重要手段。

本研究的限制:

  • 样本数量有限,可能有 ST 偏向;

  • 只选取了系统医治病例重,形成高菌粒液的患者,形成了较高表达量;

  • 因 RNA 量限,未能进行 RNA-seq;

  • SF 中的组织可能不是患者终结性的重要菌群。

统计条件下,我们认为本研究提供了重要规律。S. epidermidis 通过选择更适合患者环境的输录分组来实现侵袭。


2 材料与方法

道德声明

临床标本采集自汉堡 XXXX 医院的住院患者。本研究获得了汉堡伦理委员会批准。根据《赫尔辛基宣言》指导原则,所有参与者均签署了书面知情同意书。

研究对象、样本采集与微生物学分析

纳入标准包括:年龄 > 18 岁、首次假体关节感染(PJI)、入院前 6 周内未接受抗生素治疗,且为单菌感染。所有患者在手术当天采集鼻拭子(Eswab, Copan, 意大利)。取 100 µl 涂布于哥伦比亚血琼脂平板(Oxoid, 英国 Basingstoke),于 37°C 培养 48 小时。菌落转接至新的哥伦比亚血琼脂平板,并通过全细胞质谱仪(Biotyper,Bruker,德国不来梅)进行物种鉴定。 滑膜液(SF)在手术期间采集后立即与 RNAprotect Bacteria Reagent(Qiagen,德国 Hilden)混合,并置于干冰中保存。用于微生物学分析的 SF 样本未处理,取 100 µl 涂布于哥伦比亚血琼脂平板,37°C 培养 48 小时。通过质谱仪(Microflex,Bruker Daltonics,德国不来梅)鉴定菌株。鉴定为 S. epidermidis 的菌株储存于 -80°C 以供后续分析。

表皮葡萄球菌群体分析(宏基因组)

TODO: write methods here!

表型分析

采用文献方法(PMID: 33544760, 35967857)检测在 TSB 和 ASF 培养基中的生长、生物膜形成和溶血活性。表型耐药性依据 EUCAST 协议使用琼脂扩散法进行检测。

脉冲场凝胶电泳、全基因组测序与生物信息分析

采用先前发表的方法(PMID: 33544760)对鼻拭子和 SF 分离的 S. epidermidis 进行 PFGE 和全基因组测序。TODO: can you please add bioinformatics and accession numbers?

RNA 提取、逆转录及实时定量 PCR

用于 ex vivo 转录分析的细菌经 4700 rpm、4°C 离心 10 分钟与 RNAprotect 分离,沉淀直接加入 1 ml TRIzol™ LS(Thermo Fisher Scientific)及 0.5 ml 直径 0.1 mm 的锆珠(Carl Roth)进行裂解。鼻拭子的 RNA 提取参考文献(Teichmann)。 用于 in vitro 分析的同源 S. epidermidis 株于 TSB 培养基中过夜培养,稀释至 OD600 = 0.05,并在 37°C、220 rpm 振荡培养至指数(OD600=0.5)和后指数(OD600=0.5+4h)期。细菌离心收集并加入含锆珠的 TRIzol™ 裂解液。 裂解、RNA 提取及 DNase 处理参考已发表文献(Teichmann 和 Burian 等)。体外样本取 1 µl、ex vivo 样本取 3 µl RNA,使用 SuperScript IV(Thermo Fisher Scientific)和 200 ng 随机引物进行逆转录。产物按说明书操作,所得 cDNA 以 1:3 稀释,存于 -20°C(Eppendorf LoBind 管)中以长期保存。 使用 QuantStudio 1 Real-Time PCR 系统进行转录定量分析。PCR 反应混合物和程序参考文献(Li 等)。所用引物列于补充表 X。反应特异性在 3% 琼脂糖凝胶中验证。 利用 ATCC 1457 和 1585 株的 cDNA 进行 6 倍梯度稀释,建立标准曲线,以计算相对表达量。sceD 和 SE0760 的绝对定量通过 T7 启动子驱动的 RNA 合成标准完成。相关步骤参考文献 [23]:使用带 T7 序列的引物扩增目标片段,经 T7-MEGAshortscript(Thermo)转录,并用 MEGAclear Kit(Thermo)纯化所得 RNA。

数据可视化与统计分析

对 24 个目标基因采用两种分析方式进行差异表达分析。热图展示每位患者的 ex vivo 表达量与其 in vitro 最大表达量之比(gyrB 校正)。柱状图呈现全部患者在 SF 与鼻拭子中转录量的总体分布,用以比较 ex vivo 与 in vitro 之间以及生态位之间(共生与感染)的表达差异。 统计分析使用 GraphPad Prism(v9.0.2),采用 Kruskal-Wallis 检验。p < 0.05 被认为具有统计学意义。


表 1:纳入体外分析患者的基本特征汇总

变量:

患者分组

  • 全体(N=12)
  • 关节液组 SF(N=10)¹
  • 鼻拭子组 Nose(N=2)²

性别(女性),N(%)

  • 全体:2(16.7%)
  • SF:2(20%)
  • Nose:0

年龄(岁),均值(标准差)

  • 全体:69.2(10.97)
  • SF:70.3(11.8)
  • Nose:63.5(2.1)

感染关节,N(%)

  • 髋关节:
    • 全体:3(25%)
    • SF:4(40%)
    • Nose:0
  • 膝关节:
    • 全体:9(75%)
    • SF:6(60%)
    • Nose:2(100%)

是否存在窦道,N(%)

  • 全体:1(8.3%)
  • SF:1(10%)
  • Nose:0

术中组织病理学提示感染阳性,N(%)

  • 全体:6(50%)
  • SF:5(50%)
  • Nose:1(50%)

EBJIS 诊断标准,N(%)

  • 感染:
    • 全体:9(75%)
    • SF:7(70%)
    • Nose:2(100%)
  • 可能感染:
    • 全体:3(25%)
    • SF:3(30%)
    • Nose:0

外科手术类型

  • DAIR:
    • 所有组别:0
  • 单期置换:
    • 全体:11(91.7%)
    • SF:9(90%)
    • Nose:2
  • 双期置换:
    • 全体:1(8.3%)
    • SF:1(10%)
    • Nose:0

围手术期炎症指标:

CRP(mg/L),均值(标准差)

  • 全体:16.28(9.1)
  • SF:17.4(9.04)
  • Nose:10.9(10.11)

α-防御素阳性,N(%)

  • 全体:10(83.3%)(缺失2个值)
  • SF:8(80%)(缺失2个值)
  • Nose:2(100%)

LE 测试结果(N)

  • 缺失值:
    • 全体:4
    • SF:3
    • Nose:1
  • 阴性:
    • 全体:1
    • SF:1
    • Nose:0
  • +:
    • 全体:0
    • SF:0
    • Nose:0
  • ++:
    • 全体:2
    • SF:2
    • Nose:0
  • +++:
    • 全体:5
    • SF:4
    • Nose:1

白细胞计数(cells/μL)

  • ≤1500:全部为0
  • 1500 < 白细胞数 < 3000:全部为0
  • 3000:

    • 全体:8(缺失4个值)
    • SF:6(缺失4个值)
    • Nose:2

PMN(中性粒细胞百分比)

  • ≤65%:全部为0
  • 65% < PMN < 80%:全部为0
  • ≥80%:
    • 全体:8(缺失4个值)
    • SF:6(缺失4个值)
    • Nose:2

¹ 来自10位SF患者中的4位(编号8、12、19、20)提供了鼻拭子样本用于体外转录分析。 ² 对于这2位鼻拭子患者(编号10、13),无SF样本可用于体外转录分析。


图 1:来自 PJI 的表皮葡萄球菌的表型特征分析

(A) 表皮葡萄球菌在胰蛋白胨大豆肉汤(TSB)和人工滑液(ASF)中的生长情况。在 24 小时内每小时测定一次 600 nm 的吸光度。柱状图表示每个菌株在不同条件下的曲线下面积(AUC)均值,基于两个生物重复样本。

(B) 利用 96 孔微孔板法对生物膜形成进行定量。菌株在 TSB 中过夜培养,洗涤后使用龙胆紫染色,测量 570 nm 吸光度。柱状图表示两个生物重复样本的平均吸光值。

(C) XX(图注未提供)

(D) 通过 Kirby-Bauer 琼脂扩散法测定表皮葡萄球菌的抗生素敏感性谱。根据 EUCAST 的判定标准(图例中标注了判定敏感或耐药的抑菌圈直径范围)对菌株进行分类:敏感(绿色)或耐药(红色)。


图 X:PJI 患者鼻腔菌群中 S. epidermidis 序列型分布

图 X 展示了患有人工关节感染(PJI)患者的鼻腔菌群中,Staphylococcus epidermidis(表皮葡萄球菌)序列型(Sequence Types, ST)的分布情况。

  • 红色箭头表示在患者鼻腔样本中检测到与其滑液中分离的侵袭性 S. epidermidis 相同的 ST。
  • NA:不适用(未进行全基因组测序)
  • ND:无法分配至任何已知 ST

图例:
- 每个柱状条代表一个患者鼻腔菌群中的 S. epidermidis 群体组成
- 不同颜色代表不同的 ST
- 相应比例用百分比表示

---

### 图例说明(用于热图和柱状图)

对12位患有假体关节感染(PJI)患者(A–L)的滑液和鼻拭子中表皮葡萄球菌基因进行直接转录分析。以热图形式呈现的结果表示体内转录水平与体外最大表达量的比值。所有数据以以2为底的对数进行转换,并以构成型表达基因 **gyrB** 为参照进行表达变化的标准化。

白色格子中带有 “x” 表示该菌株缺失对应基因或无可用样本。蓝色格子中带有星号 * 表示该基因在体外样本中的转录水平低于检测阈值。

柱状图显示了所有PJI患者在滑液和鼻拭子样本(红色柱)以及在体外培养条件下(蓝色柱)的总体转录水平。每个点代表一位患者。统计学显著性用如下符号表示:

- *p* ≤ 0.05
- **p** ≤ 0.01
- ***p*** ≤ 0.001
- ****p**** ≤ 0.0001

---

* please release genomes at NCBI or other public data base

* can you please add bioinformatics and accession numbers?

> Die genome warden gerade noch sequenziert

> Wir benennen Ebh in S epidermidis Embp, vlt so darstellen?

> Lässt sich hier ein Bezug zu ASF herstellen?

Processing Data_Michelle_RNAseq_2025

  1. Targets

    The experiment we did so far:
    I have two strains:
    1. 1457 wildtype
    2. 1457Δsbp (sbp knock out strain)
    
    I have grown these two strains in two media for 2h (early biofilm phase, primary attachment), 4h (biofilm accumulation phase), 18h (mature biofilm phase) respectively
    1. medium TSB -> nutrient-rich medium: differences in biofilm formation and growth visible (sbp knockout shows less biofilm formation and a growth deficit)
    2. medium MH -> nutrient-poor medium: differences between wild type more obvious (sbp knockout shows stronger growth deficit)
    
    Our idea/hypothesis of what we hope to achieve with the RNA-Seq:
    Since we already see differences in growth and biofilm formation and also differences in the proteome (through cooperation with mass spectrometry), we also expect differences in the transcription of the genes in the RNA-Seq. Could you analyze the RNA-Seq data for me and compare the strains at the different time points? But maybe also compare the different time points of one strain with each other?
    The following would be interesting for me:
    - PCA plot (sample comparison)
    - Heatmaps (wild type vs. sbp knockout)
    - Volcano plots (significant genes)
    - Gene Ontology (GO) analyses
  2. Download the raw data

    aws s3 cp s3://xxxx-xxxxxxx/ ./ --recursive
  3. Prepare raw data

    mkdir raw_data; cd raw_data
    
    #Δsbp->deltasbp
    #1457.1_2h_MH,WT,MH,2h,1
    ln -s ../F25A430000603-01_STAkimxP/1457.1_2h_MH/1457.1_2h_MH_1.fq.gz WT_MH_2h_1_R1.fastq.gz
    ln -s ../F25A430000603-01_STAkimxP/1457.1_2h_MH/1457.1_2h_MH_2.fq.gz WT_MH_2h_1_R2.fastq.gz
    #1457.2_2h_
    ln -s ../F25A430000603-01_STAkimxP/1457.2_2h_MH/1457.2_2h_MH_1.fq.gz WT_MH_2h_2_R1.fastq.gz
    ln -s ../F25A430000603-01_STAkimxP/1457.2_2h_MH/1457.2_2h_MH_2.fq.gz WT_MH_2h_2_R2.fastq.gz
    #1457.3_2h_
    ln -s ../F25A430000603-01_STAkimxP/1457.3_2h_MH/1457.3_2h_MH_1.fq.gz WT_MH_2h_3_R1.fastq.gz
    ln -s ../F25A430000603-01_STAkimxP/1457.3_2h_MH/1457.3_2h_MH_2.fq.gz WT_MH_2h_3_R2.fastq.gz
    #1457.1_4h_
    ln -s ../F25A430000603-01_STAkimxP/1457.1_4h_MH/1457.1_4h_MH_1.fq.gz WT_MH_4h_1_R1.fastq.gz
    ln -s ../F25A430000603-01_STAkimxP/1457.1_4h_MH/1457.1_4h_MH_2.fq.gz WT_MH_4h_1_R2.fastq.gz
    #1457.2_4h_
    ln -s ../F25A430000603-01_STAkimxP/1457.2_4h_MH/1457.2_4h_MH_1.fq.gz WT_MH_4h_2_R1.fastq.gz
    ln -s ../F25A430000603-01_STAkimxP/1457.2_4h_MH/1457.2_4h_MH_2.fq.gz WT_MH_4h_2_R2.fastq.gz
    #1457.3_4h_
    ln -s ../F25A430000603-01_STAkimxP/1457.3_4h_MH/1457.3_4h_MH_1.fq.gz WT_MH_4h_3_R1.fastq.gz
    ln -s ../F25A430000603-01_STAkimxP/1457.3_4h_MH/1457.3_4h_MH_2.fq.gz WT_MH_4h_3_R2.fastq.gz
    #1457.1_18h_
    ln -s ../F25A430000603-01_STAkimxP/1457.1_18h_MH/1457.1_18h_MH_1.fq.gz WT_MH_18h_1_R1.fastq.gz
    ln -s ../F25A430000603-01_STAkimxP/1457.1_18h_MH/1457.1_18h_MH_2.fq.gz WT_MH_18h_1_R2.fastq.gz
    #1457.2_18h_
    ln -s ../F25A430000603-01_STAkimxP/1457.2_18h_MH/1457.2_18h_MH_1.fq.gz WT_MH_18h_2_R1.fastq.gz
    ln -s ../F25A430000603-01_STAkimxP/1457.2_18h_MH/1457.2_18h_MH_2.fq.gz WT_MH_18h_2_R2.fastq.gz
    #1457.3_18h_
    ln -s ../F25A430000603-01_STAkimxP/1457.3_18h_MH/1457.3_18h_MH_1.fq.gz WT_MH_18h_3_R1.fastq.gz
    ln -s ../F25A430000603-01_STAkimxP/1457.3_18h_MH/1457.3_18h_MH_2.fq.gz WT_MH_18h_3_R2.fastq.gz
    #1457dsbp1_2h_
    ln -s ../F25A430000603-01_STAkimxP/1457dsbp1_2h_MH/1457dsbp1_2h_MH_1.fq.gz deltasbp_MH_2h_1_R1.fastq.gz
    ln -s ../F25A430000603-01_STAkimxP/1457dsbp1_2h_MH/1457dsbp1_2h_MH_2.fq.gz deltasbp_MH_2h_1_R2.fastq.gz
    #1457dsbp2_2h_
    ln -s ../F25A430000603-01_STAkimxP/1457dsbp2_2h_MH/1457dsbp2_2h_MH_1.fq.gz deltasbp_MH_2h_2_R1.fastq.gz
    ln -s ../F25A430000603-01_STAkimxP/1457dsbp2_2h_MH/1457dsbp2_2h_MH_2.fq.gz deltasbp_MH_2h_2_R2.fastq.gz
    #1457dsbp3_2h_
    ln -s ../F25A430000603-01_STAkimxP/1457dsbp3_2h_MH/1457dsbp3_2h_MH_1.fq.gz deltasbp_MH_2h_3_R1.fastq.gz
    ln -s ../F25A430000603-01_STAkimxP/1457dsbp3_2h_MH/1457dsbp3_2h_MH_2.fq.gz deltasbp_MH_2h_3_R2.fastq.gz
    #1457dsbp1_4h_
    ln -s ../F25A430000603-01_STAkimxP/1457dsbp1_4h_MH/1457dsbp1_4h_MH_1.fq.gz deltasbp_MH_4h_1_R1.fastq.gz
    ln -s ../F25A430000603-01_STAkimxP/1457dsbp1_4h_MH/1457dsbp1_4h_MH_2.fq.gz deltasbp_MH_4h_1_R2.fastq.gz
    #1457dsbp2_4h_
    ln -s ../F25A430000603-01_STAkimxP/1457dsbp2_4h_MH/1457dsbp2_4h_MH_1.fq.gz deltasbp_MH_4h_2_R1.fastq.gz
    ln -s ../F25A430000603-01_STAkimxP/1457dsbp2_4h_MH/1457dsbp2_4h_MH_2.fq.gz deltasbp_MH_4h_2_R2.fastq.gz
    #1457dsbp3_4h_
    ln -s ../F25A430000603-01_STAkimxP/1457dsbp3_4h_MH/1457dsbp3_4h_MH_1.fq.gz deltasbp_MH_4h_3_R1.fastq.gz
    ln -s ../F25A430000603-01_STAkimxP/1457dsbp3_4h_MH/1457dsbp3_4h_MH_2.fq.gz deltasbp_MH_4h_3_R2.fastq.gz
    #1457dsbp118h_
    ln -s ../F25A430000603-01_STAkimxP/1457dsbp118h_MH/1457dsbp118h_MH_1.fq.gz deltasbp_MH_18h_1_R1.fastq.gz
    ln -s ../F25A430000603-01_STAkimxP/1457dsbp118h_MH/1457dsbp118h_MH_2.fq.gz deltasbp_MH_18h_1_R2.fastq.gz
    #1457dsbp218h_
    ln -s ../F25A430000603-01_STAkimxP/1457dsbp218h_MH/1457dsbp218h_MH_1.fq.gz deltasbp_MH_18h_2_R1.fastq.gz
    ln -s ../F25A430000603-01_STAkimxP/1457dsbp218h_MH/1457dsbp218h_MH_2.fq.gz deltasbp_MH_18h_2_R2.fastq.gz
    
    #1457.1_2h_
    ln -s ../F25A430000603_STAmsvaP/1457.1_2h_TSB/1457.1_2h_TSB_1.fq.gz  WT_TSB_2h_1_R1.fastq.gz
    ln -s ../F25A430000603_STAmsvaP/1457.1_2h_TSB/1457.1_2h_TSB_2.fq.gz  WT_TSB_2h_1_R2.fastq.gz
    #1457.2_2h_
    ln -s ../F25A430000603_STAmsvaP/1457.2_2h_TSB/1457.2_2h_TSB_1.fq.gz  WT_TSB_2h_2_R1.fastq.gz
    ln -s ../F25A430000603_STAmsvaP/1457.2_2h_TSB/1457.2_2h_TSB_2.fq.gz  WT_TSB_2h_2_R2.fastq.gz
    #1457.3_2h_
    ln -s ../F25A430000603_STAmsvaP/1457.3_2h_TSB/1457.3_2h_TSB_1.fq.gz  WT_TSB_2h_3_R1.fastq.gz
    ln -s ../F25A430000603_STAmsvaP/1457.3_2h_TSB/1457.3_2h_TSB_2.fq.gz  WT_TSB_2h_3_R2.fastq.gz
    #1457.1_4h_
    ln -s ../F25A430000603_STAmsvaP/1457.1_4h_TSB/1457.1_4h_TSB_1.fq.gz  WT_TSB_4h_1_R1.fastq.gz
    ln -s ../F25A430000603_STAmsvaP/1457.1_4h_TSB/1457.1_4h_TSB_2.fq.gz  WT_TSB_4h_1_R2.fastq.gz
    #1457.2_4h_
    ln -s ../F25A430000603_STAmsvaP/1457.2_4h_TSB/1457.2_4h_TSB_1.fq.gz  WT_TSB_4h_2_R1.fastq.gz
    ln -s ../F25A430000603_STAmsvaP/1457.2_4h_TSB/1457.2_4h_TSB_2.fq.gz  WT_TSB_4h_2_R2.fastq.gz
    #1457.3_4h_
    ln -s ../F25A430000603_STAmsvaP/1457.3_4h_TSB/1457.3_4h_TSB_1.fq.gz  WT_TSB_4h_3_R1.fastq.gz
    ln -s ../F25A430000603_STAmsvaP/1457.3_4h_TSB/1457.3_4h_TSB_2.fq.gz  WT_TSB_4h_3_R2.fastq.gz
    #1457.1_18h_
    ln -s ../F25A430000603_STAmsvaP/1457.1_18h_TSB/1457.1_18h_TSB_1.fq.gz  WT_TSB_18h_1_R1.fastq.gz
    ln -s ../F25A430000603_STAmsvaP/1457.1_18h_TSB/1457.1_18h_TSB_2.fq.gz  WT_TSB_18h_1_R2.fastq.gz
    #1457.2_18h_
    ln -s ../F25A430000603_STAmsvaP/1457.2_18h_TSB/1457.2_18h_TSB_1.fq.gz  WT_TSB_18h_2_R1.fastq.gz
    ln -s ../F25A430000603_STAmsvaP/1457.2_18h_TSB/1457.2_18h_TSB_2.fq.gz  WT_TSB_18h_2_R2.fastq.gz
    #1457.3_18h_
    ln -s ../F25A430000603_STAmsvaP/1457.3_18h_TSB/1457.3_18h_TSB_1.fq.gz  WT_TSB_18h_3_R1.fastq.gz
    ln -s ../F25A430000603_STAmsvaP/1457.3_18h_TSB/1457.3_18h_TSB_2.fq.gz  WT_TSB_18h_3_R2.fastq.gz
    #1457dsbp1_2h_
    ln -s ../F25A430000603_STAmsvaP/1457dsbp1_2hTSB/1457dsbp1_2hTSB_1.fq.gz deltasbp_TSB_2h_1_R1.fastq.gz
    ln -s ../F25A430000603_STAmsvaP/1457dsbp1_2hTSB/1457dsbp1_2hTSB_2.fq.gz deltasbp_TSB_2h_1_R2.fastq.gz
    #1457dsbp2_2h_
    ln -s ../F25A430000603_STAmsvaP/1457dsbp2_2hTSB/1457dsbp2_2hTSB_1.fq.gz deltasbp_TSB_2h_2_R1.fastq.gz
    ln -s ../F25A430000603_STAmsvaP/1457dsbp2_2hTSB/1457dsbp2_2hTSB_2.fq.gz deltasbp_TSB_2h_2_R2.fastq.gz
    #1457dsbp3_2h_
    ln -s ../F25A430000603_STAmsvaP/1457dsbp3_2hTSB/1457dsbp3_2hTSB_1.fq.gz deltasbp_TSB_2h_3_R1.fastq.gz
    ln -s ../F25A430000603_STAmsvaP/1457dsbp3_2hTSB/1457dsbp3_2hTSB_2.fq.gz deltasbp_TSB_2h_3_R2.fastq.gz
    #1457dsbp1_4h_
    ln -s ../F25A430000603_STAmsvaP/1457dsbp1_4hTSB/1457dsbp1_4hTSB_1.fq.gz deltasbp_TSB_4h_1_R1.fastq.gz
    ln -s ../F25A430000603_STAmsvaP/1457dsbp1_4hTSB/1457dsbp1_4hTSB_2.fq.gz deltasbp_TSB_4h_1_R2.fastq.gz
    #1457dsbp2_4h_
    ln -s ../F25A430000603_STAmsvaP/1457dsbp2_4hTSB/1457dsbp2_4hTSB_1.fq.gz deltasbp_TSB_4h_2_R1.fastq.gz
    ln -s ../F25A430000603_STAmsvaP/1457dsbp2_4hTSB/1457dsbp2_4hTSB_2.fq.gz deltasbp_TSB_4h_2_R2.fastq.gz
    #1457dsbp3_4h_
    ln -s ../F25A430000603_STAmsvaP/1457dsbp3_4hTSB/1457dsbp3_4hTSB_1.fq.gz deltasbp_TSB_4h_3_R1.fastq.gz
    ln -s ../F25A430000603_STAmsvaP/1457dsbp3_4hTSB/1457dsbp3_4hTSB_2.fq.gz deltasbp_TSB_4h_3_R2.fastq.gz
    #1457dsbp1_18h_
    ln -s ../F25A430000603_STAmsvaP/1457dsbp118hTSB/1457dsbp118hTSB_1.fq.gz deltasbp_TSB_18h_1_R1.fastq.gz
    ln -s ../F25A430000603_STAmsvaP/1457dsbp118hTSB/1457dsbp118hTSB_2.fq.gz deltasbp_TSB_18h_1_R2.fastq.gz
    #1457dsbp2_18h_
    ln -s ../F25A430000603_STAmsvaP/1457dsbp218hTSB/1457dsbp218hTSB_1.fq.gz deltasbp_TSB_18h_2_R1.fastq.gz
    ln -s ../F25A430000603_STAmsvaP/1457dsbp218hTSB/1457dsbp218hTSB_2.fq.gz deltasbp_TSB_18h_2_R2.fastq.gz
    #1457dsbp3_18h_
    ln -s ../F25A430000603_STAmsvaP/1457dsbp318hTSB/1457dsbp318hTSB_1.fq.gz deltasbp_TSB_18h_3_R1.fastq.gz
    ln -s ../F25A430000603_STAmsvaP/1457dsbp318hTSB/1457dsbp318hTSB_2.fq.gz deltasbp_TSB_18h_3_R2.fastq.gz
    #END
  4. Preparing the directory trimmed

    mkdir trimmed trimmed_unpaired;
    for sample_id in WT_MH_2h_1 WT_MH_2h_2 WT_MH_2h_3 WT_MH_4h_1 WT_MH_4h_2 WT_MH_4h_3 WT_MH_18h_1 WT_MH_18h_2 WT_MH_18h_3 WT_TSB_2h_1 WT_TSB_2h_2 WT_TSB_2h_3 WT_TSB_4h_1 WT_TSB_4h_2 WT_TSB_4h_3 WT_TSB_18h_1 WT_TSB_18h_2 WT_TSB_18h_3  deltasbp_MH_2h_1 deltasbp_MH_2h_2 deltasbp_MH_2h_3 deltasbp_MH_4h_1 deltasbp_MH_4h_2 deltasbp_MH_4h_3 deltasbp_MH_18h_1 deltasbp_MH_18h_2 deltasbp_TSB_2h_1 deltasbp_TSB_2h_2 deltasbp_TSB_2h_3 deltasbp_TSB_4h_1 deltasbp_TSB_4h_2 deltasbp_TSB_4h_3 deltasbp_TSB_18h_1 deltasbp_TSB_18h_2 deltasbp_TSB_18h_3; do
            java -jar /home/jhuang/Tools/Trimmomatic-0.36/trimmomatic-0.36.jar PE -threads 100 raw_data/${sample_id}_R1.fastq.gz raw_data/${sample_id}_R2.fastq.gz trimmed/${sample_id}_R1.fastq.gz trimmed_unpaired/${sample_id}_R1.fastq.gz trimmed/${sample_id}_R2.fastq.gz trimmed_unpaired/${sample_id}_R2.fastq.gz ILLUMINACLIP:/home/jhuang/Tools/Trimmomatic-0.36/adapters/TruSeq3-PE-2.fa:2:30:10:8:TRUE LEADING:3 TRAILING:3 SLIDINGWINDOW:4:15 MINLEN:36 AVGQUAL:20; done 2> trimmomatic_pe.log;
    done
    mv trimmed/*.fastq.gz .
  5. Preparing samplesheet.csv

    sample,fastq_1,fastq_2,strandedness
    WT_MH_2h_1,WT_MH_2h_1_R1.fastq.gz,WT_MH_2h_1_R2.fastq.gz,auto
    ...
  6. nextflow run

    #See an example: http://xgenes.com/article/article-content/157/prepare-virus-gtf-for-nextflow-run/
    #docker pull nfcore/rnaseq
    ln -s /home/jhuang/Tools/nf-core-rnaseq-3.12.0/ rnaseq
    
    # -- DEBUG_1 (CDS --> exon in CP020463.gff) --
    grep -P "\texon\t" CP020463.gff | sort | wc -l    #=81
    grep -P "cmsearch\texon\t" CP020463.gff | wc -l   #=11  ignal recognition particle sRNA small typ, transfer-messenger RNA, 5S ribosomal RNA
    grep -P "Genbank\texon\t" CP020463.gff | wc -l    #=12  16S and 23S ribosomal RNA
    grep -P "tRNAscan-SE\texon\t" CP020463.gff | wc -l    #tRNA 58
    grep -P "\tCDS\t" CP020463.gff | wc -l  #3701-->2324
    sed 's/\tCDS\t/\texon\t/g' CP020463.gff > CP020463_m.gff
    grep -P "\texon\t" CP020463_m.gff | sort | wc -l  #3797-->2405
    
    # -- NOTE that combination of 'CP020463_m.gff' and 'exon' in the command will result in ERROR, using 'transcript' instead in the command line!
    --gff "/home/jhuang/DATA/Data_Tam_RNAseq_2024/CP020463_m.gff" --featurecounts_feature_type 'transcript'
    
    # ---- SUCCESSFUL with directly downloaded gff3 and fasta from NCBI using docker after replacing 'CDS' with 'exon' ----
    (host_env) /usr/local/bin/nextflow run rnaseq/main.nf --input samplesheet.csv --outdir results    --fasta "/home/jhuang/DATA/Data_Michelle_RNAseq_2025/CP020463.fasta" --gff "/home/jhuang/DATA/Data_Michelle_RNAseq_2025/CP020463_m.gff"        -profile docker -resume  --max_cpus 55 --max_memory 512.GB --max_time 2400.h    --save_align_intermeds --save_unaligned --save_reference    --aligner 'star_salmon'    --gtf_group_features 'gene_id'  --gtf_extra_attributes 'gene_name' --featurecounts_group_type 'gene_biotype' --featurecounts_feature_type 'transcript'
    
    # -- DEBUG_3: make sure the header of fasta is the same to the *_m.gff file, both are "CP020463.1"
  7. Import data and pca-plot

    #mamba activate r_env
    
    #install.packages("ggfun")
    # Import the required libraries
    library("AnnotationDbi")
    library("clusterProfiler")
    library("ReactomePA")
    library(gplots)
    library(tximport)
    library(DESeq2)
    #library("org.Hs.eg.db")
    library(dplyr)
    library(tidyverse)
    #install.packages("devtools")
    #devtools::install_version("gtable", version = "0.3.0")
    library(gplots)
    library("RColorBrewer")
    #install.packages("ggrepel")
    library("ggrepel")
    # install.packages("openxlsx")
    library(openxlsx)
    library(EnhancedVolcano)
    library(DESeq2)
    library(edgeR)
    
    setwd("~/DATA/Data_Michelle_RNAseq_2025/results/star_salmon")
    # Define paths to your Salmon output quantification files
    files <- c(
            "deltasbp_MH_2h_r1" = "./deltasbp_MH_2h_1/quant.sf",
            "deltasbp_MH_2h_r2" = "./deltasbp_MH_2h_2/quant.sf",
            "deltasbp_MH_2h_r3" = "./deltasbp_MH_2h_3/quant.sf",
            "deltasbp_MH_4h_r1" = "./deltasbp_MH_4h_1/quant.sf",
            "deltasbp_MH_4h_r2" = "./deltasbp_MH_4h_2/quant.sf",
            "deltasbp_MH_4h_r3" = "./deltasbp_MH_4h_3/quant.sf",
            "deltasbp_MH_18h_r1" = "./deltasbp_MH_18h_1/quant.sf",
            "deltasbp_MH_18h_r2" = "./deltasbp_MH_18h_2/quant.sf",
            "deltasbp_TSB_2h_r1" = "./deltasbp_TSB_2h_1/quant.sf",
            "deltasbp_TSB_2h_r2" = "./deltasbp_TSB_2h_2/quant.sf",
            "deltasbp_TSB_2h_r3" = "./deltasbp_TSB_2h_3/quant.sf",
            "deltasbp_TSB_4h_r1" = "./deltasbp_TSB_4h_1/quant.sf",
            "deltasbp_TSB_4h_r2" = "./deltasbp_TSB_4h_2/quant.sf",
            "deltasbp_TSB_4h_r3" = "./deltasbp_TSB_4h_3/quant.sf",
            "deltasbp_TSB_18h_r1" = "./deltasbp_TSB_18h_1/quant.sf",
            "deltasbp_TSB_18h_r2" = "./deltasbp_TSB_18h_2/quant.sf",
            "deltasbp_TSB_18h_r3" = "./deltasbp_TSB_18h_3/quant.sf",
            "WT_MH_2h_r1" = "./WT_MH_2h_1/quant.sf",
            "WT_MH_2h_r2" = "./WT_MH_2h_2/quant.sf",
            "WT_MH_2h_r3" = "./WT_MH_2h_3/quant.sf",
            "WT_MH_4h_r1" = "./WT_MH_4h_1/quant.sf",
            "WT_MH_4h_r2" = "./WT_MH_4h_2/quant.sf",
            "WT_MH_4h_r3" = "./WT_MH_4h_3/quant.sf",
            "WT_MH_18h_r1" = "./WT_MH_18h_1/quant.sf",
            "WT_MH_18h_r2" = "./WT_MH_18h_2/quant.sf",
            "WT_MH_18h_r3" = "./WT_MH_18h_3/quant.sf",
            "WT_TSB_2h_r1" = "./WT_TSB_2h_1/quant.sf",
            "WT_TSB_2h_r2" = "./WT_TSB_2h_2/quant.sf",
            "WT_TSB_2h_r3" = "./WT_TSB_2h_3/quant.sf",
            "WT_TSB_4h_r1" = "./WT_TSB_4h_1/quant.sf",
            "WT_TSB_4h_r2" = "./WT_TSB_4h_2/quant.sf",
            "WT_TSB_4h_r3" = "./WT_TSB_4h_3/quant.sf",
            "WT_TSB_18h_r1" = "./WT_TSB_18h_1/quant.sf",
            "WT_TSB_18h_r2" = "./WT_TSB_18h_2/quant.sf",
            "WT_TSB_18h_r3" = "./WT_TSB_18h_3/quant.sf")
    
    # Import the transcript abundance data with tximport
    txi <- tximport(files, type = "salmon", txIn = TRUE, txOut = TRUE)
    # Define the replicates and condition of the samples
    replicate <- factor(c("r1","r2","r3", "r1","r2","r3", "r1","r2", "r1","r2","r3", "r1","r2","r3", "r1","r2","r3", "r1","r2","r3", "r1","r2","r3", "r1","r2","r3", "r1","r2","r3", "r1","r2","r3", "r1","r2","r3"))
    condition <- factor(c("deltasbp_MH_2h","deltasbp_MH_2h","deltasbp_MH_2h","deltasbp_MH_4h","deltasbp_MH_4h","deltasbp_MH_4h","deltasbp_MH_18h","deltasbp_MH_18h","deltasbp_TSB_2h","deltasbp_TSB_2h","deltasbp_TSB_2h","deltasbp_TSB_4h","deltasbp_TSB_4h","deltasbp_TSB_4h","deltasbp_TSB_18h","deltasbp_TSB_18h","deltasbp_TSB_18h","WT_MH_2h","WT_MH_2h","WT_MH_2h","WT_MH_4h","WT_MH_4h","WT_MH_4h","WT_MH_18h","WT_MH_18h","WT_MH_18h","WT_TSB_2h","WT_TSB_2h","WT_TSB_2h","WT_TSB_4h","WT_TSB_4h","WT_TSB_4h","WT_TSB_18h","WT_TSB_18h","WT_TSB_18h"))
    
    sample_table <- data.frame(
        condition = condition,
        replicate = replicate
    )
    split_cond <- do.call(rbind, strsplit(as.character(condition), "_"))
    colnames(split_cond) <- c("strain", "media", "time")
    colData <- cbind(sample_table, split_cond)
    colData$strain <- factor(colData$strain)
    colData$media  <- factor(colData$media)
    colData$time   <- factor(colData$time)
    #colData$group  <- factor(paste(colData$strain, colData$media, colData$time, sep = "_"))
    # Define the colData for DESeq2
    #colData <- data.frame(condition=condition, row.names=names(files))
    
    #grep "gene_name" ./results/genome/CP059040_m.gtf | wc -l  #1701
    #grep "gene_name" ./results/genome/CP020463_m.gtf | wc -l  #50
    
    # ------------------------
    # 1️⃣ Setup and input files
    # ------------------------
    
    # Read in transcript-to-gene mapping
    tx2gene <- read.table("salmon_tx2gene.tsv", header=FALSE, stringsAsFactors=FALSE)
    colnames(tx2gene) <- c("transcript_id", "gene_id", "gene_name")
    
    # Prepare tx2gene for gene-level summarization (remove gene_name if needed)
    tx2gene_geneonly <- tx2gene[, c("transcript_id", "gene_id")]
    
    # -------------------------------
    # 2️⃣ Transcript-level counts
    # -------------------------------
    # Create DESeqDataSet directly from tximport (transcript-level)
    dds_tx <- DESeqDataSetFromTximport(txi, colData=colData, design=~condition)
    write.csv(counts(dds_tx), file="transcript_counts.csv")
    
    # --------------------------------
    # 3️⃣ Gene-level summarization
    # --------------------------------
    # Re-import Salmon data summarized at gene level
    txi_gene <- tximport(files, type="salmon", tx2gene=tx2gene_geneonly, txOut=FALSE)
    
    # Create DESeqDataSet for gene-level counts
    #dds <- DESeqDataSetFromTximport(txi_gene, colData=colData, design=~condition+replicate)
    dds <- DESeqDataSetFromTximport(txi_gene, colData=colData, design=~condition)
    #dds <- DESeqDataSetFromTximport(txi, colData = colData, design = ~ time + media + strain + media:strain + strain:time)
    #或更简单地写为(推荐):dds <- DESeqDataSetFromTximport(txi, colData = colData, design = ~ time + media * strain)
    #dds <- DESeqDataSetFromTximport(txi, colData = colData, design = ~ strain * media * time)
    #~ strain * media * time    主效应 + 所有交互(推荐)  ✅
    #~ time + media * strain    主效应 + media:strain 交互   ⚠️ 有限制
    
    # --------------------------------
    # 4️⃣ Raw counts table (with gene names)
    # --------------------------------
    # Extract raw gene-level counts
    counts_data <- as.data.frame(counts(dds, normalized=FALSE))
    counts_data$gene_id <- rownames(counts_data)
    
    # Add gene names
    tx2gene_unique <- unique(tx2gene[, c("gene_id", "gene_name")])
    counts_data <- merge(counts_data, tx2gene_unique, by="gene_id", all.x=TRUE)
    
    # Reorder columns: gene_id, gene_name, then counts
    count_cols <- setdiff(colnames(counts_data), c("gene_id", "gene_name"))
    counts_data <- counts_data[, c("gene_id", "gene_name", count_cols)]
    
    # --------------------------------
    # 5️⃣ Calculate CPM
    # --------------------------------
    library(edgeR)
    library(openxlsx)
    
    # Prepare count matrix for CPM calculation
    count_matrix <- as.matrix(counts_data[, !(colnames(counts_data) %in% c("gene_id", "gene_name"))])
    
    # Calculate CPM
    #cpm_matrix <- cpm(count_matrix, normalized.lib.sizes=FALSE)
    total_counts <- colSums(count_matrix)
    cpm_matrix <- t(t(count_matrix) / total_counts) * 1e6
    cpm_matrix <- as.data.frame(cpm_matrix)
    
    # Add gene_id and gene_name back to CPM table
    cpm_counts <- cbind(counts_data[, c("gene_id", "gene_name")], cpm_matrix)
    
    # --------------------------------
    # 6️⃣ Save outputs
    # --------------------------------
    write.csv(counts_data, "gene_raw_counts.csv", row.names=FALSE)
    write.xlsx(counts_data, "gene_raw_counts.xlsx", row.names=FALSE)
    write.xlsx(cpm_counts, "gene_cpm_counts.xlsx", row.names=FALSE)
    
    # -- (Optional) Save the rlog-transformed counts --
    dim(counts(dds))
    head(counts(dds), 10)
    rld <- rlogTransformation(dds)
    rlog_counts <- assay(rld)
    write.xlsx(as.data.frame(rlog_counts), "gene_rlog_transformed_counts.xlsx")
    
    # -- pca --
    png("pca2.png", 1200, 800)
    plotPCA(rld, intgroup=c("condition"))
    dev.off()
    # -- heatmap --
    png("heatmap2.png", 1200, 800)
    distsRL <- dist(t(assay(rld)))
    mat <- as.matrix(distsRL)
    hc <- hclust(distsRL)
    hmcol <- colorRampPalette(brewer.pal(9,"GnBu"))(100)
    heatmap.2(mat, Rowv=as.dendrogram(hc),symm=TRUE, trace="none",col = rev(hmcol), margin=c(13, 13))
    dev.off()
    
    # -- pca_media_strain --
    png("pca_media.png", 1200, 800)
    plotPCA(rld, intgroup=c("media"))
    dev.off()
    png("pca_strain.png", 1200, 800)
    plotPCA(rld, intgroup=c("strain"))
    dev.off()
    png("pca_time.png", 1200, 800)
    plotPCA(rld, intgroup=c("time"))
    dev.off()
  8. (Optional; ERROR–>need to be debugged!) ) estimate size factors and dispersion values.

    #Size Factors: These are used to normalize the read counts across different samples. The size factor for a sample accounts for differences in sequencing depth (i.e., the total number of reads) and other technical biases between samples. After normalization with size factors, the counts should be comparable across samples. Size factors are usually calculated in a way that they reflect the median or mean ratio of gene expression levels between samples, assuming that most genes are not differentially expressed.
    #Dispersion: This refers to the variability or spread of gene expression measurements. In RNA-seq data analysis, each gene has its own dispersion value, which reflects how much the counts for that gene vary between different samples, more than what would be expected just due to the Poisson variation inherent in counting. Dispersion is important for accurately modeling the data and for detecting differentially expressed genes.
    #So in summary, size factors are specific to samples (used to make counts comparable across samples), and dispersion values are specific to genes (reflecting variability in gene expression).
    
    sizeFactors(dds)
    #NULL
    # Estimate size factors
    dds <- estimateSizeFactors(dds)
    # Estimate dispersions
    dds <- estimateDispersions(dds)
    #> sizeFactors(dds)
    
    #control_r1 control_r2  HSV.d2_r1  HSV.d2_r2  HSV.d4_r1  HSV.d4_r2  HSV.d6_r1
    #2.3282468  2.0251928  1.8036883  1.3767551  0.9341929  1.0911693  0.5454526
    #HSV.d6_r2  HSV.d8_r1  HSV.d8_r2
    #0.4604461  0.5799834  0.6803681
    
    # (DEBUG) If avgTxLength is Necessary
    #To simplify the computation and ensure sizeFactors are calculated:
    assays(dds)$avgTxLength <- NULL
    dds <- estimateSizeFactors(dds)
    sizeFactors(dds)
    #If you want to retain avgTxLength but suspect it is causing issues, you can explicitly instruct DESeq2 to compute size factors without correcting for library size with average transcript lengths:
    dds <- estimateSizeFactors(dds, controlGenes = NULL, use = FALSE)
    sizeFactors(dds)
    
    # If alone with virus data, the following BUG occured:
    #Still NULL --> BUG --> using manual calculation method for sizeFactor calculation!
                        HeLa_TO_r1                      HeLa_TO_r2
                        0.9978755                       1.1092227
    data.frame(genes = rownames(dds), dispersions = dispersions(dds))
    
    #Given the raw counts, the control_r1 and control_r2 samples seem to have a much lower sequencing depth (total read count) than the other samples. Therefore, when normalization methods are applied, the normalization factors for these control samples will be relatively high, boosting the normalized counts.
    1/0.9978755=1.002129023
    1/1.1092227=
    #bamCoverage --bam ../markDuplicates/${sample}Aligned.sortedByCoord.out.bam -o ${sample}_norm.bw --binSize 10 --scaleFactor  --effectiveGenomeSize 2864785220
    bamCoverage --bam ../markDuplicates/HeLa_TO_r1Aligned.sortedByCoord.out.markDups.bam -o HeLa_TO_r1.bw --binSize 10 --scaleFactor 1.002129023     --effectiveGenomeSize 2864785220
    bamCoverage --bam ../markDuplicates/HeLa_TO_r2Aligned.sortedByCoord.out.markDups.bam -o HeLa_TO_r2.bw --binSize 10 --scaleFactor  0.901532217        --effectiveGenomeSize 2864785220
    
    raw_counts <- counts(dds)
    normalized_counts <- counts(dds, normalized=TRUE)
    #write.table(raw_counts, file="raw_counts.txt", sep="\t", quote=F, col.names=NA)
    #write.table(normalized_counts, file="normalized_counts.txt", sep="\t", quote=F, col.names=NA)
    #convert bam to bigwig using deepTools by feeding inverse of DESeq’s size Factor
    estimSf <- function (cds){
        # Get the count matrix
        cts <- counts(cds)
        # Compute the geometric mean
        geomMean <- function(x) prod(x)^(1/length(x))
        # Compute the geometric mean over the line
        gm.mean  <-  apply(cts, 1, geomMean)
        # Zero values are set to NA (avoid subsequentcdsdivision by 0)
        gm.mean[gm.mean == 0] <- NA
        # Divide each line by its corresponding geometric mean
        # sweep(x, MARGIN, STATS, FUN = "-", check.margin = TRUE, ...)
        # MARGIN: 1 or 2 (line or columns)
        # STATS: a vector of length nrow(x) or ncol(x), depending on MARGIN
        # FUN: the function to be applied
        cts <- sweep(cts, 1, gm.mean, FUN="/")
        # Compute the median over the columns
        med <- apply(cts, 2, median, na.rm=TRUE)
        # Return the scaling factor
        return(med)
    }
    #https://dputhier.github.io/ASG/practicals/rnaseq_diff_Snf2/rnaseq_diff_Snf2.html
    #http://bioconductor.org/packages/devel/bioc/vignettes/DESeq2/inst/doc/DESeq2.html#data-transformations-and-visualization
    #https://hbctraining.github.io/DGE_workshop/lessons/02_DGE_count_normalization.html
    #https://hbctraining.github.io/DGE_workshop/lessons/04_DGE_DESeq2_analysis.html
    #https://genviz.org/module-04-expression/0004/02/01/DifferentialExpression/
    #DESeq2’s median of ratios [1]
    #EdgeR’s trimmed mean of M values (TMM) [2]
    #http://www.nathalievialaneix.eu/doc/html/TP1_normalization.html  #very good website!
    test_normcount <- sweep(raw_counts, 2, sizeFactors(dds), "/")
    sum(test_normcount != normalized_counts)
  9. Select the differentially expressed genes

    #https://galaxyproject.eu/posts/2020/08/22/three-steps-to-galaxify-your-tool/
    #https://www.biostars.org/p/282295/
    #https://www.biostars.org/p/335751/
    dds$condition
    [1] deltasbp_MH_2h   deltasbp_MH_2h   deltasbp_MH_2h   deltasbp_MH_4h
    [5] deltasbp_MH_4h   deltasbp_MH_4h   deltasbp_MH_18h  deltasbp_MH_18h
    [9] deltasbp_TSB_2h  deltasbp_TSB_2h  deltasbp_TSB_2h  deltasbp_TSB_4h
    [13] deltasbp_TSB_4h  deltasbp_TSB_4h  deltasbp_TSB_18h deltasbp_TSB_18h
    [17] deltasbp_TSB_18h WT_MH_2h         WT_MH_2h         WT_MH_2h
    [21] WT_MH_4h         WT_MH_4h         WT_MH_4h         WT_MH_18h
    [25] WT_MH_18h        WT_MH_18h        WT_TSB_2h        WT_TSB_2h
    [29] WT_TSB_2h        WT_TSB_4h        WT_TSB_4h        WT_TSB_4h
    [33] WT_TSB_18h       WT_TSB_18h       WT_TSB_18h
    12 Levels: deltasbp_MH_18h deltasbp_MH_2h deltasbp_MH_4h ... WT_TSB_4h
    
    #CONSOLE: mkdir star_salmon/degenes
    
    setwd("degenes")
    
    # 确保因子顺序(可选)
    colData$strain <- relevel(factor(colData$strain), ref = "WT")
    colData$media  <- relevel(factor(colData$media), ref = "TSB")
    colData$time   <- relevel(factor(colData$time), ref = "2h")
    
    dds <- DESeqDataSetFromTximport(txi, colData, design = ~ strain * media * time)
    dds <- DESeq(dds, betaPrior = FALSE)
    resultsNames(dds)
    #[1] "Intercept"                      "strain_deltasbp_vs_WT"
    #[3] "media_MH_vs_TSB"                "time_18h_vs_2h"
    #[5] "time_4h_vs_2h"                  "straindeltasbp.mediaMH"
    #[7] "straindeltasbp.time18h"         "straindeltasbp.time4h"
    #[9] "mediaMH.time18h"                "mediaMH.time4h"
    #[11] "straindeltasbp.mediaMH.time18h" "straindeltasbp.mediaMH.time4h"
    
    🔹 Main effects for each factor:
    
    表达量
    ▲
    │       ┌────── WT-TSB
    │      /
    │     /     ┌────── WT-MH
    │    /     /
    │   /     /     ┌────── deltasbp-TSB
    │  /     /     /
    │ /     /     /     ┌────── deltasbp-MH
    └──────────────────────────────▶ 时间(2h, 4h, 18h)
    
        * strain_deltasbp_vs_WT
        * media_MH_vs_TSB
        * time_18h_vs_2h
        * time_4h_vs_2h
    
    🔹 两因素交互作用(Two-way interactions)
    这些项表示两个实验因素(如菌株、培养基、时间)之间的组合效应——也就是说,其中一个因素的影响取决于另一个因素的水平。
    
    表达量
    ▲
    │
    │             WT ────────┐
    │                        └─↘
    │                           ↘
    │                        deltasbp ←←←← 显著交互(方向/幅度不同)
    └──────────────────────────────▶ 时间
    
    straindeltasbp.mediaMH
    表示 菌株(strain)和培养基(media)之间的交互作用。
    ➤ 这意味着:deltasbp 这个突变菌株在 MH 培养基中的表现与它在 TSB 中的不同,不能仅通过菌株和培养基的单独效应来解释。
    
    straindeltasbp.time18h
    表示 菌株(strain)和时间(time, 18h)之间的交互作用。
    ➤ 即:突变菌株在 18 小时时的表达变化不只是菌株效应或时间效应的简单相加,而有协同作用。
    
    straindeltasbp.time4h
    同上,是菌株和时间(4h)之间的交互作用。
    
    mediaMH.time18h
    表示 培养基(MH)与时间(18h)之间的交互作用。
    ➤ 即:在 MH 培养基中,18 小时时的表达水平与在其他时间点(例如 2h)不同,且该变化不完全可以用时间和培养基各自单独的效应来解释。
    
    mediaMH.time4h
    与上面类似,是 MH 培养基与 4 小时之间的交互作用。
    
    🔹 三因素交互作用(Three-way interactions)
    三因素交互作用表示:菌株、培养基和时间这三个因素在一起时,会产生一个新的效应,这种效应无法通过任何两个因素的组合来完全解释。
    
    表达量(TSB)
    ▲
    │
    │        WT ──────→→
    │        deltasbp ─────→→
    └────────────────────────▶ 时间(2h, 4h, 18h)
    
    表达量(MH)
    ▲
    │
    │        WT ──────→→
    │        deltasbp ─────⬈⬈⬈⬈⬈⬈⬈
    └────────────────────────▶ 时间(2h, 4h, 18h)
    
    straindeltasbp.mediaMH.time18h
    表示 菌株 × 培养基 × 时间(18h) 三者之间的交互作用。
    ➤ 即:突变菌株在 MH 培养基下的 18 小时表达模式,与其他组合(比如 WT 在 MH 培养基下,或者在 TSB 下)都不相同。
    
    straindeltasbp.mediaMH.time4h
    同上,只是观察的是 4 小时下的三因素交互效应。
    
    ✅ 总结:
    交互作用项的存在意味着你不能仅通过单个变量(如菌株、时间或培养基)的影响来解释基因表达的变化,必须同时考虑它们之间的组合关系。在 DESeq2 模型中,这些交互项的显著性可以揭示特定条件下是否有特异的调控行为。
    
    # 提取 strain 的主效应: up 2, down 16
    contrast <- "strain_deltasbp_vs_WT"
    res = results(dds, name=contrast)
    res <- res[!is.na(res$log2FoldChange),]
    res_df <- as.data.frame(res)
    write.csv(as.data.frame(res_df[order(res_df$pvalue),]), file = paste(contrast, "all.txt", sep="-"))
    up <- subset(res_df, padj<=0.05 & log2FoldChange>=2)
    down <- subset(res_df, padj<=0.05 & log2FoldChange<=-2)
    write.csv(as.data.frame(up[order(up$log2FoldChange,decreasing=TRUE),]), file = paste(contrast, "up.txt", sep="-"))
    write.csv(as.data.frame(down[order(abs(down$log2FoldChange),decreasing=TRUE),]), file = paste(contrast, "down.txt", sep="-"))
    
    # 提取 media 的主效应: up 76; down 128
    contrast <- "media_MH_vs_TSB"
    res = results(dds, name=contrast)
    res <- res[!is.na(res$log2FoldChange),]
    res_df <- as.data.frame(res)
    write.csv(as.data.frame(res_df[order(res_df$pvalue),]), file = paste(contrast, "all.txt", sep="-"))
    up <- subset(res_df, padj<=0.05 & log2FoldChange>=2)
    down <- subset(res_df, padj<=0.05 & log2FoldChange<=-2)
    write.csv(as.data.frame(up[order(up$log2FoldChange,decreasing=TRUE),]), file = paste(contrast, "up.txt", sep="-"))
    write.csv(as.data.frame(down[order(abs(down$log2FoldChange),decreasing=TRUE),]), file = paste(contrast, "down.txt", sep="-"))
    
    # 提取 time 的主效应 up 228, down 98; up 17, down 2
    contrast <- "time_18h_vs_2h"
    res = results(dds, name=contrast)
    res <- res[!is.na(res$log2FoldChange),]
    res_df <- as.data.frame(res)
    write.csv(as.data.frame(res_df[order(res_df$pvalue),]), file = paste(contrast, "all.txt", sep="-"))
    up <- subset(res_df, padj<=0.05 & log2FoldChange>=2)
    down <- subset(res_df, padj<=0.05 & log2FoldChange<=-2)
    write.csv(as.data.frame(up[order(up$log2FoldChange,decreasing=TRUE),]), file = paste(contrast, "up.txt", sep="-"))
    write.csv(as.data.frame(down[order(abs(down$log2FoldChange),decreasing=TRUE),]), file = paste(contrast, "down.txt", sep="-"))
    
    contrast <- "time_4h_vs_2h"
    res = results(dds, name=contrast)
    res <- res[!is.na(res$log2FoldChange),]
    res_df <- as.data.frame(res)
    write.csv(as.data.frame(res_df[order(res_df$pvalue),]), file = paste(contrast, "all.txt", sep="-"))
    up <- subset(res_df, padj<=0.05 & log2FoldChange>=2)
    down <- subset(res_df, padj<=0.05 & log2FoldChange<=-2)
    write.csv(as.data.frame(up[order(up$log2FoldChange,decreasing=TRUE),]), file = paste(contrast, "up.txt", sep="-"))
    write.csv(as.data.frame(down[order(abs(down$log2FoldChange),decreasing=TRUE),]), file = paste(contrast, "down.txt", sep="-"))
    
    #1.)  delta sbp 2h TSB vs WT 2h TSB
    #2.)  delta sbp 4h TSB vs WT 4h TSB
    #3.)  delta sbp 18h TSB vs WT 18h TSB
    #4.)  delta sbp 2h MH vs WT 2h MH
    #5.)  delta sbp 4h MH vs WT 4h MH
    #6.)  delta sbp 18h MH vs WT 18h MH
    
    #---- relevel to control ----
    #design=~condition+replicate
    dds <- DESeqDataSetFromTximport(txi, colData, design = ~ condition)
    dds$condition <- relevel(dds$condition, "WT_TSB_2h")
    dds = DESeq(dds, betaPrior=FALSE)
    resultsNames(dds)
    clist <- c("deltasbp_TSB_2h_vs_WT_TSB_2h")
    
    dds$condition <- relevel(dds$condition, "WT_TSB_4h")
    dds = DESeq(dds, betaPrior=FALSE)
    resultsNames(dds)
    clist <- c("deltasbp_TSB_4h_vs_WT_TSB_4h")
    
    dds$condition <- relevel(dds$condition, "WT_TSB_18h")
    dds = DESeq(dds, betaPrior=FALSE)
    resultsNames(dds)
    clist <- c("deltasbp_TSB_18h_vs_WT_TSB_18h")
    
    dds$condition <- relevel(dds$condition, "WT_MH_2h")
    dds = DESeq(dds, betaPrior=FALSE)
    resultsNames(dds)
    clist <- c("deltasbp_MH_2h_vs_WT_MH_2h")
    
    dds$condition <- relevel(dds$condition, "WT_MH_4h")
    dds = DESeq(dds, betaPrior=FALSE)
    resultsNames(dds)
    clist <- c("deltasbp_MH_4h_vs_WT_MH_4h")
    
    dds$condition <- relevel(dds$condition, "WT_MH_18h")
    dds = DESeq(dds, betaPrior=FALSE)
    resultsNames(dds)
    clist <- c("deltasbp_MH_18h_vs_WT_MH_18h")
    
    for (i in clist) {
      contrast = paste("condition", i, sep="_")
      #for_Mac_vs_LB  contrast = paste("media", i, sep="_")
      res = results(dds, name=contrast)
      res <- res[!is.na(res$log2FoldChange),]
      res_df <- as.data.frame(res)
    
      write.csv(as.data.frame(res_df[order(res_df$pvalue),]), file = paste(i, "all.txt", sep="-"))
      #res$log2FoldChange < -2 & res$padj < 1e-2
      up <- subset(res_df, padj<=0.01 & log2FoldChange>=2)
      down <- subset(res_df, padj<=0.01 & log2FoldChange<=-2)
      write.csv(as.data.frame(up[order(up$log2FoldChange,decreasing=TRUE),]), file = paste(i, "up.txt", sep="-"))
      write.csv(as.data.frame(down[order(abs(down$log2FoldChange),decreasing=TRUE),]), file = paste(i, "down.txt", sep="-"))
    }
    
    # -- Under host-env (mamba activate plot-numpy1) --
    grep -P "\tgene\t" CP020463.gff > CP020463_gene.gff
    
    python3 ~/Scripts/replace_gene_names.py /home/jhuang/DATA/Data_Michelle_RNAseq_2025/CP020463_gene.gff deltasbp_TSB_2h_vs_WT_TSB_2h-all.txt deltasbp_TSB_2h_vs_WT_TSB_2h-all.csv
    python3 ~/Scripts/replace_gene_names.py /home/jhuang/DATA/Data_Michelle_RNAseq_2025/CP020463_gene.gff deltasbp_TSB_2h_vs_WT_TSB_2h-up.txt deltasbp_TSB_2h_vs_WT_TSB_2h-up.csv
    python3 ~/Scripts/replace_gene_names.py /home/jhuang/DATA/Data_Michelle_RNAseq_2025/CP020463_gene.gff deltasbp_TSB_2h_vs_WT_TSB_2h-down.txt deltasbp_TSB_2h_vs_WT_TSB_2h-down.csv
    
    python3 ~/Scripts/replace_gene_names.py /home/jhuang/DATA/Data_Michelle_RNAseq_2025/CP020463_gene.gff deltasbp_TSB_4h_vs_WT_TSB_4h-all.txt deltasbp_TSB_4h_vs_WT_TSB_4h-all.csv
    python3 ~/Scripts/replace_gene_names.py /home/jhuang/DATA/Data_Michelle_RNAseq_2025/CP020463_gene.gff deltasbp_TSB_4h_vs_WT_TSB_4h-up.txt deltasbp_TSB_4h_vs_WT_TSB_4h-up.csv
    python3 ~/Scripts/replace_gene_names.py /home/jhuang/DATA/Data_Michelle_RNAseq_2025/CP020463_gene.gff deltasbp_TSB_4h_vs_WT_TSB_4h-down.txt deltasbp_TSB_4h_vs_WT_TSB_4h-down.csv
    
    python3 ~/Scripts/replace_gene_names.py /home/jhuang/DATA/Data_Michelle_RNAseq_2025/CP020463_gene.gff deltasbp_TSB_18h_vs_WT_TSB_18h-all.txt deltasbp_TSB_18h_vs_WT_TSB_18h-all.csv
    python3 ~/Scripts/replace_gene_names.py /home/jhuang/DATA/Data_Michelle_RNAseq_2025/CP020463_gene.gff deltasbp_TSB_18h_vs_WT_TSB_18h-up.txt deltasbp_TSB_18h_vs_WT_TSB_18h-up.csv
    python3 ~/Scripts/replace_gene_names.py /home/jhuang/DATA/Data_Michelle_RNAseq_2025/CP020463_gene.gff deltasbp_TSB_18h_vs_WT_TSB_18h-down.txt deltasbp_TSB_18h_vs_WT_TSB_18h-down.csv
    python3 ~/Scripts/replace_gene_names.py /home/jhuang/DATA/Data_Michelle_RNAseq_2025/CP020463_gene.gff deltasbp_MH_2h_vs_WT_MH_2h-all.txt deltasbp_MH_2h_vs_WT_MH_2h-all.csv
    python3 ~/Scripts/replace_gene_names.py /home/jhuang/DATA/Data_Michelle_RNAseq_2025/CP020463_gene.gff deltasbp_MH_2h_vs_WT_MH_2h-up.txt deltasbp_MH_2h_vs_WT_MH_2h-up.csv
    python3 ~/Scripts/replace_gene_names.py /home/jhuang/DATA/Data_Michelle_RNAseq_2025/CP020463_gene.gff deltasbp_MH_2h_vs_WT_MH_2h-down.txt deltasbp_MH_2h_vs_WT_MH_2h-down.csv
    python3 ~/Scripts/replace_gene_names.py /home/jhuang/DATA/Data_Michelle_RNAseq_2025/CP020463_gene.gff deltasbp_MH_4h_vs_WT_MH_4h-all.txt deltasbp_MH_4h_vs_WT_MH_4h-all.csv
    python3 ~/Scripts/replace_gene_names.py /home/jhuang/DATA/Data_Michelle_RNAseq_2025/CP020463_gene.gff deltasbp_MH_4h_vs_WT_MH_4h-up.txt deltasbp_MH_4h_vs_WT_MH_4h-up.csv
    python3 ~/Scripts/replace_gene_names.py /home/jhuang/DATA/Data_Michelle_RNAseq_2025/CP020463_gene.gff deltasbp_MH_4h_vs_WT_MH_4h-down.txt deltasbp_MH_4h_vs_WT_MH_4h-down.csv
    python3 ~/Scripts/replace_gene_names.py /home/jhuang/DATA/Data_Michelle_RNAseq_2025/CP020463_gene.gff deltasbp_MH_18h_vs_WT_MH_18h-all.txt deltasbp_MH_18h_vs_WT_MH_18h-all.csv
    python3 ~/Scripts/replace_gene_names.py /home/jhuang/DATA/Data_Michelle_RNAseq_2025/CP020463_gene.gff deltasbp_MH_18h_vs_WT_MH_18h-up.txt deltasbp_MH_18h_vs_WT_MH_18h-up.csv
    python3 ~/Scripts/replace_gene_names.py /home/jhuang/DATA/Data_Michelle_RNAseq_2025/CP020463_gene.gff deltasbp_MH_18h_vs_WT_MH_18h-down.txt deltasbp_MH_18h_vs_WT_MH_18h-down.csv
    
    # ---- delta sbp TSB 2h vs WT TSB 2h ----
    res <- read.csv("deltasbp_TSB_2h_vs_WT_TSB_2h-all.csv")
    # Replace empty GeneName with modified GeneID
    res$GeneName <- ifelse(
      res$GeneName == "" | is.na(res$GeneName),
      gsub("gene-", "", res$GeneID),
      res$GeneName
    )
    duplicated_genes <- res[duplicated(res$GeneName), "GeneName"]
    #print(duplicated_genes)
    # [1] "bfr"  "lipA" "ahpF" "pcaF" "alr"  "pcaD" "cydB" "lpdA" "pgaC" "ppk1"
    #[11] "pcaF" "tuf"  "galE" "murI" "yccS" "rrf"  "rrf"  "arsB" "ptsP" "umuD"
    #[21] "map"  "pgaB" "rrf"  "rrf"  "rrf"  "pgaD" "uraH" "benE"
    #res[res$GeneName == "bfr", ]
    
    #1st_strategy First occurrence is kept and Subsequent duplicates are removed
    #res <- res[!duplicated(res$GeneName), ]
    #2nd_strategy keep the row with the smallest padj value for each GeneName
    res <- res %>%
      group_by(GeneName) %>%
      slice_min(padj, with_ties = FALSE) %>%
      ungroup()
    res <- as.data.frame(res)
    # Sort res first by padj (ascending) and then by log2FoldChange (descending)
    res <- res[order(res$padj, -res$log2FoldChange), ]
    
    # Assuming res is your dataframe and already processed
    # Filter up-regulated genes: log2FoldChange > 2 and padj < 1e-2
    up_regulated <- res[res$log2FoldChange > 2 & res$padj < 1e-2, ]
    # Filter down-regulated genes: log2FoldChange < -2 and padj < 1e-2
    down_regulated <- res[res$log2FoldChange < -2 & res$padj < 1e-2, ]
    # Create a new workbook
    wb <- createWorkbook()
    # Add the complete dataset as the first sheet
    addWorksheet(wb, "Complete_Data")
    writeData(wb, "Complete_Data", res)
    # Add the up-regulated genes as the second sheet
    addWorksheet(wb, "Up_Regulated")
    writeData(wb, "Up_Regulated", up_regulated)
    # Add the down-regulated genes as the third sheet
    addWorksheet(wb, "Down_Regulated")
    writeData(wb, "Down_Regulated", down_regulated)
    # Save the workbook to a file
    saveWorkbook(wb, "Gene_Expression_Δsbp_TSB_2h_vs_WT_TSB_2h.xlsx", overwrite = TRUE)
    
    # Set the 'GeneName' column as row.names
    rownames(res) <- res$GeneName
    # Drop the 'GeneName' column since it's now the row names
    res$GeneName <- NULL
    head(res)
    
    ## Ensure the data frame matches the expected format
    ## For example, it should have columns: log2FoldChange, padj, etc.
    #res <- as.data.frame(res)
    ## Remove rows with NA in log2FoldChange (if needed)
    #res <- res[!is.na(res$log2FoldChange),]
    
    # Replace padj = 0 with a small value
    #NO_SUCH_RECORDS: res$padj[res$padj == 0] <- 1e-150
    
    #library(EnhancedVolcano)
    # Assuming res is already sorted and processed
    png("Δsbp_TSB_2h_vs_WT_TSB_2h.png", width=1200, height=1200)
    #max.overlaps = 10
    EnhancedVolcano(res,
                    lab = rownames(res),
                    x = 'log2FoldChange',
                    y = 'padj',
                    pCutoff = 1e-2,
                    FCcutoff = 2,
                    title = '',
                    subtitleLabSize = 18,
                    pointSize = 3.0,
                    labSize = 5.0,
                    colAlpha = 1,
                    legendIconSize = 4.0,
                    drawConnectors = TRUE,
                    widthConnectors = 0.5,
                    colConnectors = 'black',
                    subtitle = expression("Δsbp TSB 2h versus WT TSB 2h"))
    dev.off()
    
    # ---- delta sbp TSB 4h vs WT TSB 4h ----
    res <- read.csv("deltasbp_TSB_4h_vs_WT_TSB_4h-all.csv")
    # Replace empty GeneName with modified GeneID
    res$GeneName <- ifelse(
      res$GeneName == "" | is.na(res$GeneName),
      gsub("gene-", "", res$GeneID),
      res$GeneName
    )
    duplicated_genes <- res[duplicated(res$GeneName), "GeneName"]
    
    res <- res %>%
      group_by(GeneName) %>%
      slice_min(padj, with_ties = FALSE) %>%
      ungroup()
    res <- as.data.frame(res)
    # Sort res first by padj (ascending) and then by log2FoldChange (descending)
    res <- res[order(res$padj, -res$log2FoldChange), ]
    
    # Assuming res is your dataframe and already processed
    # Filter up-regulated genes: log2FoldChange > 2 and padj < 1e-2
    up_regulated <- res[res$log2FoldChange > 2 & res$padj < 1e-2, ]
    # Filter down-regulated genes: log2FoldChange < -2 and padj < 1e-2
    down_regulated <- res[res$log2FoldChange < -2 & res$padj < 1e-2, ]
    # Create a new workbook
    wb <- createWorkbook()
    # Add the complete dataset as the first sheet
    addWorksheet(wb, "Complete_Data")
    writeData(wb, "Complete_Data", res)
    # Add the up-regulated genes as the second sheet
    addWorksheet(wb, "Up_Regulated")
    writeData(wb, "Up_Regulated", up_regulated)
    # Add the down-regulated genes as the third sheet
    addWorksheet(wb, "Down_Regulated")
    writeData(wb, "Down_Regulated", down_regulated)
    # Save the workbook to a file
    saveWorkbook(wb, "Gene_Expression_Δsbp_TSB_4h_vs_WT_TSB_4h.xlsx", overwrite = TRUE)
    
    # Set the 'GeneName' column as row.names
    rownames(res) <- res$GeneName
    # Drop the 'GeneName' column since it's now the row names
    res$GeneName <- NULL
    head(res)
    
    #library(EnhancedVolcano)
    # Assuming res is already sorted and processed
    png("Δsbp_TSB_4h_vs_WT_TSB_4h.png", width=1200, height=1200)
    #max.overlaps = 10
    EnhancedVolcano(res,
                    lab = rownames(res),
                    x = 'log2FoldChange',
                    y = 'padj',
                    pCutoff = 1e-2,
                    FCcutoff = 2,
                    title = '',
                    subtitleLabSize = 18,
                    pointSize = 3.0,
                    labSize = 5.0,
                    colAlpha = 1,
                    legendIconSize = 4.0,
                    drawConnectors = TRUE,
                    widthConnectors = 0.5,
                    colConnectors = 'black',
                    subtitle = expression("Δsbp TSB 4h versus WT TSB 4h"))
    dev.off()
    
    # ---- delta sbp TSB 18h vs WT TSB 18h ----
    res <- read.csv("deltasbp_TSB_18h_vs_WT_TSB_18h-all.csv")
    # Replace empty GeneName with modified GeneID
    res$GeneName <- ifelse(
      res$GeneName == "" | is.na(res$GeneName),
      gsub("gene-", "", res$GeneID),
      res$GeneName
    )
    duplicated_genes <- res[duplicated(res$GeneName), "GeneName"]
    
    res <- res %>%
      group_by(GeneName) %>%
      slice_min(padj, with_ties = FALSE) %>%
      ungroup()
    res <- as.data.frame(res)
    # Sort res first by padj (ascending) and then by log2FoldChange (descending)
    res <- res[order(res$padj, -res$log2FoldChange), ]
    
    # Assuming res is your dataframe and already processed
    # Filter up-regulated genes: log2FoldChange > 2 and padj < 1e-2
    up_regulated <- res[res$log2FoldChange > 2 & res$padj < 1e-2, ]
    # Filter down-regulated genes: log2FoldChange < -2 and padj < 1e-2
    down_regulated <- res[res$log2FoldChange < -2 & res$padj < 1e-2, ]
    # Create a new workbook
    wb <- createWorkbook()
    # Add the complete dataset as the first sheet
    addWorksheet(wb, "Complete_Data")
    writeData(wb, "Complete_Data", res)
    # Add the up-regulated genes as the second sheet
    addWorksheet(wb, "Up_Regulated")
    writeData(wb, "Up_Regulated", up_regulated)
    # Add the down-regulated genes as the third sheet
    addWorksheet(wb, "Down_Regulated")
    writeData(wb, "Down_Regulated", down_regulated)
    # Save the workbook to a file
    saveWorkbook(wb, "Gene_Expression_Δsbp_TSB_18h_vs_WT_TSB_18h.xlsx", overwrite = TRUE)
    
    # Set the 'GeneName' column as row.names
    rownames(res) <- res$GeneName
    # Drop the 'GeneName' column since it's now the row names
    res$GeneName <- NULL
    head(res)
    
    #library(EnhancedVolcano)
    # Assuming res is already sorted and processed
    png("Δsbp_TSB_18h_vs_WT_TSB_18h.png", width=1200, height=1200)
    #max.overlaps = 10
    EnhancedVolcano(res,
                    lab = rownames(res),
                    x = 'log2FoldChange',
                    y = 'padj',
                    pCutoff = 1e-2,
                    FCcutoff = 2,
                    title = '',
                    subtitleLabSize = 18,
                    pointSize = 3.0,
                    labSize = 5.0,
                    colAlpha = 1,
                    legendIconSize = 4.0,
                    drawConnectors = TRUE,
                    widthConnectors = 0.5,
                    colConnectors = 'black',
                    subtitle = expression("Δsbp TSB 18h versus WT TSB 18h"))
    dev.off()
    
    # ---- delta sbp MH 2h vs WT MH 2h ----
    res <- read.csv("deltasbp_MH_2h_vs_WT_MH_2h-all.csv")
    # Replace empty GeneName with modified GeneID
    res$GeneName <- ifelse(
      res$GeneName == "" | is.na(res$GeneName),
      gsub("gene-", "", res$GeneID),
      res$GeneName
    )
    duplicated_genes <- res[duplicated(res$GeneName), "GeneName"]
    #print(duplicated_genes)
    # [1] "bfr"  "lipA" "ahpF" "pcaF" "alr"  "pcaD" "cydB" "lpdA" "pgaC" "ppk1"
    #[11] "pcaF" "tuf"  "galE" "murI" "yccS" "rrf"  "rrf"  "arsB" "ptsP" "umuD"
    #[21] "map"  "pgaB" "rrf"  "rrf"  "rrf"  "pgaD" "uraH" "benE"
    #res[res$GeneName == "bfr", ]
    
    #1st_strategy First occurrence is kept and Subsequent duplicates are removed
    #res <- res[!duplicated(res$GeneName), ]
    #2nd_strategy keep the row with the smallest padj value for each GeneName
    res <- res %>%
      group_by(GeneName) %>%
      slice_min(padj, with_ties = FALSE) %>%
      ungroup()
    res <- as.data.frame(res)
    # Sort res first by padj (ascending) and then by log2FoldChange (descending)
    res <- res[order(res$padj, -res$log2FoldChange), ]
    
    # Assuming res is your dataframe and already processed
    # Filter up-regulated genes: log2FoldChange > 2 and padj < 1e-2
    up_regulated <- res[res$log2FoldChange > 2 & res$padj < 1e-2, ]
    # Filter down-regulated genes: log2FoldChange < -2 and padj < 1e-2
    down_regulated <- res[res$log2FoldChange < -2 & res$padj < 1e-2, ]
    # Create a new workbook
    wb <- createWorkbook()
    # Add the complete dataset as the first sheet
    addWorksheet(wb, "Complete_Data")
    writeData(wb, "Complete_Data", res)
    # Add the up-regulated genes as the second sheet
    addWorksheet(wb, "Up_Regulated")
    writeData(wb, "Up_Regulated", up_regulated)
    # Add the down-regulated genes as the third sheet
    addWorksheet(wb, "Down_Regulated")
    writeData(wb, "Down_Regulated", down_regulated)
    # Save the workbook to a file
    saveWorkbook(wb, "Gene_Expression_Δsbp_MH_2h_vs_WT_MH_2h.xlsx", overwrite = TRUE)
    
    # Set the 'GeneName' column as row.names
    rownames(res) <- res$GeneName
    # Drop the 'GeneName' column since it's now the row names
    res$GeneName <- NULL
    head(res)
    
    ## Ensure the data frame matches the expected format
    ## For example, it should have columns: log2FoldChange, padj, etc.
    #res <- as.data.frame(res)
    ## Remove rows with NA in log2FoldChange (if needed)
    #res <- res[!is.na(res$log2FoldChange),]
    
    # Replace padj = 0 with a small value
    #NO_SUCH_RECORDS: res$padj[res$padj == 0] <- 1e-150
    
    #library(EnhancedVolcano)
    # Assuming res is already sorted and processed
    png("Δsbp_MH_2h_vs_WT_MH_2h.png", width=1200, height=1200)
    #max.overlaps = 10
    EnhancedVolcano(res,
                    lab = rownames(res),
                    x = 'log2FoldChange',
                    y = 'padj',
                    pCutoff = 1e-2,
                    FCcutoff = 2,
                    title = '',
                    subtitleLabSize = 18,
                    pointSize = 3.0,
                    labSize = 5.0,
                    colAlpha = 1,
                    legendIconSize = 4.0,
                    drawConnectors = TRUE,
                    widthConnectors = 0.5,
                    colConnectors = 'black',
                    subtitle = expression("Δsbp MH 2h versus WT MH 2h"))
    dev.off()
    
    # ---- delta sbp MH 4h vs WT MH 4h ----
    res <- read.csv("deltasbp_MH_4h_vs_WT_MH_4h-all.csv")
    # Replace empty GeneName with modified GeneID
    res$GeneName <- ifelse(
      res$GeneName == "" | is.na(res$GeneName),
      gsub("gene-", "", res$GeneID),
      res$GeneName
    )
    duplicated_genes <- res[duplicated(res$GeneName), "GeneName"]
    
    res <- res %>%
      group_by(GeneName) %>%
      slice_min(padj, with_ties = FALSE) %>%
      ungroup()
    res <- as.data.frame(res)
    # Sort res first by padj (ascending) and then by log2FoldChange (descending)
    res <- res[order(res$padj, -res$log2FoldChange), ]
    
    # Assuming res is your dataframe and already processed
    # Filter up-regulated genes: log2FoldChange > 2 and padj < 1e-2
    up_regulated <- res[res$log2FoldChange > 2 & res$padj < 1e-2, ]
    # Filter down-regulated genes: log2FoldChange < -2 and padj < 1e-2
    down_regulated <- res[res$log2FoldChange < -2 & res$padj < 1e-2, ]
    # Create a new workbook
    wb <- createWorkbook()
    # Add the complete dataset as the first sheet
    addWorksheet(wb, "Complete_Data")
    writeData(wb, "Complete_Data", res)
    # Add the up-regulated genes as the second sheet
    addWorksheet(wb, "Up_Regulated")
    writeData(wb, "Up_Regulated", up_regulated)
    # Add the down-regulated genes as the third sheet
    addWorksheet(wb, "Down_Regulated")
    writeData(wb, "Down_Regulated", down_regulated)
    # Save the workbook to a file
    saveWorkbook(wb, "Gene_Expression_Δsbp_MH_4h_vs_WT_MH_4h.xlsx", overwrite = TRUE)
    
    # Set the 'GeneName' column as row.names
    rownames(res) <- res$GeneName
    # Drop the 'GeneName' column since it's now the row names
    res$GeneName <- NULL
    head(res)
    
    #library(EnhancedVolcano)
    # Assuming res is already sorted and processed
    png("Δsbp_MH_4h_vs_WT_MH_4h.png", width=1200, height=1200)
    #max.overlaps = 10
    EnhancedVolcano(res,
                    lab = rownames(res),
                    x = 'log2FoldChange',
                    y = 'padj',
                    pCutoff = 1e-2,
                    FCcutoff = 2,
                    title = '',
                    subtitleLabSize = 18,
                    pointSize = 3.0,
                    labSize = 5.0,
                    colAlpha = 1,
                    legendIconSize = 4.0,
                    drawConnectors = TRUE,
                    widthConnectors = 0.5,
                    colConnectors = 'black',
                    subtitle = expression("Δsbp MH 4h versus WT MH 4h"))
    dev.off()
    
    # ---- delta sbp MH 18h vs WT MH 18h ----
    res <- read.csv("deltasbp_MH_18h_vs_WT_MH_18h-all.csv")
    # Replace empty GeneName with modified GeneID
    res$GeneName <- ifelse(
      res$GeneName == "" | is.na(res$GeneName),
      gsub("gene-", "", res$GeneID),
      res$GeneName
    )
    duplicated_genes <- res[duplicated(res$GeneName), "GeneName"]
    
    res <- res %>%
      group_by(GeneName) %>%
      slice_min(padj, with_ties = FALSE) %>%
      ungroup()
    res <- as.data.frame(res)
    # Sort res first by padj (ascending) and then by log2FoldChange (descending)
    res <- res[order(res$padj, -res$log2FoldChange), ]
    
    # Assuming res is your dataframe and already processed
    # Filter up-regulated genes: log2FoldChange > 2 and padj < 1e-2
    up_regulated <- res[res$log2FoldChange > 2 & res$padj < 1e-2, ]
    # Filter down-regulated genes: log2FoldChange < -2 and padj < 1e-2
    down_regulated <- res[res$log2FoldChange < -2 & res$padj < 1e-2, ]
    # Create a new workbook
    wb <- createWorkbook()
    # Add the complete dataset as the first sheet
    addWorksheet(wb, "Complete_Data")
    writeData(wb, "Complete_Data", res)
    # Add the up-regulated genes as the second sheet
    addWorksheet(wb, "Up_Regulated")
    writeData(wb, "Up_Regulated", up_regulated)
    # Add the down-regulated genes as the third sheet
    addWorksheet(wb, "Down_Regulated")
    writeData(wb, "Down_Regulated", down_regulated)
    # Save the workbook to a file
    saveWorkbook(wb, "Gene_Expression_Δsbp_MH_18h_vs_WT_MH_18h.xlsx", overwrite = TRUE)
    
    # Set the 'GeneName' column as row.names
    rownames(res) <- res$GeneName
    # Drop the 'GeneName' column since it's now the row names
    res$GeneName <- NULL
    head(res)
    
    #library(EnhancedVolcano)
    # Assuming res is already sorted and processed
    png("Δsbp_MH_18h_vs_WT_MH_18h.png", width=1200, height=1200)
    #max.overlaps = 10
    EnhancedVolcano(res,
                    lab = rownames(res),
                    x = 'log2FoldChange',
                    y = 'padj',
                    pCutoff = 1e-2,
                    FCcutoff = 2,
                    title = '',
                    subtitleLabSize = 18,
                    pointSize = 3.0,
                    labSize = 5.0,
                    colAlpha = 1,
                    legendIconSize = 4.0,
                    drawConnectors = TRUE,
                    widthConnectors = 0.5,
                    colConnectors = 'black',
                    subtitle = expression("Δsbp MH 18h versus WT MH 18h"))
    dev.off()
    
    #Annotate the Gene_Expression_xxx_vs_yyy.xlsx in the next steps (see below e.g. Gene_Expression_with_Annotations_Urine_vs_MHB.xlsx)
  10. Clustering the genes and draw heatmap

    #http://xgenes.com/article/article-content/150/draw-venn-diagrams-using-matplotlib/
    #http://xgenes.com/article/article-content/276/go-terms-for-s-epidermidis/
    # save the Up-regulated and Down-regulated genes into -up.id and -down.id
    for i in deltasbp_TSB_2h_vs_WT_TSB_2h deltasbp_TSB_4h_vs_WT_TSB_4h deltasbp_TSB_18h_vs_WT_TSB_18h  deltasbp_MH_2h_vs_WT_MH_2h deltasbp_MH_4h_vs_WT_MH_4h deltasbp_MH_18h_vs_WT_MH_18h; do
      echo "cut -d',' -f1-1 ${i}-up.txt > ${i}-up.id";
      echo "cut -d',' -f1-1 ${i}-down.txt > ${i}-down.id";
    done
    
    cat *.id | sort -u > ids
    #add Gene_Id in the first line, delete the ""  #Note that using GeneID as index, rather than GeneName, since .txt contains only GeneID.
    GOI <- read.csv("ids")$Gene_Id    #95
    RNASeq.NoCellLine <- assay(rld)
    #install.packages("gplots")
    library("gplots")
    #clustering methods: "ward.D", "ward.D2", "single", "complete", "average" (= UPGMA), "mcquitty" (= WPGMA), "median" (= WPGMC) or "centroid" (= UPGMC).  pearson or spearman
    datamat = RNASeq.NoCellLine[GOI, ]
    #datamat = RNASeq.NoCellLine
    write.csv(as.data.frame(datamat), file ="DEGs_heatmap_expression_data.txt")
    
    constant_rows <- apply(datamat, 1, function(row) var(row) == 0)
    if(any(constant_rows)) {
      cat("Removing", sum(constant_rows), "constant rows.\n")
      datamat <- datamat[!constant_rows, ]
    }
    hr <- hclust(as.dist(1-cor(t(datamat), method="pearson")), method="complete")
    hc <- hclust(as.dist(1-cor(datamat, method="spearman")), method="complete")
    mycl = cutree(hr, h=max(hr$height)/1.1)
    mycol = c("YELLOW", "BLUE", "ORANGE", "MAGENTA", "CYAN", "RED", "GREEN", "MAROON", "LIGHTBLUE", "PINK", "MAGENTA", "LIGHTCYAN", "LIGHTRED", "LIGHTGREEN");
    mycol = mycol[as.vector(mycl)]
    #png("DEGs_heatmap.png", width=900, height=800)
    #cex.lab=10, labRow="",
    #png("DEGs_heatmap.png", width=1200, height=1000)
    #heatmap.2(as.matrix(datamat),Rowv=as.dendrogram(hr),Colv = NA, dendrogram = 'row',labRow="",
                scale='row',trace='none',col=bluered(75), cexCol=1.8,
                RowSideColors = mycol, margins=c(10,2), cexRow=1.5, srtCol=34, lhei = c(1, 8), lwid=c(2, 8))  #rownames(datamat)
    png("DEGs_heatmap.png", width=1200, height=2000)
    heatmap.2(datamat,
            Rowv = as.dendrogram(hr),
            col = bluered(75),
            scale = "row",
            RowSideColors = mycol,
            trace = "none",
            margin = c(10, 15),         # bottom, left
            sepwidth = c(0, 0),
            dendrogram = 'row',
            Colv = 'false',
            density.info = 'none',
            labRow = rownames(datamat),
            cexRow = 1.5,
            cexCol = 1.5,
            srtCol = 35,
            lhei = c(0.2, 4),           # reduce top space (was 1 or more)
            lwid = c(0.4, 4))           # reduce left space (was 1 or more)
    dev.off()
    
    #### cluster members #####
    write.csv(names(subset(mycl, mycl == '1')),file='cluster1_YELLOW.txt')
    write.csv(names(subset(mycl, mycl == '2')),file='cluster2_DARKBLUE.txt')
    write.csv(names(subset(mycl, mycl == '3')),file='cluster3_DARKORANGE.txt')
    write.csv(names(subset(mycl, mycl == '4')),file='cluster4_DARKMAGENTA.txt')
    write.csv(names(subset(mycl, mycl == '5')),file='cluster5_DARKCYAN.txt')
    #~/Tools/csv2xls-0.4/csv_to_xls.py cluster*.txt -d',' -o DEGs_heatmap_cluster_members.xls
    #~/Tools/csv2xls-0.4/csv_to_xls.py DEGs_heatmap_expression_data.txt -d',' -o DEGs_heatmap_expression_data.xls;
    
    #### (NOT_WORKING) cluster members (adding annotations, note that it does not work for the bacteria, since it is not model-speices and we cannot use mart=ensembl) #####
    subset_1<-names(subset(mycl, mycl == '1'))
    data <- as.data.frame(datamat[rownames(datamat) %in% subset_1, ])  #2575
    subset_2<-names(subset(mycl, mycl == '2'))
    data <- as.data.frame(datamat[rownames(datamat) %in% subset_2, ])  #1855
    subset_3<-names(subset(mycl, mycl == '3'))
    data <- as.data.frame(datamat[rownames(datamat) %in% subset_3, ])  #217
    subset_4<-names(subset(mycl, mycl == '4'))
    data <- as.data.frame(datamat[rownames(datamat) %in% subset_4, ])  #
    subset_5<-names(subset(mycl, mycl == '5'))
    data <- as.data.frame(datamat[rownames(datamat) %in% subset_5, ])  #
    # Initialize an empty data frame for the annotated data
    annotated_data <- data.frame()
    # Determine total number of genes
    total_genes <- length(rownames(data))
    # Loop through each gene to annotate
    for (i in 1:total_genes) {
        gene <- rownames(data)[i]
        result <- getBM(attributes = c('ensembl_gene_id', 'external_gene_name', 'gene_biotype', 'entrezgene_id', 'chromosome_name', 'start_position', 'end_position', 'strand', 'description'),
                        filters = 'ensembl_gene_id',
                        values = gene,
                        mart = ensembl)
        # If multiple rows are returned, take the first one
        if (nrow(result) > 1) {
            result <- result[1, ]
        }
        # Check if the result is empty
        if (nrow(result) == 0) {
            result <- data.frame(ensembl_gene_id = gene,
                                external_gene_name = NA,
                                gene_biotype = NA,
                                entrezgene_id = NA,
                                chromosome_name = NA,
                                start_position = NA,
                                end_position = NA,
                                strand = NA,
                                description = NA)
        }
        # Transpose expression values
        expression_values <- t(data.frame(t(data[gene, ])))
        colnames(expression_values) <- colnames(data)
        # Combine gene information and expression data
        combined_result <- cbind(result, expression_values)
        # Append to the final dataframe
        annotated_data <- rbind(annotated_data, combined_result)
        # Print progress every 100 genes
        if (i %% 100 == 0) {
            cat(sprintf("Processed gene %d out of %d\n", i, total_genes))
        }
    }
    # Save the annotated data to a new CSV file
    write.csv(annotated_data, "cluster1_YELLOW.csv", row.names=FALSE)
    write.csv(annotated_data, "cluster2_DARKBLUE.csv", row.names=FALSE)
    write.csv(annotated_data, "cluster3_DARKORANGE.csv", row.names=FALSE)
    write.csv(annotated_data, "cluster4_DARKMAGENTA.csv", row.names=FALSE)
    write.csv(annotated_data, "cluster5_DARKCYAN.csv", row.names=FALSE)
    #~/Tools/csv2xls-0.4/csv_to_xls.py cluster*.csv -d',' -o DEGs_heatmap_clusters.xls

KEGG and GO annotations in non-model organisms

https://www.biobam.com/functional-analysis/

Blast2GO_workflow

  1. Assign KEGG and GO Terms (see diagram above)

    Since your organism is non-model, standard R databases (org.Hs.eg.db, etc.) won’t work. You’ll need to manually retrieve KEGG and GO annotations.
    
    Option 1 (KEGG Terms): EggNog based on orthology and phylogenies
    
        EggNOG-mapper assigns both KEGG Orthology (KO) IDs and GO terms.
    
        Install EggNOG-mapper:
    
            mamba create -n eggnog_env python=3.8 eggnog-mapper -c conda-forge -c bioconda  #eggnog-mapper_2.1.12
            mamba activate eggnog_env
    
        Run annotation:
    
            #diamond makedb --in eggnog6.prots.faa -d eggnog_proteins.dmnd
            mkdir /home/jhuang/mambaforge/envs/eggnog_env/lib/python3.8/site-packages/data/
            download_eggnog_data.py --dbname eggnog.db -y --data_dir /home/jhuang/mambaforge/envs/eggnog_env/lib/python3.8/site-packages/data/
            #NOT_WORKING: emapper.py -i CP020463_gene.fasta -o eggnog_dmnd_out --cpu 60 -m diamond[hmmer,mmseqs] --dmnd_db /home/jhuang/REFs/eggnog_data/data/eggnog_proteins.dmnd
            #Download the protein sequences from Genbank
            mv ~/Downloads/sequence\ \(3\).txt CP020463_protein_.fasta
            python ~/Scripts/update_fasta_header.py CP020463_protein_.fasta CP020463_protein.fasta
            emapper.py -i CP020463_protein.fasta -o eggnog_out --cpu 60  #--resume
            #----> result annotations.tsv: Contains KEGG, GO, and other functional annotations.
            #---->  470.IX87_14445:
                * 470 likely refers to the organism or strain (e.g., Acinetobacter baumannii ATCC 19606 or another related strain).
                * IX87_14445 would refer to a specific gene or protein within that genome.
    
        Extract KEGG KO IDs from annotations.emapper.annotations.
    
    Option 2 (GO Terms from 'Blast2GO 5 Basic', saved in blast2go_annot.annot): Using Blast/Diamond + Blast2GO_GUI based on sequence alignment + GO mapping
    
    * jhuang@WS-2290C:~/DATA/Data_Michelle_RNAseq_2025$ ~/Tools/Blast2GO/Blast2GO_Launcher setting the workspace "mkdir ~/b2gWorkspace_Michelle_RNAseq_2025"; cp /mnt/md1/DATA/Data_Michelle_RNAseq_2025/results/star_salmon/degenes/CP020463_protein.fasta ~/b2gWorkspace_Michelle_RNAseq_2025
    * 'Load protein sequences' (Tags: NONE, generated columns: Nr, SeqName) by choosing the file CP020463_protein.fasta as input -->
    * Buttons 'blast' at the NCBI (Parameters: blastp, nr, ...) (Tags: BLASTED, generated columns: Description, Length, #Hits, e-Value, sim mean),
            QBlast finished with warnings!
            Blasted Sequences: 2084
            Sequences without results: 105
            Check the Job log for details and try to submit again.
            Restarting QBlast may result in additional results, depending on the error type.
            "Blast (CP020463_protein) Done"
    * Button 'mapping' (Tags: MAPPED, generated columns: #GO, GO IDs, GO Names), "Mapping finished - Please proceed now to annotation."
            "Mapping (CP020463_protein) Done"
            "Mapping finished - Please proceed now to annotation."
    * Button 'annot' (Tags: ANNOTATED, generated columns: Enzyme Codes, Enzyme Names), "Annotation finished."
            * Used parameter 'Annotation CutOff': The Blast2GO Annotation Rule seeks to find the most specific GO annotations with a certain level of reliability. An annotation score is calculated for each candidate GO which is composed by the sequence similarity of the Blast Hit, the evidence code of the source GO and the position of the particular GO in the Gene Ontology hierarchy. This annotation score cutoff select the most specific GO term for a given GO branch which lies above this value.
            * Used parameter 'GO Weight' is a value which is added to Annotation Score of a more general/abstract Gene Ontology term for each of its more specific, original source GO terms. In this case, more general GO terms which summarise many original source terms (those ones directly associated to the Blast Hits) will have a higher Annotation Score.
            "Annotation (CP020463_protein) Done"
            "Annotation finished."
    or blast2go_cli_v1.5.1 (NOT_USED)
    
            #https://help.biobam.com/space/BCD/2250407989/Installation
            #see ~/Scripts/blast2go_pipeline.sh
    
    Option 3 (GO Terms from 'Blast2GO 5 Basic', saved in blast2go_annot.annot2): Interpro based protein families / domains --> Button interpro
        * Button 'interpro' (Tags: INTERPRO, generated columns: InterPro IDs, InterPro GO IDs, InterPro GO Names) --> "InterProScan Finished - You can now merge the obtained GO Annotations."
            "InterProScan (CP020463_protein) Done"
            "InterProScan Finished - You can now merge the obtained GO Annotations."
    MERGE the results of InterPro GO IDs (Option 3) to GO IDs (Option 2) and generate final GO IDs
        * Button 'interpro'/'Merge InterProScan GOs to Annotation' --> "Merge (add and validate) all GO terms retrieved via InterProScan to the already existing GO annotation."
            "Merge InterProScan GOs to Annotation (CP020463_protein) Done"
            "Finished merging GO terms from InterPro with annotations."
            "Maybe you want to run ANNEX (Annotation Augmentation)."
        #* Button 'annot'/'ANNEX' --> "ANNEX finished. Maybe you want to do the next step: Enzyme Code Mapping."
    File -> Export -> Export Annotations -> Export Annotations (.annot, custom, etc.)
            #~/b2gWorkspace_Michelle_RNAseq_2025/blast2go_annot.annot is generated!
    
        #-- before merging (blast2go_annot.annot) --
        #H0N29_18790     GO:0004842      ankyrin repeat domain-containing protein
        #H0N29_18790     GO:0085020
        #-- after merging (blast2go_annot.annot2) -->
        #H0N29_18790     GO:0031436      ankyrin repeat domain-containing protein
        #H0N29_18790     GO:0070531
        #H0N29_18790     GO:0004842
        #H0N29_18790     GO:0005515
        #H0N29_18790     GO:0085020
    
        cp blast2go_annot.annot blast2go_annot.annot2
    
    Option 4 (NOT_USED): RFAM for non-colding RNA
    
    Option 5 (NOT_USED): PSORTb for subcellular localizations
    
    Option 6 (NOT_USED): KAAS (KEGG Automatic Annotation Server)
    
    * Go to KAAS
    * Upload your FASTA file.
    * Select an appropriate gene set.
    * Download the KO assignments.
  2. Find the Closest KEGG Organism Code (NOT_USED)

    Since your species isn't directly in KEGG, use a closely related organism.
    
    * Check available KEGG organisms:
    
            library(clusterProfiler)
            library(KEGGREST)
    
            kegg_organisms <- keggList("organism")
    
            Pick the closest relative (e.g., zebrafish "dre" for fish, Arabidopsis "ath" for plants).
    
            # Search for Acinetobacter in the list
            grep("Acinetobacter", kegg_organisms, ignore.case = TRUE, value = TRUE)
            # Gammaproteobacteria
            #Extract KO IDs from the eggnog results for  "Acinetobacter baumannii strain ATCC 19606"
  3. Find the Closest KEGG Organism for a Non-Model Species (NOT_USED)

    If your organism is not in KEGG, search for the closest relative:
    
            grep("fish", kegg_organisms, ignore.case = TRUE, value = TRUE)  # Example search
    
    For KEGG pathway enrichment in non-model species, use "ko" instead of a species code (the code has been intergrated in the point 4):
    
            kegg_enrich <- enrichKEGG(gene = gene_list, organism = "ko")  # "ko" = KEGG Orthology
  4. Perform KEGG and GO Enrichment in R (under dir ~/DATA/Data_Tam_RNAseq_2025_LB_vs_Mac_ATCC19606/results/star_salmon/degenes)

        #BiocManager::install("GO.db")
        #BiocManager::install("AnnotationDbi")
    
        # Load required libraries
        library(openxlsx)  # For Excel file handling
        library(dplyr)     # For data manipulation
        library(tidyr)
        library(stringr)
        library(clusterProfiler)  # For KEGG and GO enrichment analysis
        #library(org.Hs.eg.db)  # Replace with appropriate organism database
        library(GO.db)
        library(AnnotationDbi)
    
        setwd("~/DATA/Data_Michelle_RNAseq_2025/results/star_salmon/degenes")
        # PREPARING go_terms and ec_terms: annot_* file: cut -f1-2 -d$'\t' blast2go_annot.annot2 > blast2go_annot.annot2_
        # PREPARING eggnog_out.emapper.annotations.txt from eggnog_out.emapper.annotations by removing ## lines and renaming #query to query
        #(plot-numpy1) jhuang@WS-2290C:~/DATA/Data_Tam_RNAseq_2024_AUM_MHB_Urine_ATCC19606$ diff eggnog_out.emapper.annotations eggnog_out.emapper.annotations.txt
        #1,5c1
        #< ## Thu Jan 30 16:34:52 2025
        #< ## emapper-2.1.12
        #< ## /home/jhuang/mambaforge/envs/eggnog_env/bin/emapper.py -i CP059040_protein.fasta -o eggnog_out --cpu 60
        #< ##
        #< #query        seed_ortholog   evalue  score   eggNOG_OGs      max_annot_lvl   COG_category    Description     Preferred_name  GOs     EC      KEGG_ko KEGG_Pathway    KEGG_Module     KEGG_Reaction   KEGG_rclass     BRITE   KEGG_TC CAZy    BiGG_Reaction   PFAMs
        #---
        #> query seed_ortholog   evalue  score   eggNOG_OGs      max_annot_lvl   COG_category    Description     Preferred_name  GOs     EC      KEGG_ko KEGG_Pathway   KEGG_Module      KEGG_Reaction   KEGG_rclass     BRITE   KEGG_TC CAZy    BiGG_Reaction   PFAMs
        #3620,3622d3615
        #< ## 3614 queries scanned
        #< ## Total time (seconds): 8.176708459854126
    
        # Step 1: Load the blast2go annotation file with a check for missing columns
        annot_df <- read.table("/home/jhuang/b2gWorkspace_Michelle_RNAseq_2025/blast2go_annot.annot2_", header = FALSE, sep = "\t", stringsAsFactors = FALSE, fill = TRUE)
    
        # If the structure is inconsistent, we can make sure there are exactly 3 columns:
        colnames(annot_df) <- c("GeneID", "Term")
        # Step 2: Filter and aggregate GO and EC terms as before
        go_terms <- annot_df %>%
        filter(grepl("^GO:", Term)) %>%
        group_by(GeneID) %>%
        summarize(GOs = paste(Term, collapse = ","), .groups = "drop")
        ec_terms <- annot_df %>%
        filter(grepl("^EC:", Term)) %>%
        group_by(GeneID) %>%
        summarize(EC = paste(Term, collapse = ","), .groups = "drop")
    
        # Key Improvements:
        #    * Looped processing of all 6 input files to avoid redundancy.
        #    * Robust handling of empty KEGG and GO enrichment results to prevent contamination of results between iterations.
        #    * File-safe output: Each dataset creates a separate Excel workbook with enriched sheets only if data exists.
        #    * Error handling for GO term descriptions via tryCatch.
        #    * Improved clarity and modular structure for easier maintenance and future additions.
    
        # Define the filenames and output suffixes
        file_list <- c(
        "deltasbp_TSB_2h_vs_WT_TSB_2h-all.csv",
        "deltasbp_TSB_4h_vs_WT_TSB_4h-all.csv",
        "deltasbp_TSB_18h_vs_WT_TSB_18h-all.csv",
        "deltasbp_MH_2h_vs_WT_MH_2h-all.csv",
        "deltasbp_MH_4h_vs_WT_MH_4h-all.csv",
        "deltasbp_MH_18h_vs_WT_MH_18h-all.csv"
        )
    
        file_name = "deltasbp_MH_18h_vs_WT_MH_18h-all.csv"
    
        #for (file_name in file_list) {
        message("Processing file: ", file_name)
    
        # Clear variables from previous iteration
        res <- NULL
        res_updated <- NULL
        up_regulated <- NULL
        down_regulated <- NULL
        gene_list_kegg_up <- NULL
        gene_list_kegg_down <- NULL
        kegg_enrichment_up <- NULL
        kegg_enrichment_down <- NULL
        kegg_enrichment_up_df <- NULL
        kegg_enrichment_down_df <- NULL
        gene_list_go_up <- NULL
        go_terms_df_up <- NULL
        gene_list_go_down <- NULL
        go_terms_df_down <- NULL
        background_genes <- NULL
        go_annotation <- NULL
        go_enrichment_up <- NULL
        go_enrichment_down <- NULL
        wb <- NULL
    
        # Now load and process fresh for this file
        res <- read.csv(file_name)
    
        # Replace empty GeneName with modified GeneID
        res$GeneName <- ifelse(
        res$GeneName == "" | is.na(res$GeneName),
        gsub("gene-", "", res$GeneID),
        res$GeneName
        )
    
        # Remove duplicates by smallest padj
        res <- res %>%
        group_by(GeneName) %>%
        slice_min(padj, with_ties = FALSE) %>%
        ungroup() %>%
        as.data.frame()
    
        # Sort by padj ascending, then log2FoldChange descending
        res <- res[order(res$padj, -res$log2FoldChange), ]
    
        # Load eggnog data
        eggnog_data <- read.delim("~/DATA/Data_Michelle_RNAseq_2025/eggnog_out.emapper.annotations.txt",
                                header = TRUE, sep = "\t")
    
        res$GeneID <- gsub("gene-", "", res$GeneID)
        res <- res %>% left_join(eggnog_data, by = c("GeneID" = "query"))
    
        # Join with go_terms and ec_terms (assumed preloaded)
        res_updated <- res %>%
        left_join(go_terms, by = "GeneID") %>%
        left_join(ec_terms, by = "GeneID") %>%
        select(-EC.x, -GOs.x) %>%
        rename(EC = EC.y, GOs = GOs.y)
    
        # Filter up/down regulated genes
        up_regulated <- res_updated %>% filter(log2FoldChange > 2, padj < 0.01)
        down_regulated <- res_updated %>% filter(log2FoldChange < -2, padj < 0.01)
    
        # Prepare KEGG enrichment for up-regulated
        gene_list_kegg_up <- gsub("ko:", "", up_regulated$KEGG_ko)
        gene_list_kegg_up <- gene_list_kegg_up[!is.na(gene_list_kegg_up) & gene_list_kegg_up != ""]
        kegg_enrichment_up <- enrichKEGG(gene = gene_list_kegg_up, organism = 'ko')
    
        # Prepare KEGG enrichment for down-regulated
        gene_list_kegg_down <- gsub("ko:", "", down_regulated$KEGG_ko)
        gene_list_kegg_down <- gene_list_kegg_down[!is.na(gene_list_kegg_down) & gene_list_kegg_down != ""]
        kegg_enrichment_down <- enrichKEGG(gene = gene_list_kegg_down, organism = 'ko')
    
        # Function to get data.frame from enrichKEGG or return empty data.frame if no results
        get_enrich_df <- function(enrich_obj) {
        if (is.null(enrich_obj) || length(enrich_obj) == 0) {
            return(data.frame())
        }
        res_df <- enrich_obj@result
        if (nrow(res_df) == 0) return(data.frame())
        return(res_df)
        }
    
        kegg_enrichment_up_df <- get_enrich_df(kegg_enrichment_up)
        kegg_enrichment_down_df <- get_enrich_df(kegg_enrichment_down)
    
        #COPY_BREAK_POINT
    
        # Prepare GO enrichment
        gene_list_go_up <- up_regulated$GeneID
        gene_list_go_down <- down_regulated$GeneID
        background_genes <- res_updated$GeneID
    
        go_annotation <- res_updated[, c("GOs", "GeneID")] %>%
        separate_rows(GOs, sep = ",")
    
        go_enrichment_up <- enricher(
        gene = gene_list_go_up,
        TERM2GENE = go_annotation,
        pvalueCutoff = 0.05,
        pAdjustMethod = "BH",
        universe = background_genes
        ) %>% as.data.frame()
    
        go_enrichment_down <- enricher(
        gene = gene_list_go_down,
        TERM2GENE = go_annotation,
        pvalueCutoff = 0.05,
        pAdjustMethod = "BH",
        universe = background_genes
        ) %>% as.data.frame()
    
        # Check if enrichment results are empty and print messages
        if (nrow(kegg_enrichment_up_df) == 0) {
        message("No KEGG enrichment results for UP genes in file: ", file_name)
        } else {
        message("KEGG enrichment UP results (head) for file: ", file_name)
        print(head(kegg_enrichment_up_df))
        }
    
        if (nrow(kegg_enrichment_down_df) == 0) {
        message("No KEGG enrichment results for DOWN genes in file: ", file_name)
        } else {
        message("KEGG enrichment DOWN results (head) for file: ", file_name)
        print(head(kegg_enrichment_down_df))
        }
    
        if (nrow(go_enrichment_up) == 0) {
        message("No GO enrichment results for UP genes in file: ", file_name)
        } else {
            # Create a lookup table: GOID -> Term
            go_terms_df_up <- AnnotationDbi::select(GO.db,
                                                keys = go_enrichment_up$ID,
                                                columns = c("TERM"),
                                                keytype = "GOID")
    
            # Join back the term descriptions to your enrichment results
            go_enrichment_up <- go_enrichment_up %>%
            left_join(go_terms_df_up, by = c("ID" = "GOID")) %>%
            # Replace Description column with TERM from GO.db
            mutate(Description = TERM) %>%
            select(-TERM)
        message("GO enrichment UP results for file (head): ", file_name)
        print(head(go_enrichment_up))
        }
    
        if (nrow(go_enrichment_down) == 0) {
        message("No GO enrichment results for DOWN genes in file: ", file_name)
        } else {
            # Create a lookup table: GOID -> Term
            go_terms_df_down <- AnnotationDbi::select(GO.db,
                                                keys = go_enrichment_down$ID,
                                                columns = c("TERM"),
                                                keytype = "GOID")
    
            # Join back the term descriptions to your enrichment results
            go_enrichment_down <- go_enrichment_down %>%
            left_join(go_terms_df_down, by = c("ID" = "GOID")) %>%
            # Replace Description column with TERM from GO.db
            mutate(Description = TERM) %>%
            select(-TERM)
    
        message("GO enrichment DOWN results for file (head): ", file_name)
        print(head(go_enrichment_down))
        }
    
        # Save results to workbook
        wb <- createWorkbook()
    
        addWorksheet(wb, "Complete_Data")
        writeData(wb, "Complete_Data", res_updated)
    
        addWorksheet(wb, "Up_Regulated")
        writeData(wb, "Up_Regulated", up_regulated)
    
        addWorksheet(wb, "Down_Regulated")
        writeData(wb, "Down_Regulated", down_regulated)
    
        addWorksheet(wb, "KEGG_Enrichment_Up")
        writeData(wb, "KEGG_Enrichment_Up", kegg_enrichment_up_df)
    
        addWorksheet(wb, "KEGG_Enrichment_Down")
        writeData(wb, "KEGG_Enrichment_Down", kegg_enrichment_down_df)
    
        addWorksheet(wb, "GO_Enrichment_Up")
        writeData(wb, "GO_Enrichment_Up", go_enrichment_up)
    
        addWorksheet(wb, "GO_Enrichment_Down")
        writeData(wb, "GO_Enrichment_Down", go_enrichment_down)
    
        output_file <- paste0("DEG_KEGG_GO_", gsub("-all.csv", "", file_name), ".xlsx")
        saveWorkbook(wb, output_file, overwrite = TRUE)
    
        message("Finished processing: ", file_name, "\n\n")
        #}

病毒与癌症——挑战、突破与未来方向

人类和动物的多种癌症与病毒感染密切相关,约占全球癌症负担的 15% 以上。 这些病毒通过劫持细胞的分子机制促进肿瘤发生,研究它们不仅有助于早期检测和诊断,还能推动新型疗法与疫苗的研发。

重要病毒与相关癌症:

  • 人乳头瘤病毒(HPV):与宫颈癌、部分口咽癌和肛门癌密切相关。
  • 乙型/丙型肝炎病毒(HBV/HCV):主要导致肝细胞癌(HCC)。即便 HCV 被直接抗病毒药物清除后,肝癌风险仍存在。
  • Epstein–Barr 病毒(EBV):可引发鼻咽癌、部分胃癌以及霍奇金淋巴瘤等;裂解复制被认为与遗传不稳定和癌前状态相关。
  • 人腺病毒(HAdV):某些型别(如 HAdV-A12)在实验模型中具致癌性,通过腺病毒癌蛋白扰乱细胞信号通路。
  • 溶瘤腺病毒(OAds):利用腺病毒改造用于直接杀伤肿瘤细胞,属于新兴治疗手段,而非天然致癌病毒。
  • 动物疱疹病毒:在动物中引发多种肿瘤,其机制为理解人类致癌性疱疹病毒提供借鉴。
  • 人 γ-疱疹病毒(EBV、卡波西肉瘤相关疱疹病毒 KSHV):分别与淋巴瘤及卡波西肉瘤有关,人源化小鼠模型正在推动疫苗和细胞治疗研发。
  • 考拉逆转录病毒(KoRV):在考拉中引发多种肿瘤,是研究外源性逆转录病毒向内源性转变及其致癌机制的独特模型。

总体来看,病毒致癌研究不仅揭示了癌症的分子基础,还推动了新型疫苗、精准诊断及靶向治疗的发展。持续的科研投入和国际合作有望进一步降低病毒相关癌症的全球负担。

裂解复制(lytic replication)是病毒生命周期的一种模式。

用简单的话说:

  • 病毒侵入宿主细胞后,会大量复制自己的基因和蛋白质。
  • 当病毒颗粒组装完成后,它会破坏(裂解)宿主细胞膜,释放新生成的病毒颗粒。
  • 这样宿主细胞就被杀死了,病毒可以继续感染其他细胞。

在致癌病毒研究里,比如 EBV(Epstein–Barr 病毒),裂解复制虽然不是持续感染的主要形式,但可能通过引发基因不稳定、炎症反应等增加癌变的风险。

A. baumannii HKAB-1 Point-by-point response to Reviewers

意见 1: 应对 HKAB-1 与基因组数据库中其他代表性 Acinetobacter baumannii 菌株进行比较基因组分析,以展示它们的进化关系。

回应 1: 感谢审稿人的宝贵建议。为此,我们进行了基于核心基因组的系统发育分析,将 HKAB-1 放置在 Acinetobacter 属的更广泛进化背景中。如图 3B 所示,HKAB-1 聚类于 A. baumannii 分支内,与已知临床菌株(如 ATCC19606、AYE 和 AB030)共享近期共同祖先。系统发育树还显示 A. baumannii 与其他 Acinetobacter 种(包括 A. pittii、A. junii 和 A. tandoii)明显分离,从而支持了 HKAB-1 的物种身份及其进化定位。图示及系统发育方法和结果的详细描述已纳入修订稿。

手稿修订位置(材料与方法):

“利用注释后的基因组组装文件(GFF3 格式)构建 HKAB-1 与代表性 Acinetobacter 菌株的核心基因组系统发育树。核心基因识别使用 Roary v3.13.0 [Page 2015],多序列比对采用 MAFFT v7.526 [Katoh 2013],系统发育推断使用 RAxML-NG v1.2.2 [Kozlov 2019] 在 GTR+G 模型下进行 1000 次自举分析。”

手稿修订位置(结果):

“进一步通过核心基因组分析结合公开可用的 Acinetobacter 基因组验证物种身份和系统发育关系。结果显示,HKAB-1 聚类于 A. baumannii 分支,与临床相关菌株 AB030 进化关系密切(图 3B)。”

图示:

“图 3B:HKAB-1 与代表性 Acinetobacter 菌株的核心基因组系统发育树。HKAB-1 聚类于 A. baumannii 分支,并与非 baumannii 种(如 A. pittii、A. junii 和 A. tandoii)明显分离。”

参考文献:

  • Page AJ 等. Roary: rapid large-scale prokaryote pan genome analysis. Bioinformatics 2015;31:3691–3693.
  • Katoh K, Standley DM. MAFFT multiple sequence alignment software version 7. Mol Biol Evol 2013;30:772–780.
  • Kozlov AM 等. RAxML-NG: a fast, scalable and user-friendly tool for maximum likelihood phylogenetic inference. Bioinformatics 2019;35:4453–4455.

意见 2: 如表 1 所示,HKAB-1 对头孢菌素、青霉素及其他一些抗生素表现出耐药性,将其定义为“药物敏感 Acinetobacter baumannii”是否合适?

回应 2: 感谢审稿人的提醒。然而,与 A. baumannii ATCC19606 相比,HKAB-1 对头孢菌素、青霉素及其他若干抗生素表现出更高的敏感性。具体 MIC 值如下:

头孢菌素:cefotaxime(8–16 μg/ml vs. 16 μg/ml)、ceftriaxone(32–64 μg/ml vs. 64–128 μg/ml)、cefuroxime(32–64 μg/ml vs. 128 μg/ml); 青霉素:amoxicillin(16 μg/ml vs. 256 μg/ml)、piperacillin(8–16 μg/ml vs. 32–64 μg/ml)。

此外,HKAB-1 仅对两种抗生素(利福平和氧氯青霉素)表现耐药,而 ATCC19606 对更多药物表现耐药。因此,我们仍认为 HKAB-1 是药物敏感菌株。

意见 3: 图 1 中,HKAB-1 生长速率高于标准菌株。可能机制是什么?应详细讨论。

回应 3: 感谢建议。为解释 HKAB-1 生长速率较快的原因,我们比较了 HKAB-1 与 ATCC19606 的功能基因组。重点分析代谢、营养物质摄取及细胞壁生物合成相关的 COG 功能类别(见图 S2),发现 HKAB-1 在这些关键类别中基因数量更多。此外,HKAB-1 的 adeB 表达显著下调(图 4A,ΔΔCT = -7.27 ± 0.21;折叠变化 = 0.0065),虽然 adeB 过表达未直接影响生长,但其下调可能减轻了与外排泵活性相关的能量负担。因此,我们推测 HKAB-1 的代谢潜力扩展和能量消耗型耐药机制下调共同促成了其加速生长。图示和详细分析已纳入修订稿。

手稿修订位置(结果):

“…尽管对所有测试抗生素高度敏感(图 1E、2E),HKAB-1 表现出更高的代谢能力,表现在 MH2B 和血清培养基中生长速率和生物量(OD600)更高(图 1A、1D)。COG 功能类别分析显示,HKAB-1 在能量产生与转换(C)、氨基酸代谢(E)、无机离子转运(P)、细胞壁生物合成(M)、碳水化合物代谢(G)等功能类别中基因更多(图 S2),提示其营养摄取、代谢通路和膜合成能力增强,减少生理瓶颈,提高生长效率。尤其是 adeB 外排泵显著下调,可能缓解代谢负担,促进生长。”

参考文献:

  • Yoon 等, mBio 2015;6:e00309-15.
  • Andersson DI, Hughes D. Nat Rev Microbiol 2010;8:260–271.

评论 4: 应该分析 HKAB-1 中与生物膜形成和群体运动相关的基因簇,并讨论其功能。

回复 4: 感谢审稿人的宝贵建议。我们同意审稿人观点,HKAB-1 中与生物膜形成和运动相关的基因簇值得进行详细分析。为此,我们使用 RT-qPCR 评估了 HKAB-1 中生物膜和运动相关基因的转录调控情况。与 ATCC19606 相比,HKAB-1 中 bap 和 T4P 基因(如编码假定菌毛的 pilA 和编码 IV 型菌毛生物合成蛋白的 pilO)显著上调(见图 4B)。此外,我们还比较了生物膜相关细胞与浮游培养物中的基因表达,观察到 bap、聚 N-乙酰葡萄糖胺 (PNAG) 合成基因以及 T4P 基因在生物膜条件下显著诱导。值得注意的是,RND 外排泵基因 adeB 和 adeG 在生物膜中也强烈诱导(图 4C)。总体而言,这些结果表明 HKAB-1 中增强的生物膜形成和运动表型可能由 bap、RND、PNAG 和 T4P 相关基因的协调上调 驱动。

我们还研究了编码 IV 型菌毛(T4P)的基因,T4P 在 A. baumannii 的生物膜发育和轻拍运动中发挥关键作用(Eijkelkamp 等, 2011;Ronish 等, 2019)。其中,编码主要菌毛亚单位的 pilA 与运动和生物膜表型调控相关(Ronish 等, 2019)。我们对 HKAB-1 的 PilA 与已知株 AB5075、BIDMC57、ACICU 和 ATCC19606 进行了序列比对,结果显示 HKAB-1 PilA 与参考株不同,提示其在调控 HKAB-1 运动和生物膜形成中可能具有菌株特异性功能。

此外,我们发现 ATCC19606 缺失 pilN 基因,该基因对 PilMNOP 内膜排列亚复合体中 PilNO 异二聚体的正确组装至关重要。pilN 的缺失可能削弱 IV 型菌毛生物合成及其相关运动功能(Leighton 等, 2015),这可能解释了 ATCC19606 生物膜形成和运动表型较弱的现象。

上述结果及详细描述已纳入修订后的手稿中。

结果:

手稿清稿第 xx 页,第 xx 行:

鉴于生物膜相关蛋白 Bap、Csu 菌毛、PNAG 合成和 T4P 在生物膜形成和轻拍运动中的作用(表 S2)[50 Loehfelm 2008, 51 Tomaras 2003, 52 Choi 2009, 53 Ronish 2019],我们检测了 HKAB-1 中相关基因的转录水平。ATCC19606 除 csuC 外表达较低(bap: ∆CT = -4.95 ± 0.32;csuC: ∆CT = -1.22 ± 0.32;pgaB: ∆CT = -7.58 ± 0.32;pilA: ∆CT = -10.04 ± 0.32;pilO: ∆CT = -8.17 ± 0.32)(图 4B)。csuC 和 pgaB 在两株之间无明显转录差异,但 HKAB-1 中 bap 和 T4P 特异基因 显著上调(bap: ΔΔCT = 3.03 ± 0.45;倍数变化 = 8.14;pilA: ΔΔCT = 5.54 ± 0.45;倍数变化 = 46.54;pilO: ΔΔCT = 2.42 ± 0.45;倍数变化 = 5.34)(图 4B),与其强生物膜形成和运动表型一致。

进一步比较生物膜相关细胞与浮游培养物中的基因表达。csuC 在两种条件下无明显差异(图 4C),而 pgaB 在浮游细胞低表达,但在生物膜中显著诱导(ΔΔCT = 5.55 ± 0.43;倍数变化 = 46.79),表明 PNAG 合成在生物膜形成中的关键作用(图 4C)。bap 和 T4P 特异基因(pilA 和 pilO)在生物膜相关细胞中进一步上调(bap: ΔΔCT = 2.06 ± 0.43;倍数变化 = 4.17;pilA: ΔΔCT = 2.73 ± 0.43;倍数变化 = 6.62;pilO: ΔΔCT = 3.77 ± 0.43;倍数变化 = 13.60)(图 4B、4C)。RND 外排泵基因 adeB 和 adeG 在浮游细胞中低表达,但在生物膜中显著上调(adeB: ΔΔCT = 7.88 ± 0.43;倍数变化 = 236.19;adeG: ΔΔCT = 7.54 ± 0.43;倍数变化 = 185.98),而 adeJ 无变化(图 4C)。此外,与生物膜形成相关的铁载体基因 basA(acinetobactin)和 bfnL(fimsbactin)也在生物膜中显著诱导(图 4C),提示其在生物膜发育中的作用。

综合来看,HKAB-1 中 bap 和 T4P 基因上调,以及在生物膜条件下进一步诱导,同时伴随 PNAG、RND 外排泵和铁载体系统的激活,提示这些因子共同驱动 HKAB-1 的强生物膜表型。

见图 4B、4C 获取更多信息。

讨论:

手稿清稿第 xx 页,第 xx 行:

“T4P 是 A. baumannii 的关键毒力因子,介导宿主细胞粘附、生物膜形成和轻拍运动(53 Ronish 2019)。PilN 和 PilO 是 PilMNOP 内膜排列亚复合体的高度保守组分,PilNO 异二聚体的正确形成对 T4P 生物合成至关重要(64 Leighton 2015)。比较基因组分析显示 ATCC19606 中 pilN 基因破损(表 S3),可能导致菌毛组装受损,从而影响其运动和生物膜形成。相比之下,HKAB-1 的所有 T4P 基因(包括 pilN)均完整(表 S3),与其保持轻拍运动和强生物膜表型一致。先前研究表明,编码主要菌毛亚单位的 pilA 变异可影响菌毛表面电性并调节相关功能(44 Eijkelkamp 2011, 53 Ronish 2019)。19 株 A. baumannii PilA 序列的系统发育分析显示,HKAB-1 PilA 形成独特分支,与 ACICU、NIPH-329、Ab44444 和 OIFC137 更接近,而与 AB5075、BIDMC57 或 ATCC19606 差异较大(图 S3A)。值得注意的是,尽管与 ACICU 聚类,HKAB-1 PilA 缺少末端丝氨酸残基,属于非糖基化亚组(图 S3)。这些结果提示 HKAB-1 PilA 在调控运动和生物膜形成中可能具有菌株特异性作用。此外,HKAB-1 中 pilA 和 pilO 表达升高,支持其增强的轻拍运动和生物膜表型(图 1E、2、4C)。”

见图 S3 获取更多信息。

手稿清稿第 xx 页,第 xx 行:

“此外,HKAB-1 编码生物膜相关蛋白 bap,这对 A. baumannii 的生物膜发育至关重要 [50 Loehfelm 2008],ATCC19606 也存在该基因。HKAB-1 中 bap 和 T4P 基因(如 pilA 和 pilO)表达显著升高,并在生物膜条件下进一步诱导,同时伴随 PNAG 合成上调(图 4B、4C),可能是其增强生物膜形成能力的分子基础。有趣的是,AdeB 和 AdeG RND 外排泵在浮游培养中低表达,但在生物膜条件下高度响应,提示其在生物膜成熟或维持中的作用(67 Richmond 2016)。由 Bap 和 RND 外排系统介导的生物膜形成是 A. baumannii 在宿主及环境中持续存活的重要毒力机制 [41 Lee 2008, 68 He 2015, 67 Richmond 2016]。”

评论 5: 应通过溶血实验、蛋白酶实验,甚至小鼠模型评估 HKAB-1 的毒力。

回复 5: 感谢非常好的建议。我们已完成附加实验并纳入修订稿,结果显示 HKAB-1 不具有溶血和蛋白酶活性。然而,30 天修订期限内无法进行小鼠体内毒力实验。

手稿清稿第 xx 页,第 xx 行:

溶血和蛋白酶实验 溶血实验在补充 5% 脱纤马血的 Columbia 血琼脂平板上进行(24 Tuttobene 2021)。简言之,将 OD600 调至 2.5 的过夜培养物 10 μL 接种于血琼脂平板,在 37°C 培养 48 小时。蛋白酶实验在脱脂奶琼脂平板上进行,于 37°C 培养 24 小时。

手稿清稿第 xx 页,第 xx 行:

“从患者痰液中分离出 HKAB-1 菌株,并在补充 5% 脱纤马血的 Columbia 血琼脂平板上培养。血琼脂平板上未观察到溶血或蛋白酶活性(图 S1)。”


评论 1:引言部分缺乏对研究假设的明确陈述。尽管摘要中简要概述了假设,并在讨论部分进行了讨论,但引言中未明确或正式提出。建议在引言末尾添加一句,如“本研究旨在……”以明确定义研究目标。

回应 1:感谢审稿人提出的深刻建议。我们同意在引言部分应明确陈述研究假设。 我们在修订稿中加入了以下段落: 修订稿干净版本,第 xx 页,第 xx 行: “在本研究中,我们表征了一株临床分离的鲍曼不动杆菌(A. baumannii)菌株 HKAB-1,该菌株显示出加速的生长动力学和显著的毒力相关表型,如增强的生物膜形成、运动性、干燥耐受性和血清抗性,尽管其对多种抗生素广泛敏感。全基因组测序表明 HKAB-1 属于序列类型 ST392,并揭示了多种潜在毒力因子的存在,包括 hemO 基因簇和血红素利用簇 1。比较基因组分析显示,涉及营养运输、代谢途径和膜生物合成的基因差异可能导致 HKAB-1 的生长增强。值得注意的是,HKAB-1 中 adeB 的表达显著受抑,这可能解释了其尽管携带多种抗性决定因素仍表现为药物敏感的表型。此外,在生物膜条件下,编码生物膜相关蛋白 Bap、聚-N-乙酰葡糖胺(PNAG)生物合成基因和 T4P 组分的基因被高度诱导,支持它们在 HKAB-1 强大生物膜表型中的作用。这些发现表明抗生素抗性和毒力之间可能存在进化权衡,强调需要重新评估抗生素敏感的鲍曼不动杆菌在感染控制和抗性监测中的临床意义。需要进一步研究以阐明这种表型平衡的分子机制。”

评论 2:抗生素抗性和毒力之间可能存在权衡的假设非常有趣且相关。然而,这一结论应更谨慎地表述,因为稿件未提供直接的分子证据支持该假设。尽管表型实验(如增强的生物膜形成、运动性和干燥耐受性)得到了充分记录,基因组分析也揭示了抗性和毒力基因的存在,但研究未包括基因表达或调控机制的功能验证(如 RNA 表达分析或蛋白质组学)。因此,我建议修改相关陈述,反映这种权衡是一种假设或观察,而不是已确认的机制联系。例如,可以写:“我们的发现提示可能存在权衡……”或“观察到的表型可能表明……”,并承认需要进一步研究以探索这种关系的分子基础。

回应 2:感谢审稿人的深刻评论。我们同意当前结果不足以确凿支持抗生素抗性和毒力之间可能存在权衡的假设。为加强研究,我们进行了额外实验以进一步评估 HKAB-1 的基因型特征与表型特征之间的关系(参见对评论 3 的回应)。尽管如此,我们已修订讨论部分,以更谨慎地解释我们的发现,并强调需要进一步研究。

简要总结: 修订稿干净版本,第 xx 页,第 xx 行: “这些发现反映了某些鲍曼不动杆菌菌株可能存在的进化权衡,倾向于毒力相关特征而非抗菌抗性机制的表达。这一结果强调需要持续进行基因组监测,以监测像 HKAB-1 这样具有高毒力但药物敏感的菌株的出现,这些菌株可能在选择压力下成为抗性发展的储备库。” 摘要: 修订稿干净版本,第 xx 页,第 xx 行: “这些发现提示抗生素抗性和毒力之间可能存在权衡,强调监测抗生素敏感但高毒力的鲍曼不动杆菌分离株的重要性,这些菌株可能作为抗性进化的潜在储备库。需要进一步研究以阐明这种表型平衡的机制。” 引言: 修订稿干净版本,第 xx 页,第 xx 行: “这些发现提示抗生素抗性和毒力之间可能存在进化权衡,强调需要重新评估抗生素敏感的鲍曼不动杆菌在感染控制和抗性监测中的临床意义。需要进一步研究以阐明这种表型平衡的分子机制。” 讨论: 修订稿干净版本,第 xx 页,第 xx 行: “总的来说,这些发现可能支持一种模型,即抗菌抗性的降低被增强的毒力特性和环境适应性所抵消。这种权衡的分子机制尚不清楚,需要进一步研究。”

评论 3:基因型并不总是直接转化为表型。整篇稿件中,某些基因(如 adeB)的存在常被解释为活跃抗性或毒力机制的证据。然而,若无功能验证,如基因表达或蛋白活性实验,这种解释可能过于夸大。我建议采用更细致的措辞,例如使用“潜在活性”或“推测功能性”等术语,以反映仅基因存在并不确认其功能表达或对表型的贡献。

回应 3:感谢审稿人提出的非常好的建议。我们同意基因型并不总是直接转化为表型。为解决这一问题,我们进行了额外实验以验证 HKAB-1 的基因型特征与表型特征之间的关系。RT-qPCR 分析显示,HKAB-1 和 ATCC19606 之间 adeG 和 adeJ 的表达无显著差异,而 HKAB-1 和 ATCC19606 中 adeB 的表达显著下调(参见图 4A),提示 AdeB 外排泵的差异表达(鲍曼不动杆菌抗生素抗性的主要贡献者)可能解释了 HKAB-1 增加的敏感性。虽然本研究未评估其他抗性决定因素(如 β-内酰胺酶或 MFS、MATE、SMR、ABC 或 PACE 的外排系统),但我们的发现表明 AdeB 是 HKAB-1 增加敏感性的主要因素。 IV 型菌毛(T4P)是鲍曼不动杆菌的重要毒力因子,涉及宿主细胞粘附、生物膜形成和抽搐运动性(Ronish 2019)。为研究菌株间 T4P 相关基因表达的潜在差异,我们比较了 HKAB-1 和 ATCC19606。差异表达分析显示,HKAB-1 相对于 ATCC19606 中与生物膜形成和抽搐运动性相关的基因 bap、pilA 和 pilO 显著上调(参见图 4B),这可能导致其增强的生物膜形成和抽搐运动性。此外,ATCC19606 中缺乏功能性 pilN 基因可能破坏 IV 型菌毛的组装,导致其运动性和生物膜形成能力受损。相比之下,HKAB-1 中所有 IV 型菌毛(T4P)基因,包括 pilN,均完整(参见表 S3),与其观察到的抽搐运动性和强大生物膜表型一致。此外,我们还比较了生物膜相关细胞和浮游培养物之间的基因表达,观察到在生物膜条件下,bap、聚-N-乙酰葡糖胺(PNAG)生物合成基因和 T4P 基因显著诱导。值得注意的是,adeB 和 adeG RND 外排泵基因在生物膜中也强烈诱导(图 4C)。总的来说,这些结果表明,增强的生物膜形成和运动性表型可能由 bap、RND、PNAG 和 T4P 相关基因的协同上调驱动。 相反,与毒力相关的铁获取系统(包括血红素利用和铁载体生物合成途径)的基因表达分析显示,这些系统在血清暴露下的转录诱导增加(参见图 4D)。这一观察表明,这些系统在 HKAB-1 在铁限制、模拟宿主环境的血清中存活的能力中起关键作用。值得注意的是,虽然 ATCC19606 具有铁载体生物合成基因,但缺乏 HKAB-1 中存在的 hemO 簇和血红素利用簇 1。鉴于血清富含血红素结合铁但几乎不含游离铁(Parrow 2013),这种基因缺陷可能解释了 ATCC19606 相对于 HKAB-1 在血清中的存活能力降低。 这些在 HKAB-1 中观察到的增强表型特征可能与毒力相关基因的上调表达相关。为支持这一观点,我们进行了以下实验并将其纳入稿件:

材料与方法: 修订稿干净版本,第 xx 页,第 xx 行:

RNA 提取

为评估毒力相关和 RND 外排泵基因的表达,鲍曼不动杆菌菌株过夜培养物被稀释至初始 OD600 为 0.05,置于 25 mL LB 培养基中,于 37°C、180 rpm 振荡培养至 OD600 达 0.5–0.7。取 500 μL 培养物,使用 RNAstore Reagent(天根生物,中国)稳定。为评估与血清耐受性相关的基因表达,在含血清培养基和 MH2B(作为对照)中生长的鲍曼不动杆菌细胞于 OD600 达 0.5–0.7 时收获。每种培养物取 500 μL,使用 RNAstore Reagent 稳定。总 RNA 使用 RNAprep Pure Bacteria Kit(天根生物,中国)提取。为测定生物膜相关基因的表达,生物膜使用 RNAprotect Bacteria Reagent(Qiagen,德国)重悬浮。RNA 提取使用 RNeasy Mini Kit(Qiagen,德国)进行。RNA 浓度和纯度使用 Nanodrop 分光光度计测定。

反转录 qPCR

反转录使用 FastKing gDNA Dispelling RT SuperMix II(天根生物,中国)进行,以 500 ng 总 RNA 为模板。所得 cDNA 的浓度和纯度使用 Nanodrop 分光光度计评估。定量 PCR(qPCR)在 Applied Biosystems StepOne 热循环仪上使用 2× Universal SYBR Green Fast qPCR Mix(AbClonal Technology,美国)进行,每反应使用 400 ng 总 cDNA。引物序列列于表 S1,以 rpoB 作为参考基因。基因表达分析按之前描述的方法进行 [25 Foong 2025]。ΔCT 值计算为 CT(rpoB) – CT(目标基因)。处理组与对照组之间的平均 ΔCT 值差异使用 R 4.4.1 版 [19 R Core Team 2021] 实现的方差分析(ANOVA)模型进行分析,包含基因和基因:处理交互项。Tukey 的诚实显著差异(HSD)检验用于确定组间基因表达的统计显著差异。

结果: 修订稿干净版本,第 xx 页,第 xx 行:

“外排泵和毒力相关基因的相对表达

为研究外排泵和毒力相关基因在抗生素抗性和致病性中的功能相关性,我们在相关表型条件下使用 RT-qPCR 量化了这些基因的表达水平。在 LB 培养基中,HKAB-1(adeG: ∆CT = -9.45 ± 0.15; adeJ: ∆CT = -1.97 ± 0.15)和 ATCC19606(adeG: ∆CT = -9.42 ± 0.15; adeJ: ∆CT = -1.49 ± 0.15)之间 adeG 和 adeJ 的转录无显著差异(图 4A)。相反,HKAB-1 中 adeB 显著下调(ΔΔCT = -7.27 ± 0.21; 折叠变化 = 0.0065),这可能导致其尽管携带多种抗性基因仍表现为抗生素敏感表型。 鉴于生物膜相关蛋白 Bap、Csu 菌毛、聚-N-乙酰葡糖胺(PNAG)生物合成和 IV 型菌毛(T4P)在生物膜形成和抽搐运动性中的作用(表 S2)[50 Loehfelm 2008, 51 Tomaras 2003, 52 Choi 2009, 53 Ronish 2019],我们检查了 HKAB-1 中这些基因的转录特征。ATCC19606 除 csuC 外,表现出相对较低的表达(bap: ∆CT = -4.95 ± 0.32; csuC: ∆CT = -1.22 ± 0.32; pgaB: ∆CT = -7.58 ± 0.32; pilA: ∆CT = -10.04 ± 0.32; pilO: ∆CT = -8.17 ± 0.32)(图 4B)。编码 Csu 菌毛组装伴侣蛋白的 csuC 和编码 PNAG 生物合成脱乙酰酶的 pgaB 在两株菌之间无显著转录差异。然而,HKAB-1 中 bap 和 T4P 特异性基因(包括编码假定菌毛蛋白的 pilA 和编码 T4P 生物合成蛋白的 pilO)显著上调(bap: ΔΔCT = 3.03 ± 0.45; 折叠变化 = 8.14; pilA: ΔΔCT = 5.54 ± 0.45; 折叠变化 = 46.54; pilO: ΔΔCT = 2.42 ± 0.45; 折叠变化 = 5.34)(图 4B),与其强大的生物膜和运动性表型一致。 为进一步评估生物膜相关基因在生物膜发育中的功能作用,我们比较了生物膜相关细胞和浮游培养物之间的表达。一致于我们早先的结果(图 4B),csuC 在两种条件下无显著转录差异(图 4C)。出乎意料的是,在浮游细胞中表达水平较低的 pgaB 在生物膜细胞中强烈诱导(ΔΔCT = 5.55 ± 0.43; 折叠变化 = 46.79),支持 PNAG 生物合成在生物膜形成中的关键作用(图 4C)。正如预期,bap 和 T4P 特异性基因(pilA 和 pilO)在生物膜相关细胞中相对于浮游细胞进一步上调(bap: ΔΔCT = 2.06 ± 0.43; 折叠变化 = 4.17; pilA: ΔΔCT = 2.73 ± 0.43; 折叠变化 = 6.62; pilO: ΔΔCT = 3.77 ± 0.43; 折叠变化 = 13.60)(图 4B, 4C)。有趣的是,在浮游 HKAB-1 中表达水平较低的 RND 外排泵基因 adeB 和 adeG 在生物膜相关细胞中显著诱导(adeB: ΔΔCT = 7.88 ± 0.43; 折叠变化 = 236.19; adeG: ΔΔCT = 7.54 ± 0.43; 折叠变化 = 185.98),而 adeJ 表达未变(图 4C)。鉴于先前报道将铁载体生物合成与生物膜发育联系起来(54 Wang, 2025),我们还检查了铁载体相关基因,发现 basA(acinetobactin 簇)和 bfnL(fimsbactin 簇)在生物膜细胞中强烈诱导(图 4C),表明其在生物膜发育中的贡献作用。总的来说,HKAB-1 相对于 ATCC19606 中 bap 和 T4P 基因的显著上调,结合其在生物膜条件下的进一步诱导以及 PNAG、RND 外排泵和铁载体系统的同步激活,提示了一个驱动 HKAB-1 强大生物膜表型的协同因子网络。 血红素利用簇在血清条件下对细菌存活至关重要 [54 de Léséleuc 2014]。鉴于 HKAB-1 携带血红素利用基因,而 ATCC19606 缺乏这些基因,我们通过分析涉及血红素摄取和铁载体生物合成的基因表达,评估了铁获取系统对血清暴露的调控反应。在 MH2B 标准生长条件下,血红素获取基因(包括编码假定血红素氧化酶的 hemO 和血红素利用簇 1 中预测的 TonB 依赖性受体的 ACP71R_07005)以及铁载体生物合成基因(如 basA(acinetobactin 簇)和 bfnL(fimsbactin 簇))的表达相对较低(图 4D)。在血清暴露下,所有四个基因显著激活(hemO: ∆∆CT = 9.13 ± 0.42; 折叠变化 = 558.50; ACP71R_07005: ∆∆CT = 1.89 ± 0.42; 折叠变化 = 3.71; bfnL: ∆∆CT = 6.05 ± 0.42; 折叠变化 = 66.29; basA: ∆∆CT = 4.32 ± 0.42; 折叠变化 = 19.96)(图 4D),提示铁获取途径在模拟宿主条件下强烈诱导。”

讨论:

修订稿干净版本,第 xx 页,第 xx 行: “HKAB-1 的高抗生素敏感表型……与此观察一致,HKAB-1 的基因组分析显示存在多种抗生素抗性基因,包括编码临床上重要的 RND 外排泵的基因,这些是鲍曼不动杆菌中多重耐药表型的关键贡献者 [55 Nowak 2015]。有趣的是,HKAB-1 中 adeB 的转录水平较低(∆CT = -10.11 ± 0.15),相比之下,ATCC19606 为(∆CT = -2.85 ± 0.15),HKAB-1 和 ATCC19606 之间的比较基因分析显示 HKAB-1 中 adeB 下调(ΔΔCT = -7.27 ± 0.21; 折叠变化 = 0.0065)。相比之下,在标准生长培养基中,adeG 和 adeJ 的表达水平无显著差异。这些发现提示,adeB 表达的减少可能是 HKAB-1 增加敏感性的原因,因为该外排泵在临床鲍曼不动杆菌分离株的多重耐药性中至关重要(8 Rumbo 2013, 58 Marchand 2004)。此外,其他抗性机制(如 β-内酰胺酶或非 RND 外排系统)的活性降低或下调也可能导致观察到的抗生素敏感表型。总的来说,这些发现表明,尽管 HKAB-1 目前保持抗生素敏感,但其具有在适当选择压力下表达和激活抗性特征的遗传潜力,需要在临床环境中对这类菌株进行仔细监测。” 修订稿干净版本,第 xx 页,第 xx 行: “进一步的基因组分析显示,HKAB-1 携带 hemO 基因簇……与这些发现一致,我们观察到血清暴露下 hemO 和 ACP71R_07005(分别编码血红素氧化酶和假定的 TonB 依赖性受体)显著上调。此外,在这些条件下,涉及铁载体 acinetobactin(basA)和 fimsbactin(bfnL)生物合成的基因也显著上调。这些结果表明,血红素利用和铁载体介导的铁获取对血清中的细菌适应性至关重要。我们认为,hemO 簇、血红素利用簇 1 和多种铁载体系统的共同存在有助于 HKAB-1 在血清中的优越存活,血清中游离铁有限但富含血红素结合铁 [62 Parrow 2013]。虽然已显示 ATCC19606 能利用血红素,但早期研究使用了高于血清中发现的血红素浓度 [63 Zimbler 2009],这可能解释了其在这些条件下的生长减少。”

修订稿干净版本,第 xx 页,第 xx 行: “T4P 是鲍曼不动杆菌的关键毒力因子,介导宿主细胞粘附、生物膜形成和抽搐运动性(53 Ronish 2019)。PilN 和 PilO 是 PilMNOP 内膜对齐亚复合体的保守组分,PilNO 的适当异二聚化对 T4P 生物合成至关重要(64 Leighton 2015)。比较基因组分析显示,ATCC19606 菌株携带一个受损的 pilN 基因(表 S3)。缺乏功能性 pilN 可能损害菌毛组装,导致其运动性和生物膜形成的缺陷。相比之下,HKAB-1 中所有 T4P 基因,包括 pilN,均完整(表 S3),与其保留的抽搐运动性和强大生物膜表型一致。此外,先前研究表明,编码主要菌毛亚单位的 pilA 的变异可影响菌毛表面静电特性,并调节鲍曼不动杆菌中菌毛相关功能(44 Eijkelkamp 2011, 53 Ronish 2019)。Acinetobacter 中的 PilA 变体分为糖基化形式(具有 C 端丝氨酸残基作为糖基化位点)和非糖基化形式(缺乏该残基)(图 S3B)。PilA 的糖基化由 T4P 特异性 O-寡糖基转移酶 tfpO 介导,位于 pilA 下游(65 Harding 2015)。虽然 PilA 糖基化的功能影响尚不确定,但菌株特异性变体与不同表型相关(66 Piepenbrink 2016)。例如,AB5075 变体与抽搐运动性相关,而 ACICU 变体促进生物膜形成(53 Ronish 2019)。19 株鲍曼不动杆菌菌株的 PilA 序列系统发育分析显示,HKAB-1 PilA 形成一个独特的分支,与 ACICU、NIPH-329、Ab44444 和 OIFC137 的变体更接近,而与 AB5075、BIDMC57 或 ATCC19606 分离(图 S3A)。值得注意的是,尽管与 ACICU 分支,HKAB-1 PilA 缺乏末端丝氨酸残基,属于非糖基化亚组(图 S3)。这些发现提示 HKAB-1 PilA 在调节运动性和生物膜形成中可能具有菌株特异性作用。此外,HKAB-1 中 pilA 和 pilO 的高表达支持该菌株观察到的增强抽搐运动性和生物膜表型(图 1E, 2, 4C)。”

修订稿干净版本,第 xx 页,第 xx 行: “此外,HKAB-1 编码 bap,一个对鲍曼不动杆菌生物膜发育至关重要的生物膜相关蛋白 [50 Loehfelm 2008],该蛋白也在 ATCC19606 中存在。HKAB-1 中 bap 和 T4P 基因(如 pilA 和 pilO)的显著高表达,结合其在生物膜条件下的进一步诱导以及 PNAG 生物合成的上调(图 4B, 4C),可能是其增强生物膜形成能力的分子基础。有趣的是,在浮游培养物中表达水平较低的 AdeB 和 AdeG RND 外排泵在生物膜条件下高度响应,提示其在生物膜成熟或维持中的作用(67 Richmond 2016)。生物膜形成,部分由 Bap 和 RND 外排系统介导,是鲍曼不动杆菌在恶劣宿主和环境条件下持续存在的重要毒力机制 [41 Lee 2008, 68 He 2015, 67 Richmond 2016]……”

结论性评论 (Concluding remarks):

修订稿干净版本,第 xx 页,第 xx 行: “尽管鲍曼不动杆菌 HKAB-1 携带多种抗菌抗性基因,包括临床上相关的假定 β-内酰胺酶以及多种 RND 和 MFS 外排泵,但该菌株对所有测试抗生素保持敏感……具体来说,HKAB-1 携带血红素利用簇和多种生物膜相关基因,使其在血清中的存活能力和生物膜形成能力相较于 ATCC19606 增强。”

参考文献

  • Ronish 等. The structure of PilA from Acinetobacter baumannii AB5075 suggests a mechanism for functional specialization in Acinetobacter type IV pili. J. Biol. Chem. 2019 294, 218–230.

  • Parrow 等. Sequestration and scavenging of iron in infection. Infect. Immun. 2013 81, 3503–3514.

  • Foong 等. Molecular determinants of substrate specificity in the efflux pump CraA from Acinetobacter baumannii. Microbiol. Spectr. 2025 13, e0111925.

  • R Core Team. R: A language and environment for statistical computing. R Foundation for Statistical Computing, Vienna, Austria 2021. https://www.R-project.org/

  • Loehfelm 等. Identification and characterization of an Acinetobacter baumannii biofilm-associated protein. J. Bacteriol. 2008 190, 1036–1044.

  • Tomaras 等. Attachment to and biofilm formation on abiotic surfaces by Acinetobacter baumannii: involvement of a novel chaperone-usher pili assembly system. Microbiol. 2003 149, 3473–3484.

  • Choi 等. The pgaABCD locus of Acinetobacter baumannii encodes the production of poly-β-1-6-N-acetylglucosamine, which is critical for biofilm formation. J. Bacteriol. 2009 191, 5953–5963.

  • de Léséleuc 等. Serum resistance, gallium nitrate tolerance and extrapulmonary dissemination are linked to heme consumption in a bacteremic strain of Acinetobacter baumannii. Int. J. Med. Microbiol. 2014 304, 360–369.

  • Nowak 等. Prevalence of eight resistance-nodulation-division efflux pump genes in epidemiologically characterized Acinetobacter baumannii of worldwide origin. J. Med. Microbiol. 2015 64, 630–635.

  • Rumbo 等. Contribution of efflux pumps, porins, and β-lactamases to multidrug resistance in clinical isolates of Acinetobacter baumannii. Antimicrob. Agents Chemother. 2013 57, 5247–5257.

  • Marchand 等. Expression of the RND-type efflux pump AdeABC in Acinetobacter baumannii is regulated by the AdeRS two-component system. Antimicrob. Agents Chemother. 2004 48, 3298–3304.

  • Zimbler 等. Iron acquisition functions expressed by the human pathogen Acinetobacter baumannii. Biometals 2009 22, 23-32.

  • Leighton 等. Novel role for PilNO in type IV pilus retraction revealed by alignment subcomplex mutations. J. Bacteriol. 2015 197, 2229–2238.

  • Eijkelkamp 等. Adherence and motility characteristics of clinical Acinetobacter baumannii isolates. FEMS Microbiol. Lett. 2011 323, 44–51.

  • Harding 等. Acinetobacter strains carry two functional oligosaccharyltransferases, one devoted exclusively to type IV pilin, and the other one dedicated to O-glycosylation of multiple proteins. Mol. Microbiol. 2015 96, 1023–1041.

  • Piepenbrink 等. Structural diversity in the type IV pili of multidrug-resistant Acinetobacter. J. Biol. Chem. 2016 291, 22924–22935.

  • Lee 等. Capacity of multidrug-resistant clinical isolates of Acinetobacter baumannii to form biofilm and adhere to epithelial cell surfaces. Clin. Microbiol. Infect. 2008 14, 49–54.

  • Richmond 等. The Acinetobacter baumannii two-component system AdeRS regulates genes required for multidrug efflux, biofilm formation, and virulence in a strain-specific manner. mBio 2016 7, e00430-16.

  • He 等. Biofilm formation caused by clinical Acinetobacter baumannii isolates is associated with overexpression of the AdeFGH efflux pump. Antimicrob. Agents Chemother. 2015 59, 4817–4825.

评论 4:稿件的主要局限之一是完全缺乏关于患者的临床数据,除提到左侧心力衰竭外。这削弱了感染的临床背景,降低了研究发现的转化价值。尽管研究是回顾性的,但如果作者能纳入即使是简短的关于感染过程、住院时间、临床管理和治疗结果的信息,将大大增强工作的相关性和影响力。如果这些数据可用,我强烈建议作者将其纳入当前稿件。

回应 4:感谢审稿人的深刻建议。我们在修订稿中加入了以下段落:

修订稿干净版本,第 xx 页,第 xx 行: “一名患有左侧心力衰竭并伴有细菌性呼吸道感染临床症状的患者入院。从患者痰液中分离出细菌分离株,命名为 HKAB-1,在补充 5% 去纤维蛋白马血的哥伦比亚血琼脂平板上培养后获得。琼脂平板上未观察到溶血活性(图 S1)。根据初步表型特征,该分离株被初步鉴定为鲍曼不动杆菌。患者具有多种高危因素,包括高龄、严重心功能障碍和多器官功能障碍。根据医院治疗方案,启动了为期七天的哌拉西林-他唑巴坦作为经验性抗菌治疗。完成抗生素疗程后,患者的呼吸道症状显著改善。住院第九天,心脏检查显示心音正常,所有瓣膜区域无病理性杂音,肺部听诊发现双肺少量干啰音。鉴于临床改善,患者被认为适合出院。”

评论 5:研究缺乏 RNA-seq 或 RT-qPCR 数据,这本可以支持关于毒力和抗性基因(如 ade、bap、hemO)表达的结论。包含此类功能数据将加强基因型与表型之间的联系。我建议在讨论部分添加简短评论,说明这一局限性。

回应 5:我们感谢审稿人的宝贵建议。如对评论 3 的回应中所述,我们已进行 RT-qPCR 实验以研究基因型与表型之间的关系。


高毒力 指 什么?高毒力(high virulence)是指病原体(如细菌、病毒等)引起严重疾病或感染的能力较强,能够更有效地侵入宿主、繁殖、逃避宿主免疫系统并导致显著的组织损伤或疾病症状。在医学和微生物学中,毒力(virulence)是衡量病原体致病能力的一个指标,高毒力通常表现为以下特征:

  • 高效侵入宿主:高毒力病原体能迅速突破宿主的物理屏障(如皮肤、黏膜)或免疫防御,进入宿主组织或细胞。
  • 快速繁殖:在宿主体内快速增殖,导致感染迅速扩散。
  • 毒性因子:产生多种毒力因子,如毒素、酶(如溶血素、蛋白酶)或其他促进感染的分子(如生物膜形成相关蛋白、菌毛等),增强其致病能力。
  • 免疫逃避:能够有效规避宿主免疫系统的清除,例如通过抑制免疫反应、改变表面抗原或形成生物膜来保护自身。
  • 组织破坏:引起严重的组织损伤或全身性炎症反应,可能导致危及生命的症状,如败血症或器官衰竭。

在上下文中,提到鲍曼不动杆菌(A. baumannii)菌株 HKAB-1 具有高毒力,具体表现为增强的生物膜形成、运动性、干燥耐受性和血清抗性。这些特性使其在宿主环境中(如血清中)存活能力更强,生物膜形成能力增强有助于其在医疗设备或组织表面定植,增加感染的持久性和治疗难度。 简单来说,高毒力意味着病原体更“凶猛”,能更有效地引发严重感染,尤其在免疫力较弱的患者中可能导致更严重的临床后果。


改变表面抗原可以帮助病原体实现免疫逃避的原因在于,宿主免疫系统主要通过识别病原体表面的特定抗原来启动防御反应。表面抗原是病原体(如细菌、病毒)外膜或外壳上的分子(如蛋白质、糖类),它们是免疫系统(尤其是抗体和T细胞)识别和攻击的目标。当病原体改变其表面抗原时,免疫系统可能无法有效识别它,从而使病原体能够逃避免疫清除。以下是具体机制的解释:

  • 免疫系统的识别机制

宿主免疫系统通过抗体、B细胞和T细胞识别病原体表面的抗原。抗体通常针对特定抗原的独特结构(抗原决定簇)结合,而T细胞通过识别抗原呈递细胞(APC)上的抗原片段来启动反应。 一旦免疫系统识别到特定抗原,就会产生针对该抗原的记忆细胞,以便在未来快速应对相同的病原体。

  • 改变表面抗原的作用

抗原变异(Antigenic Variation):病原体通过基因突变或基因重组改变其表面抗原的结构。例如,病毒(如流感病毒)通过“抗原漂移”或“抗原转换”改变其表面蛋白(如血凝素或神经氨酸酶),使之前产生的抗体无法有效结合。 免疫识别失效:当表面抗原发生变化后,宿主已有的抗体或记忆细胞可能无法识别新的抗原变体,导致免疫系统需要重新识别并产生新的抗体,这一过程需要时间,使病原体得以继续繁殖和传播。 逃避中和抗体:抗体通常通过结合病原体表面抗原来中和病原体(如阻止病毒进入细胞)。改变抗原后,抗体无法有效结合,病原体因此能继续感染宿主细胞。

  • 具体例子

细菌:某些细菌(如奈瑟氏菌)通过相变(phase variation)或基因重组快速改变表面蛋白或多糖结构,逃避宿主抗体。例如,鲍曼不动杆菌(A. baumannii)可能通过改变表面多糖或菌毛蛋白(如 PilA)的结构,降低免疫系统的识别效率。 病毒:流感病毒通过抗原漂移(小规模突变)或抗原转换(大规模基因重组)改变血凝素(HA)或神经氨酸酶(NA),使疫苗或之前的免疫反应失效。 寄生虫:如疟原虫(Plasmodium spp.)通过变异表面抗原(如 PfEMP1)不断改变暴露在红细胞表面的抗原,逃避宿主免疫反应。

  • 在鲍曼不动杆菌中的相关性 在您提供的上下文中,鲍曼不动杆菌 HKAB-1 的高毒力与其增强的生物膜形成、运动性和血清抗性相关。表面抗原的改变可能通过以下方式帮助其免疫逃避:

菌毛变异:如文中提到的 PilA 变体,HKAB-1 的 IV 型菌毛(T4P)相关基因(如 pilA)表达上调,且其 PilA 蛋白序列与其他菌株不同(非糖基化亚组)。这种变异可能改变菌毛的抗原性,使宿主抗体难以识别。 生物膜保护:生物膜本身可以物理屏蔽表面抗原,减少免疫系统对其的暴露。HKAB-1 增强的生物膜形成能力可能进一步掩盖其表面抗原,降低免疫识别效率。 抗性基因调控:文中提到 adeB 等外排泵基因在生物膜条件下的高表达,可能间接影响表面蛋白的表达或功能,改变病原体与免疫系统的相互作用。

  • 为何有效?

时间优势:免疫系统需要数天至数周来生成针对新抗原的特异性抗体或T细胞反应,而病原体改变抗原的速度通常更快(如细菌的相变或病毒的突变),使其能在免疫反应生效前扩散。 多样性:通过产生多种抗原变体,病原体增加存活概率,因为宿主免疫系统难以同时应对所有变体。 慢性感染:改变表面抗原使病原体能在宿主体内长期存活,形成慢性感染,如鲍曼不动杆菌在医院环境中通过生物膜和抗原变异在医疗设备上持续存在。

总结: 改变表面抗原通过破坏免疫系统对病原体的识别能力,使抗体或T细胞无法有效结合或清除病原体,从而实现免疫逃避。这种策略在高毒力病原体(如 HKAB-1)中尤为重要,因为它结合了抗原变异、生物膜形成等机制,增强了其在宿主环境中的存活和致病能力。这也是为何高毒力菌株在临床上难以控制的原因之一,需要持续监测和开发针对变异抗原的治疗策略(如多价疫苗或广谱抗菌药物)。

基因组与表型特性研究:一株药物敏感的鲍曼不动杆菌显示出增强的毒力相关特性和应激耐受性

简单总结
鲍曼不动杆菌(Acinetobacter baumannii)因其抗生素耐药性而广为人知,是医疗环境中一个严重的威胁。本研究分析了一株临床分离株HKAB-1,尽管其对多种抗生素高度敏感,但表现出显著的毒力相关特性。与参考菌株ATCC19606相比,HKAB-1在血清和干燥条件下显示出更强的存活能力。HKAB-1还形成了强大的生物膜并表现出更高的运动性,这些表型与持久性和致病性相关。基因组和转录组分析表明,HKAB-1拥有活跃的铁获取和血红素利用系统,这些系统在宿主类似条件下高度响应。此外,我们发现与生物膜形成相关的基因在生物膜细胞中高度诱导。相反,adeB基因的表达显著降低,这可能解释了其尽管携带多种抗性基因仍对药物敏感的表型。这些发现反映了某些鲍曼不动杆菌菌株可能存在一种进化权衡,倾向于毒力相关特性而非抗菌抗性机制的表达。这一结果强调需要持续进行基因组监测,以追踪像HKAB-1这样高毒力但药物敏感的菌株的出现,这些菌株可能在选择压力下成为抗性发展的储备库。

摘要
鲍曼不动杆菌是一种以多重耐药性和环境持久性著称的机会性病原体。我们表征了一株临床分离株HKAB-1,尽管其对所有测试的抗生素高度敏感,但表现出显著的毒力相关特性。HKAB-1在MH2B、血清和干燥条件下显示出优越的生长能力,强大的生物膜形成能力,以及活跃的运动性。全基因组测序发现了两个血红素利用簇、多个铁载体生物合成途径以及其他毒力相关基因。基因表达分析显示,在血清暴露下,血红素利用和铁载体生物合成基因簇显著上调,表明铁获取途径在宿主类似条件下被激活。与生物膜形成相关的基因,包括bap、聚-N-乙酰葡糖胺(PNAG)生物合成基因和IV型菌毛(T4P)组分,在生物膜细胞中显著上调,支持其在增强生物膜表型中的作用。相反,编码主要RND外排泵的adeB基因显著下调,这可能解释了其药物敏感表型。比较基因组分析强调了与营养运输、代谢途径和膜生物合成相关的基因差异,这些差异可能支撑其增强的生长能力。这些发现指向抗生素抗性和毒力之间的潜在权衡,强调监测抗生素敏感但高毒力的鲍曼不动杆菌分离株的重要性,这些菌株可能作为抗性进化的潜在储备库。需要进一步研究以阐明这种表型平衡的机制。

关键词:鲍曼不动杆菌,血红素利用,毒力,血清抗性,干燥耐受性


1 引言

鲍曼不动杆菌是临床环境中分离最常见的物种,已成为研究多重耐药性(MDR)的模型菌株[1 Vila 2007]。近年来,这种病原体对全球医疗系统构成了日益严重的威胁,引发多种严重的医院获得性感染,包括呼吸道、皮肤、尿路、伤口和血流感染[2 Dijkshoorn 2007]。该细菌在医疗环境中的持久性主要归因于其在恶劣条件(如干燥、消毒剂和长期抗菌药物暴露)下的卓越耐受能力[3 Fournier 2006a]。鲍曼不动杆菌的基因组可塑性在其非凡韧性中起着核心作用,使其能通过获取和水平转移外源遗传物质快速适应环境压力[4 Touchon 2014]。其整合插入序列、转座子和抗性岛等移动遗传元素的能力进一步促进了基因组重排和抗性决定因素的稳定整合[5 Fournier 2006b, 6 Peleg 2008]。过去十年的令人担忧的趋势显示,泛耐药性鲍曼不动杆菌菌株的流行率不断增加[7 Nowak 2017],凸显了理解其存活和致病性的遗传和生理基础的迫切需要。

在众多抗性机制中,外排泵的过表达和外膜通透性降低在赋予鲍曼不动杆菌抗生素抗性中起着关键作用[8 Rumbo 2013, 9 Zgurskaya 2015]。特别值得注意的是,鲍曼不动杆菌固有地编码了大量多重耐药外排泵,可分为单组分转运体和三组分系统[10 Verma 2021]。这些外排系统单独或协同作用,可主动排出多种结构和化学性质不同的底物,包括抗生素、杀菌剂、染料和洗涤剂,从而导致细胞内药物积累减少和最低抑菌浓度(MIC)升高[11 Foong 2019, 12 Foong 2020]。

除了抗菌抗性外,鲍曼不动杆菌在生物和非生物表面形成生物膜的能力以及表面相关运动性也显著促进了其作为医院病原体的成功[13 Skiebe 2012, 14 Orsinger-Jacobsen 2013]。这些特性在医疗设备和侵入性操作的定植中尤为重要,有助于持久的医院获得性感染[15 Rodríguez-Baño 2008]。此外,生物膜形成和运动性被认为促进抗性基因的传播和获取,进一步增强了该菌在医院环境中的适应性和持久性[16 Wilharm 2013, 17 Penesyan 2019]。总体而言,生物膜形成、运动性和多重耐药性的相互作用支撑了鲍曼不动杆菌在临床环境中持续存在和传播的卓越能力。

在本研究中,我们表征了一株临床分离的鲍曼不动杆菌菌株HKAB-1,该菌株显示出加速的生长动力学和显著的毒力相关表型,如增强的生物膜形成、运动性、干燥耐受性和血清抗性,尽管其对多种抗生素广泛敏感。全基因组测序表明HKAB-1属于序列类型ST392,并揭示了多种潜在毒力因子的存在,包括hemO基因簇和血红素利用簇1。比较基因组分析显示,涉及营养运输、代谢途径和膜生物合成的基因差异可能导致HKAB-1的生长增强。值得注意的是,HKAB-1中adeB的表达显著受抑,这可能解释了其尽管携带多种抗性决定因素仍表现为药物敏感的表型。此外,在生物膜条件下,编码生物膜相关蛋白Bap、聚-N-乙酰葡糖胺(PNAG)生物合成基因和IV型菌毛(T4P)组分的基因被高度诱导,支持它们在HKAB-1强大生物膜表型中的作用。这些发现表明抗生素抗性和毒力之间可能存在进化权衡,强调需要重新评估抗生素敏感的鲍曼不动杆菌在感染控制和抗性监测中的临床意义。需要进一步研究以阐明这种表型平衡的分子机制。


2 材料与方法

样本收集和细菌分离
从一名疑似细菌感染的左侧心力衰竭患者收集的痰液样本用于细菌计数分析。样本被涂布在血琼脂平板上,并在37℃过夜培养。纯培养物被储存在-80℃以待进一步处理。

MHIIB生长曲线测定
鲍曼不动杆菌菌落在Mueller-Hinton II Broth(MH2B)液体培养基中于37℃培养16-18小时。培养物被接种到120毫升新鲜MH2B培养基中,初始OD600为0.05,并在37℃、150 rpm振荡培养。使用R 4.3.3中的“nlsMicrobio”包通过“baranyi_without_lag”模型绘制细菌生长曲线[18 Baty and Delignette-Muller 2014, 19 R Core Team 2021]。

牛血清白蛋白生长曲线分析
过夜培养物用0.85% NaCl洗涤两次,并接种到150微升MHIIB或100%牛血清白蛋白中,置于聚苯乙烯U形底96孔板中,初始OD600为0.004。使用Tecan Infinite 200 Pro微孔板读数仪(瑞士Tecan)在37℃每20分钟记录一次OD600,持续16小时。生长曲线使用R 4.3.3中的“nlsMicrobio”包通过改良Gompertz模型“gompertzm”或Baranyi和Roberts模型“baranyi_without_Nmax”进行建模[18 Baty and Delignette-Muller 2014, 19 R Core Team 2021]。

最低抑菌浓度测定
最低抑菌浓度(MIC)测定按之前描述的方法进行[20 Tam 2020]。简而言之,鲍曼不动杆菌菌株的过夜培养物被稀释至OD600为0.02,30微升培养物被接种到含120微升2倍系列稀释底物的MH2B液体培养基中,置于聚苯乙烯U形底96孔板中。微孔板在37℃、180 rpm孵育16小时,使用Tecan Infinite M200 Pro微孔板读数仪(瑞士Tecan)测定OD600。MIC定义为OD600值低于0.1的最低抗生素浓度。

生物膜形成实验
生物膜形成实验按之前描述的方法稍作修改后进行[21 Haney 2018]。简而言之,鲍曼不动杆菌菌株的过夜培养物被接种到含1毫升LB培养基的5毫升聚苯乙烯管中,初始OD600为0.05,并在30℃或37℃静置培养24小时。液体培养物的细菌生长通过OD600测定。随后,细菌培养物的上清液被丢弃,生物膜细胞用蒸馏水冲洗三次,然后用0.1%结晶紫在室温下染色20分钟。结晶紫染色液被丢弃,管子再次用蒸馏水冲洗三次,染色的生物膜细胞用无水乙醇溶解。溶解的生物膜细胞在OD595处量化。生物膜形成以OD595/OD600比率表示,以标准化总细菌生长量。

运动性实验
群集运动和抽搐运动实验按之前描述的方法稍作修改后进行[22 Clemmer 2011]。对于群集运动实验,过夜培养物被稀释至OD600为0.1,2微升培养物滴加到含0.4%琼脂的LB培养基上。琼脂平板在37℃孵育24小时。对于抽搐运动实验,过夜培养物被稀释至OD600为0.1,2微升培养物刺入含0.8%琼脂的LB培养基中,在培养皿和琼脂之间形成间隙菌落。琼脂平板在37℃孵育24小时。孵育后,琼脂被丢弃,培养皿用0.2%结晶紫染色后进行观察。

干燥耐受实验
干燥耐受实验按之前描述的方法稍作修改后进行[23 Oda 2022]。过夜培养物在MHIIB培养基中于37℃培养,然后收获并用0.85% NaCl洗涤两次。细胞悬液调整至OD600为2.0,20微升等分试样被移至醋酸纤维素膜过滤器(孔径0.45微米)上,并在层流下风干。干燥的膜被放置在未盖盖的培养皿中,置于含30克Drierite干燥剂的密封Glasslock容器(17.7 × 13.1 × 6.8厘米)内,以维持20±3%的相对湿度。容器在24℃孵育。第0天的活菌计数通过将膜转移到含1毫升0.85% NaCl的2毫升管中,室温下轻柔涡旋5分钟后进行。系列稀释液涂布在LB琼脂上以测定菌落形成单位(CFUs)。

溶血和蛋白酶实验
溶血实验在补充5%去纤维蛋白马血的哥伦比亚血琼脂平板上进行,如之前描述[24 Tuttobene 2021]。简而言之,调整至OD600为2.5的10微升过夜培养物被接种到血琼脂平板上,并在37℃孵育48小时。蛋白酶实验在脱脂乳琼脂平板上进行,平板在37℃孵育24小时。

RNA提取
为评估毒力相关和RND外排泵基因的表达,鲍曼不动杆菌菌株的过夜培养物被稀释至初始OD600为0.05,置于25毫升LB培养基中,于37℃、180 rpm振荡培养至OD600达0.5–0.7。为评估与血清耐受性相关的基因表达,在含血清培养基和MH2B(作为对照)中生长的鲍曼不动杆菌细胞于OD600达0.5–0.7时收获。每种培养物取500微升,使用RNAstore试剂(天根生物,中国)稳定。总RNA使用RNAprep Pure Bacteria Kit(天根生物,中国)提取。为测定生物膜相关基因的表达,生物膜使用RNAprotect Bacteria Reagent(Qiagen,德国)重悬浮。RNA提取使用RNeasy Mini Kit(Qiagen,德国)进行。RNA浓度和纯度使用Nanodrop分光光度计测定。

反转录qPCR
反转录使用FastKing gDNA Dispelling RT SuperMix II(天根生物,中国)进行,以500纳克总RNA为模板。定量PCR(qPCR)在Applied Biosystems StepOnePlus(美国Applied Biosystems)或Bio-Rad CFX Connect(美国Bio-Rad Laboratories)热循环仪上使用2× Universal SYBR Green Fast qPCR Mix(AbClonal Technology,美国)进行,每反应使用400纳克总cDNA。引物序列列于表S1,以rpoB作为参考基因。基因表达分析按之前描述的方法进行[25 Foong 2025]。ΔCT值计算为CT(rpoB) – CT(目标基因)。处理组(如血清、生物膜或HKAB-1)与对照组(如LB或ATCC19606)之间的平均ΔCT值差异使用R 4.4.1版实现的方差分析(ANOVA)模型进行分析,包含基因和基因:处理交互项[19 R Core Team 2021]。Tukey的诚实显著差异(HSD)检验用于确定组间基因表达的统计显著差异。

基因组DNA提取和基因组测序
基因组DNA使用标准苯酚-氯仿方法提取。基因组DNA使用Covaris LE220R-plus系统(美国Covaris)碎裂至平均350 bp。使用Rapid Plus DNA Lib Prep kit(AbClonal Technology,美国)制备DNA文库,并在Illumina平台上由诺禾致源生物信息科技有限公司(中国北京)进行2×150 bp双端读长测序。使用Trimmomatic v0.39进行质量控制和修剪[26 Bolger 2014]。使用SPAdes v3.15.5进行从头组装,得到72个contigs[27 Bankevich 2012]。contig注释使用细菌和病毒生物信息资源中心(BV-BRC)流程[28 Olson 2023]。所有长度≥500 bp的contigs使用Multi-CAR成功搭建脚手架[29 Chen 2016],该方法使用多个参考基因组排列和定位contigs,形成染色体组装。平均核苷酸同一性(ANI)分析使用在线ANI计算器(https://www.ezbiocloud.net/tools/ani)通过OrthoANI算法进行[30 Yoon 2017]。

基因组注释和分析
使用Abricate v0.3(https://github.com/tseemann/abricate)分析与抗菌抗性相关的基因位点,参考MEGARes 2.0和抗生素抗性基因注释(ARG-ANNOT)数据库[31 Gupta 2014, 32 Bonin 2023]。使用VFDB[33 Chen 2005]和PHASTEST v1.0.1[34 Wishart 2023]分别分析HKAB-1的毒力因子和噬菌体序列。基因组图谱使用Proksee生成[35 Grant 2023]。多位点序列分型(MLST)分析使用PubMLST进行[36 Jolley 2018]。使用Kaptive Web v1.3.0结合鲍曼不动杆菌数据库鉴定HKAB-1菌株的荚膜多糖(KL)和脂寡糖外核(OCL)位点[37 Cahill 2022]。核心基因组系统发育树使用Roary v3.13.0处理注释基因组组装(GFF3格式)以识别核心基因[38 Page 2015]。使用MAFFT v7.526进行多序列比对[39 Katoh 2013],并使用RAxML-NG v1.2.2在GTR+G模型下进行系统发育推断,包含1000次bootstrap重复[40 Kozlov 2019]。


3 结果

菌株收集和鉴定
一名患有左侧心力衰竭并伴有细菌性呼吸道感染临床症状的患者入院。从患者痰液中分离出细菌分离株,命名为HKAB-1,在补充5%去纤维蛋白马血的哥伦比亚血琼脂平板上培养后获得。琼脂平板上未观察到溶血或蛋白水解活性(图S1)。根据初步表型特征,该分离株被初步鉴定为鲍曼不动杆菌。患者具有多种高危因素,包括高龄、严重心功能障碍和多器官功能障碍。根据医院治疗方案,启动了为期七天的哌拉西林-他唑巴坦作为经验性抗菌治疗。完成抗生素疗程后,患者的呼吸道症状显著改善。住院第九天,心脏检查显示心音正常,所有瓣膜区域无病理性杂音,肺部听诊发现双肺少量干啰音。鉴于临床改善,患者被认为适合出院。该分离株随后被转至中国南方大学衡阳医学院医学微生物学系进行分子鉴定和表型表征。

HKAB-1对多种抗生素更敏感
近年来,鲍曼不动杆菌相关感染因其多重耐药表型成为临床关注的重点[1 Vila 2007]。因此,我们评估了临床分离株HKAB-1相对于实验室菌株ATCC19606的抗生素敏感性特征,以明确菌株特异性抗性模式。出乎意料的是,HKAB-1对大多数测试抗生素显示出更高的敏感性,相比ATCC19606,仅对奥沙西林(2倍差异,MIC:512 μg/mL)和利福平(2倍差异,MIC:4 μg/mL)例外(表1)。值得注意的是,HKAB-1对阿米卡星、阿奇霉素、环丙沙星、多尼培南、四环素类和托布霉素的MIC降低了4-8倍,对阿莫西林和替加环素的MIC降低了高达16倍(表1)。

HKAB-1表现出增强的生物膜形成和血清抗性
鲍曼不动杆菌在临床环境中的持久性主要归因于其形成生物膜的能力,这是感染中的关键毒力因子[41 Lee 2008, 42 Espinal 2012]。为研究这些特性,我们评估了HKAB-1菌株的生物膜形成和血清抗性能力。为确保生物膜实验的准确标准化,我们首先分析了临床分离株HKAB-1和实验室菌株ATCC19606在MHIIB培养基中的生长动力学。HKAB-1菌株在MHIIB中的生长速率高于ATCC19606,最大特定生长速率(μmax)分别为0.87 ± 0.03 h⁻¹和0.63 ± 0.02 h⁻¹(非配对Student’s t检验,p < 0.005)(图1A-B)。一致地,5小时时间点的OD600测量值对HKAB-1也较高,ATCC19606的平均OD600值为1.57 ± 0.07,HKAB-1为1.91 ± 0.07(非配对Student’s t检验,p < 0.05)(图1C)。
鉴于生长动力学的显著差异,使用结晶紫染色量化的生物膜以相应静置孵育的浮游培养物的OD600进行标准化,以确保可比性和准确性。值得注意的是,HKAB-1在37℃比30℃形成略多的生物膜,尽管差异无统计学意义(非配对Student’s t检验,p = 0.11),而ATCC19606在生物膜形成中未显示温度依赖性变化(图1D)。有趣的是,HKAB-1在30℃下比ATCC19606显示出显著更强的生物膜形成能力(非配对Student’s t检验,Welch校正,p < 0.05),而在37℃下两菌株之间无显著差异(图1D)。
已知临床不动杆菌属具有高血清抗性[43 Magda 2022]。为评估HKAB-1菌株在牛血清白蛋白(BSA)中的存活能力,我们在聚苯乙烯U形底96孔板中监测了两种鲍曼不动杆菌菌株在BSA和MHIIB中的生长。如预期,HKAB-1在MHIIB中显示出比ATCC19606更强的生长(图1A, 1E),16小时时间点的平均OD600值分别为1.03 ± 0.01(HKAB-1)和0.85 ± 0.01(ATCC19606)(非配对Student’s t检验,p < 0.005)(图1F)。令人注目的是,HKAB-1在100% BSA中也显示出强劲的生长,而ATCC19606对BSA高度敏感,平均OD600值分别为0.57 ± 0.01和0.19 ± 0.02(非配对Student’s t检验,p < 0.005)(图1E, 1G)。这些发现凸显了HKAB-1在营养丰富和血清基础条件下的增强适应性(图1)。

HKAB-1表现出增强的运动性
表面相关运动性被认为是临床鲍曼不动杆菌分离株的常见特性[13 Skiebe 2012]。为评估临床分离株HKAB-1的运动性,我们在半固体琼脂上测定了HKAB-1和ATCC19606的群集运动和抽搐运动。孵育24小时后,HKAB-1在琼脂表面显示出显著更大的群集运动性,在琼脂-塑料界面显示出更大的抽搐运动性,平均直径分别为2.8 ± 0.1厘米和2.1 ± 0.1厘米(非配对Student’s t检验,p < 0.005)(图2A-D)。与之前研究一致[44 Eijkelkamp 2011],ATCC19606在半固体培养基上无运动性(图2A-D)。

HKAB-1耐受干燥
之前研究表明,生物膜形成显著增强鲍曼不动杆菌的干燥耐受性,尽管可能以降低抗生素抗性为代价[45 Greene 2016]。我们假设HKAB-1菌株的高抗生素敏感性和增强的生物膜形成能力可能赋予其对长期干燥的更好耐受性。与此假设一致,干燥导致HKAB-1活菌数量相比初始接种量减少66.3%(Tukey的HSD检验,p < 0.005),而ATCC19606的存活率在仅一天孵育后几乎降至不可检测水平(图2E)。值得注意的是,干燥四天后,HKAB-1保留了约15.4%的存活率(Tukey的HSD检验,p < 0.005)(图2E),突显了其增强的干燥抗性。

HKAB-1菌株的基因组背景
为解释临床分离株与ATCC19606菌株在抗生素敏感性上的差异,我们对HKAB-1进行了全基因组测序,平均核苷酸同一性(ANI)分析[30 Yoon 2017]表明该分离株与鲍曼不动杆菌(NCBI accession CP059040)共享97.88%的同一性,确认了物种水平分类。组装的基因组总长度为3,758,367 bp,包含单一圆形染色体(图3A)。通过结合公开的不动杆菌基因组进行核心基因组分析,进一步验证了物种身份和系统发育关系。HKAB-1确实聚类在鲍曼不动杆菌分支内,显示出与临床相关菌株如AB030的密切进化关系(图3B)。值得注意的是,未检测到可检测的质粒。总体G+C含量为38.92%。基因组注释预测了3,559个基因,包括3,488个编码序列(CDSs)和71个RNA基因,包括4个rRNA和63个tRNA(表2)。在3,488个预测的CDS中,3,446个蛋白质编码基因根据COG数据库被分配到21个功能类别。此外,相当数量的基因被归类为未知功能(19.47%),表明需要进一步分析以阐明其功能。在硅MLST分析表明HKAB-1属于序列类型ST392(表S2),根据Pasteur方案[46 Diancourt 2010]。值得注意的是,ST392此前仅在2010年台湾的一个单一分离株中报道过,这引发了对其地理分布和潜在出现的疑问。

抗菌抗性基因的比较分析
使用Abricate(https://github.com/tseemann/abricate)进行抗菌抗性基因分析,参考MEGARes 2.0和抗生素抗性基因注释(ARG-ANNOT)[31 Gupta 2014, 32 Bonin 2023],在HKAB-1和ATCC19606菌株中分别鉴定了27和28个可能与抗性基因相关的开放阅读框(ORFs)(表3)。在27个抗性基因中,21个与外排泵相关,包括10个来自抗性-分裂-细胞分裂(RND)家族的ORF,4个编码假定主要易化体超家族(MFS)家族的ORF,2个来自多重耐药和毒性外排(MATE)家族的ORF,1个来自小分子多重耐药(SMR)家族的ORF,以及5个编码假定转录调控因子的ORF。其余6个ORF与抗生素失活相关,包括5个β-内酰胺酶编码基因和1个编码氨基糖苷核苷酰转移酶(ant(3”)-IIa)的基因。与ATCC19606类似,HKAB-1基因组中缺乏编码外膜蛋白adeC的基因。鲍曼不动杆菌基因组中adeAB位点缺乏adeC是前所未有的,因为AdeAB可以招募另一个外膜蛋白AdeK形成功能性三组分复合物[47 Sugawara 2014]。有趣的是,HKAB-1携带的抗菌抗性基因数量与ATCC19606相当,但对所有测试抗生素显示出更高的敏感性。

毒力因子相关基因的比较分析
由于HKAB-1菌株表现出比ATCC19606更高的毒力,如生物膜形成、运动性和血清抗性,我们评估了两菌株之间不同毒力特性的遗传背景。HKAB-1基因组编码106个与毒力因子相关的ORF,分为七个主要功能家族,包括粘附、生物膜形成、磷脂酶、免疫逃避、铁摄取、调控功能和血清抗性(表S3)。相比之下,ATCC19606基因组包含95个毒力相关ORF,缺乏关键血红素利用基因,包括hemO基因簇(ACP71R_11060–ACP71R_11105)和血红素利用簇1(ACP71R_06965–ACP71R_07025),这些基因均存在于HKAB-1中(表S3)。此外,基因组还包含两个与PHAGE_Acinet_Bphi_B1251_NC_019541高序列相似性的假定噬菌体区域(图3A)。第一个噬菌体是一个完整的噬菌体,跨度43.7 Kb(位置2,159,893至2,203,690 bp),GC含量为38.67%。第二个噬菌体是一个不完整的噬菌体,长度30.9 Kb,位于1,930,574至1,961,551 bp之间,GC含量为35.65%。
除了通过VFDB鉴定的毒力因子外,荚膜多糖(KL)位点被认为是鲍曼不动杆菌致病性的关键决定因素[48 Russo 2010]。HKAB-1菌株携带KL107位点,位于编码假定FKBP型肽基-脯氨酰顺反异构酶(fkpA)的ACP71R_14980和lldP基因之间,以及OCL3位点,位于编码假定蛋白的ACP71R_00345和编码假定支链氨基酸转氨酶(ilvE)的ACP71R_00295基因之间。这些位点分别负责荚膜多糖(CPS)和脂寡糖(OCL)的生物合成和输出。值得注意的是,HKAB-1菌株的OCL3与通常位于ilvE和aspS之间的更常见OCL配置不同[49 Wyres 2020]。

外排泵和毒力相关基因的相对表达
为研究外排泵和毒力相关基因在抗生素抗性和致病性中的功能相关性,我们在相关表型条件下使用RT-qPCR量化了这些基因的表达水平。在LB培养基中,HKAB-1(adeG: ∆CT = -9.45 ± 0.15; adeJ: ∆CT = -1.97 ± 0.15)和ATCC19606(adeG: ∆CT = -9.42 ± 0.15; adeJ: ∆CT = -1.49 ± 0.15)之间adeG和adeJ的转录无显著差异(图4A)。相反,HKAB-1中adeB显著下调(ΔΔCT = -7.27 ± 0.21; 折叠变化 = 0.0065),可能导致其尽管携带多种抗性基因仍表现为抗生素敏感表型。
鉴于生物膜相关蛋白Bap、Csu菌毛、PNAG生物合成和IV型菌毛(T4P)在生物膜形成和抽搐运动性中的作用(表S2)[50 Loehfelm 2008, 51 Tomaras 2003, 52 Choi 2009, 53 Ronish 2019],我们检查了HKAB-1中这些基因的转录特征。ATCC19606除csuC外,表现出相对较低的表达(bap: ∆CT = -4.95 ± 0.32; csuC: ∆CT = -1.22 ± 0.32; pgaB: ∆CT = -7.58 ± 0.32; pilA: ∆CT = -10.04 ± 0.32; pilO: ∆CT = -8.17 ± 0.32)(图4B)。编码Csu菌毛组装伴侣蛋白的csuC和编码PNAG生物合成脱乙酰酶的pgaB在两株菌之间无显著转录差异。然而,HKAB-1中bap和T4P特异性基因(包括编码假定菌毛蛋白的pilA和编码T4P生物合成蛋白的pilO)显著上调(bap: ΔΔCT = 3.03 ± 0.45; 折叠变化 = 8.14; pilA: ΔΔCT = 5.54 ± 0.45; 折叠变化 = 46.54; pilO: ΔΔCT = 2.42 ± 0.45; 折叠变化 = 5.34)(图4B),与其强大的生物膜和运动性表型一致。
为进一步评估生物膜相关基因在生物膜发育中的功能作用,我们比较了生物膜相关细胞和浮游培养物之间的表达。一致于我们早先的结果(图4B),csuC在两种条件下无显著转录差异(图4C)。出乎意料的是,在浮游细胞中表达水平较低的pgaB在生物膜细胞中强烈诱导(ΔΔCT = 5.55 ± 0.43; 折叠变化 = 46.79),支持PNAG生物合成在生物膜形成中的关键作用(图4C)。正如预期,bap和T4P特异性基因(pilA和pilO)在生物膜相关细胞中相对于浮游细胞进一步上调(bap: ΔΔCT = 2.06 ± 0.43; 折叠变化 = 4.17; pilA: ΔΔCT = 2.73 ± 0.43; 折叠变化 = 6.62; pilO: ΔΔCT = 3.77 ± 0.43; 折叠变化 = 13.60)(图4B, 4C)。有趣的是,在浮游HKAB-1中表达水平较低的RND外排泵基因adeB和adeG在生物膜相关细胞中显著诱导(adeB: ΔΔCT = 7.88 ± 0.43; 折叠变化 = 236.19; adeG: ΔΔCT = 7.54 ± 0.43; 折叠变化 = 185.98),而adeJ表达未变(图4C)。鉴于先前报道将铁载体生物合成与生物膜发育联系起来[54 Wang, 2025],我们还检查了铁载体相关基因,发现basA(acinetobactin簇)和bfnL(fimsbactin簇)在生物膜细胞中强烈诱导(图4C),表明其在生物膜发育中的贡献作用。总的来说,HKAB-1相对于ATCC19606中bap和T4P基因的显著上调,结合其在生物膜条件下的进一步诱导以及PNAG、RND外排泵和铁载体系统的同步激活,提示了一个驱动HKAB-1强大生物膜表型的协同因子网络。
血红素利用簇在血清条件下对细菌存活至关重要[55 de Léséleuc 2014]。鉴于HKAB-1携带血红素利用基因,而ATCC19606缺乏这些基因,我们通过分析涉及血红素摄取和铁载体生物合成的基因表达,评估了铁获取系统对血清暴露的调控反应。在MH2B标准生长条件下,血红素获取基因(包括编码假定血红素氧化酶的hemO和血红素利用簇1中预测的TonB依赖性受体的ACP71R_07005)以及铁载体生物合成基因(如basA和bfnL)的表达相对较低(图4D,x轴)。在血清暴露下,所有四个基因显著激活(hemO: ∆∆CT = 9.13 ± 0.42; 折叠变化 = 558.50; ACP71R_07005: ∆∆CT = 1.89 ± 0.42; 折叠变化 = 3.71; bfnL: ∆∆CT = 6.05 ± 0.42; 折叠变化 = 66.29; basA: ∆∆CT = 4.32 ± 0.42; 折叠变化 = 19.96)(图4D),提示铁获取途径在模拟宿主条件下强烈诱导。


4 讨论

HKAB-1的高抗生素敏感表型与之前观察到的某些鲍曼不动杆菌和沃尔夫不动杆菌分离株一致,这些分离株尽管对抗生素敏感,仍能引发多种感染[56 Darby 2024]。值得注意的是,沃尔夫不动杆菌通常被认为抗生素敏感且携带较少的抗性基因,但近期已成为新生儿重症监护病房感染的常见原因,且日益与多重耐药表型相关[56 Darby 2024, 57 Chatterjee 2016]。这些发现表明,抗生素敏感性并不一定排除医院暴发的可能性,不动杆菌属仍可能在临床选择压力下获取抗性决定因素。与此观察一致,HKAB-1的基因组分析显示存在多种抗生素抗性基因,包括编码临床上重要的RND外排泵的基因,这些是鲍曼不动杆菌中多重耐药表型的关键贡献者[58 Nowak 2015]。有趣的是,HKAB-1中adeB的转录水平较低(∆CT = -10.11 ± 0.15),相比之下,ATCC19606为(∆CT = -2.85 ± 0.15),HKAB-1和ATCC19606之间的比较基因分析显示HKAB-1中adeB下调(ΔΔCT = -7.27 ± 0.21; 折叠变化 = 0.0065)。相比之下,在标准生长培养基中,adeG和adeJ的表达水平无显著差异。这些发现提示,adeB表达的减少可能是HKAB-1增加敏感性的原因,因为该外排泵在临床鲍曼不动杆菌分离株的多重耐药性中至关重要[8 Rumbo 2013, 59 Marchand 2004]。此外,其他抗性机制(如β-内酰胺酶或非RND外排系统)的活性降低或下调也可能导致观察到的抗生素敏感表型。总的来说,这些发现表明,尽管HKAB-1目前保持抗生素敏感,但其具有在适当选择压力下表达和激活抗性特征的遗传潜力,需要在临床环境中对这类菌株进行仔细监测。

HKAB-1在宿主中引发感染的能力使我们假设该菌株可能表现出比实验室菌株ATCC19606更强的毒力表型。与此假设一致,表型表征显示,HKAB-1在血清和干燥条件下显示出优越的生长能力,生物膜形成能力增强,并表现出群集和抽搐运动性,这些都是鲍曼不动杆菌中已确立的毒力相关特性[13 Skiebe 2012, 41 Lee 2008, 42 Espinal 2012, 43 Magda 2022]。之前研究表明,获取多重耐药性通常会带来适应性成本,包括生长受损和对环境压力的耐受性降低,而增强的生物膜形成可能抵消鲍曼不动杆菌的抗生素敏感性[45 Greene 2016, 60 Espinal 2019]。与这些观察一致,HKAB-1尽管对所有测试抗生素高度敏感,但显示出增强的干燥抗性和强大的生物膜形成能力(图1E, 2E)。值得注意的是,HKAB-1还表现出更高的代谢能力,表现为更快的生长动力学和更高的生物量产出(在MH2B和血清培养基中更高的OD600读数)(图1A, 1D)。正交基因组(COG)类别的比较分析显示,HKAB-1在多个与生长相关的功能中拥有更多基因,包括能量生产和转化(C)、氨基酸代谢(E)、无机离子运输(P)、细胞膜生物合成(M)和碳水化合物代谢(G)(图S2)。这些COG的丰富提示了营养摄取、代谢途径基因和膜合成的增强调控,这可能共同减少生理瓶颈并提高生长效率。特别值得注意的是,我们观察到HKAB-1中adeB外排泵基因显著下调。鉴于抗性机制相关的能量成本[61 Andersson 2010],adeB表达的减少可能缓解代谢负担,从而有助于改善生长。总的来说,这些发现可能支持一种模型,即抗菌抗性的降低被增强的毒力特性和环境适应性所抵消。这种权衡的分子机制尚不清楚,需要进一步研究。

进一步的基因组分析显示,HKAB-1携带hemO基因簇(ACP71R_11060–ACP71R_11105)以及额外的血红素利用簇1(ACP71R_06965–ACP71R_07025)(表S3)。hemO簇常见于多重耐药流行菌株,被认为与增加的毒力相关[55 de Léséleuc 2014, 62 Ou 2015],并通过促进从血红素获取铁增强细菌在血清中的存活[55 de Léséleuc 2014]。与这些发现一致,我们观察到在血清暴露下,hemO和ACP71R_07005(分别编码血红素氧化酶和假定的TonB依赖性受体)显著上调。此外,在这些条件下,涉及铁载体acinetobactin(basA)和fimsbactin(bfnL)生物合成的基因也显著上调。这些结果表明,血红素利用和铁载体介导的铁获取对血清中的细菌适应性至关重要。我们认为,hemO簇、血红素利用簇1和多种铁载体系统的共同存在有助于HKAB-1在血清中的优越存活,血清中游离铁有限但富含血红素结合铁[63 Parrow 2013]。虽然已显示ATCC19606能利用血红素,但早期研究使用了高于血清中发现的血红素浓度[64 Zimbler 2009],这可能解释了其在这些条件下的生长减少。

IV型菌毛(T4P)是鲍曼不动杆菌的关键毒力因子,介导宿主细胞粘附、生物膜形成和抽搐运动性[53 Ronish 2019]。PilN和PilO是PilMNOP内膜对齐亚复合体的保守组分,PilNO的适当异二聚化对T4P生物合成至关重要[65 Leighton 2015]。比较基因组分析显示,ATCC19606菌株携带一个受损的pilN基因(表S3)。缺乏功能性pilN可能损害菌毛组装,导致其运动性和生物膜形成的缺陷。相比之下,HKAB-1中所有T4P基因,包括pilN,均完整(表S3),与其保留的抽搐运动性和强大生物膜表型一致。此外,先前研究表明,编码主要菌毛亚单位的pilA的变异可影响菌毛表面静电特性,并调节鲍曼不动杆菌中菌毛相关功能[44 Eijkelkamp 2011, 53 Ronish 2019]。不动杆菌中的PilA变体分为糖基化形式(具有C端丝氨酸残基作为糖基化位点)和非糖基化形式(缺乏该残基)(图S3B)。PilA的糖基化由T4P特异性O-寡糖基转移酶tfpO介导,位于pilA下游[66 Harding 2015]。虽然PilA糖基化的功能影响尚不确定,但菌株特异性变体与不同表型相关[67 Piepenbrink 2016]。例如,AB5075变体与抽搐运动性相关,而ACICU变体促进生物膜形成[53 Ronish 2019]。19株鲍曼不动杆菌菌株的PilA序列系统发育分析显示,HKAB-1的PilA形成一个独特的进化枝,与ACICU、NIPH-329、Ab44444和OIFC137的变体更接近,而与AB5075、BIDMC57或ATCC19606的变体较远(图S3A)。值得注意的是,尽管与ACICU聚类,HKAB-1的PilA缺乏末端丝氨酸残基,属于非糖基化亚组(图S3)。这些发现提示HKAB-1的PilA可能在调节运动性和生物膜形成中具有菌株特异性作用。此外,HKAB-1中pilA和pilO的高表达支持了该菌株观察到的增强的抽搐运动性和生物膜表型(图1E, 2A, 2B, 4C)。

此外,HKAB-1编码bap,一种对鲍曼不动杆菌生物膜发育至关重要的生物膜相关蛋白[50 Loehfelm 2008],该蛋白也在ATCC19606中存在。HKAB-1中bap和T4P基因(如pilA和pilO)显著升高的表达,结合其在生物膜条件下的进一步诱导以及PNAG生物合成的上调(图4B, 4C),可能是其增强的生物膜形成能力的分子基础。有趣的是,在浮游培养物中表达水平较低的AdeB和AdeG RND外排泵在生物膜条件下高度响应,提示其在生物膜成熟或维持中的作用[68 Richmond 2016]。生物膜形成,部分由Bap和RND外排系统介导,是鲍曼不动杆菌在恶劣宿主和环境条件下持续存在的重要毒力机制[41 Lee 2008, 69 He 2015, 68 Richmond 2016]。先前研究进一步表明,生物膜产生通常与抗生素敏感性和血清抗性相关。具体而言,高生物膜产生的分离株在浮游培养物中通常表现出较低的抗生素抗性,但在面对宿主因子如血清时显示出更高的抗性,以及增强的干燥耐受性[15 Rodríguez-Baño 2008, 42 Espinal 2012, 45 Greene 2016, 70 King 2009]。总的来说,HKAB-1的生物膜形成能力可能在宿主相关应激或抗生素暴露下赋予其选择性优势,并可能促进在生物膜群落中获得或维持多重耐药性。


5 结论

尽管鲍曼不动杆菌HKAB-1携带多种抗菌抗性基因,包括临床上相关的假定β-内酰胺酶以及多个RND和MFS外排泵,但该菌株对所有测试的抗生素仍保持敏感。值得注意的是,基因组分析还揭示了多种毒力因子和噬菌体序列的存在,表明其基因组结构有利于致病性。具体而言,HKAB-1携带血红素利用簇和多个生物膜相关基因,使其在血清中的存活能力和生物膜形成能力相比ATCC19606显著增强。这些发现强调了对鲍曼不动杆菌临床分离株持续监测的至关重要性,以防止携带广泛多重耐药决定因素的菌株出现和传播。


表1 鲍曼不动杆菌临床分离株HKAB-1和ATCC 19606的抗菌敏感性

最低抑菌浓度(MIC,μg/ml)

抗生素类别 抗生素 ATCC 19606 HKAB-1
氨基糖苷类
阿米卡星 8–16 4
庆大霉素 16-32 1-2
托布霉素 2-4 0.5
碳青霉烯类
多尼培南 0.5 0.125
美罗培南 0.5–1 0.125–0.25
头孢菌素类
头孢噻肟 16 8-16
头孢曲松 64-128 32-64
头孢呋辛 128 32-64
氟喹诺酮类
环丙沙星 1 0.125
左氧氟沙星 0.5 0.125-0.25
大环内酯类
阿奇霉素 32-64 2–4
克拉霉素 64-128 16–32
红霉素 16 8
青霉素类
阿莫西林 256 16
奥沙西林 256 512
哌拉西林 32–64 8–16
四环素类
多西环素 1–2 0.25
米诺环素 0.5 0.125
四环素 16 2–4
替加环素 4 0.125-0.25
其他抗生素
氯霉素 64–128 64–128
克林霉素 256 256-512
夫西地酸 256 256
利奈唑胺 256–512 256–512
呋喃妥因 128-256 >256
磷霉素 >1024 >1024
多粘菌素B 0.25–0.5 0.25–0.5
利福平 2 4
磺胺甲恶唑 1024 1024
甲氧苄啶 64-128 32–64
万古霉素 256-512 256

表2 鲍曼不动杆菌临床分离株HKAB-1的序列数据和基因组特征总结

指标
测序读数总数 7,674,099 x 2
覆盖率 608.3
contig数量(≥ 500 bp) 24
粗略一致性(%) 99.4
精细一致性(%) 98.8
完整性(%) 100
污染(%) 0.2
基因组大小(bp) 3,758,367
contigs N50(bp) 365,067
contigs L50 4
鸟嘌呤-胞嘧啶含量(%) 38.92
基因总数 3,559
编码序列(CDSs)数量 3,488
tRNA数量 63
rRNA数量 4

表3 鲍曼不动杆菌临床分离株HKAB-1的预测抗菌抗性

抗生素抗性

位点标签 基因 蛋白质家族 同一性(%)
抗生素失活
ACP71R_01635 blaOXA-91 β-内酰胺酶 98.75
ACP71R_02890 blaADC-50 β-内酰胺酶 100.00
ACP71R_06460 blaMBL β-内酰胺酶 99.71
ACP71R_07365 blaOXA-51 β-内酰胺酶 98.79
ACP71R_08870 blaA β-内酰胺酶 97.48
ACP71R_14580 ant(3”)-IIa 氨基糖苷核苷酰转移酶 98.61
外排泵及其调控因子
ACP71R_01165 adeK 抗性-分裂-细胞分裂 99.38
ACP71R_01170 adeJ 抗性-分裂-细胞分裂 99.59
ACP71R_01175 adeI 抗性-分裂-细胞分裂 99.92
ACP71R_03190 adeH 抗性-分裂-细胞分裂 99.17
ACP71R_03195 adeG 抗性-分裂-细胞分裂 97.23
ACP71R_03200 adeF 抗性-分裂-细胞分裂 98.85
ACP71R_03205 adeL 转录调控因子 99.21
ACP71R_03230 abeS 小分子多重耐药 99.70
ACP71R_04480 amvA 主要易化体超家族 97.84
ACP71R_04740 adeN 转录调控因子 98.47
ACP71R_05490 abaQ 主要易化体超家族 98.85
ACP71R_05965 adeT1 抗性-分裂-细胞分裂 97.49
ACP71R_05975 adeS 双组分信号转导系统 97.33
ACP71R_05980 adeR 双组分信号转导系统 98.66
ACP71R_05985 adeA 抗性-分裂-细胞分裂 98.66
ACP71R_05990 adeB 抗性-分裂-细胞分裂 98.23
ACP71R_08510 abaF 主要易化体超家族 97.75
ACP71R_10620 mexT 转录调控因子 98.89
ACP71R_13360 abeM 多重抗菌挤出蛋白 98.52
ACP71R_16955 craA 主要易化体超家族 100.00
ACP71R_17230 adeT2 抗性-分裂-细胞分裂 99.58

Example for Table 1: Antimicrobial susceptibility of A. baumannii clinical isolate HKAB-1 and ATCC 19606 抗生素敏感性数据 – 鲍曼不动杆菌临床分离株HKAB-1和ATCC 19606

抗生素类别: 氨基糖苷类

抗生素: 阿米卡星

ATCC 19606 MIC (μg/ml): 8–16 HKAB-1 MIC (μg/ml): 4

抗生素: 庆大霉素

ATCC 19606 MIC (μg/ml): 16-32 HKAB-1 MIC (μg/ml): 1-2

抗生素: 托布霉素

ATCC 19606 MIC (μg/ml): 2-4 HKAB-1 MIC (μg/ml): 0.5

抗生素类别: 碳青霉烯类

抗生素: 多尼培南

ATCC 19606 MIC (μg/ml): 0.5 HKAB-1 MIC (μg/ml): 0.125

抗生素: 美罗培南

ATCC 19606 MIC (μg/ml): 0.5–1 HKAB-1 MIC (μg/ml): 0.125–0.25

[… and so on for other categories and antibiotics, abbreviated for brevity]

Example for Table 2: Summary of sequence data and genome features of A. baumannii clinical isolate HKAB-1 基因组特征数据 – 鲍曼不动杆菌临床分离株HKAB-1

指标: 测序读数总数

值: 7,674,099 x 2

指标: 覆盖率

值: 608.3

指标: contig数量(≥ 500 bp)

值: 24

指标: 粗略一致性 (%)

值: 99.4

指标: 精细一致性 (%)

值: 98.8

指标: 完整性 (%)

值: 100

[… and so on for remaining metrics]

Example for Table 3: Predicted antimicrobial resistance of A. baumannii clinical isolate HKAB-1 抗菌抗性预测数据 – 鲍曼不动杆菌临床分离株HKAB-1

类别: 抗生素失活

位点标签: ACP71R_01635

基因: blaOXA-91 蛋白质家族: β-内酰胺酶 同一性 (%): 98.75

位点标签: ACP71R_02890

基因: blaADC-50 蛋白质家族: β-内酰胺酶 同一性 (%): 100.00

[… and so on for other antibiotic inactivation entries]

类别: 外排泵及其调控因子

位点标签: ACP71R_01165

基因: adeK 蛋白质家族: 抗性-分裂-细胞分裂 同一性 (%): 99.38

[… and so on for other efflux pump entries]


图1 鲍曼不动杆菌实验室菌株ATCC 19606和临床分离株HKAB-1的生长动力学和生物膜形成

(A) 鲍曼不动杆菌菌株的生长曲线使用无滞后期Baranyi和Roberts生长模型拟合。阴影区域表示通过自举法获得的95%置信区间。
(B) 根据拟合生长模型计算的最大特定生长速率(μmax)。
(C) 在5小时时间点测量的600纳米处光密度(OD₆₀₀)。
(D) 鲍曼不动杆菌菌株在MHIIB中和HKAB-1菌株在牛血清白蛋白(血清)中的生长曲线使用改良Gompertz生长模型拟合,而ATCC19606在牛血清白蛋白中的生长曲线使用无ymax的Baranyi和Roberts生长模型拟合。阴影区域表示通过自举法获得的95%置信区间。
(E) 在30℃和37℃下使用结晶紫染色量化的鲍曼不动杆菌菌株形成的生物膜生物量。数据代表个体生物学重复(黑色圆点)和至少三个独立生物学实验的均值±标准误差(SEM)。统计分析使用非配对Student’s t检验进行,必要时使用Welch校正以处理不等方差。


图2 鲍曼不动杆菌实验室菌株ATCC 19606和临床分离株HKAB-1的干燥耐受性和运动性表型

(A-B) 通过在琼脂-塑料界面接种细菌细胞,使用聚苯乙烯培养皿评估抽搐运动性。孵育后用结晶紫染色抽搐区,并测量直径。
(C-D) 通过将细菌培养物点在半固体琼脂表面上评估群集运动性,随后测量群集区直径。
(B, D) 数据代表个体生物学重复(黑色圆点)和至少三个独立生物学实验的均值±标准误差(SEM)。统计分析使用非配对Student’s t检验确定。
(E) 鲍曼不动杆菌ATCC19606和HKAB-1菌株在20–25%相对湿度下的存活率。存活率表示为相对于第0天(设为100%)的菌落形成单位百分比。数据代表五个生物学重复(n = 5),误差条显示标准误差。统计显著性使用Tukey的诚实显著差异检验评估(*,p < 0.05;***,p < 0.005)。


图3

(A) 通过Proksee工具生成的HKAB-1草图基因组的圆形染色体图[35 Grant 2023],包括基因组注释和来自PHASTest的噬菌体[34 Wishart 2023]。
(B) 鲍曼不动杆菌HKAB-1和代表性不动杆菌菌株的核心基因组系统发育树。HKAB-1在鲍曼不动杆菌分支内聚类,与非鲍曼不动杆菌物种如A. pittii、A. junii和A. tandoii明显分离。


图4 鲍曼不动杆菌HKAB-1和ATCC19606中RND外排泵和毒力相关基因的基因表达分析

x轴上测试基因的ΔCT表示对照样本的计算ΔCT值。点和误差条分别代表n≥3个生物学重复的均值和标准误差(SEM)。显示的SEM是从整个数据集中获得的池估计值。由于所有样本大小相等,误差条长度相同。使用Tukey的HSD检验确定了若干具有高度显著差异的基因(p < 0.005)。
(A) HKAB-1中RND基因的表达水平。以ATCC19606的RND基因表达作为对照。使用ANOVA观察到基因和处理(HKAB-1)之间的显著交互作用[F(3, 12) = 396.70, p < 0.001;见材料与方法],表明在实验条件下RND基因的差异调控。值得注意的是,HKAB-1中adeB显著下调(ΔΔCT = -7.27 ± 0.21;折叠变化 = 0.0065)。
(B) HKAB-1(处理组)与ATCC19606(对照组)相比的生物膜和运动相关基因的表达水平。使用ANOVA观察到基因和处理之间的显著交互作用[F(7, 28) = 34.04, p < 0.001;见材料与方法],表明在测试条件下基因调控的差异。值得注意的是,HKAB-1中bap、pilA和pilO显著上调(bap: ΔΔCT = 3.03 ± 0.45;折叠变化 = 8.14;pilA: ΔΔCT = 5.54 ± 0.45;折叠变化 = 46.54;pilO: ΔΔCT = 2.42 ± 0.45;折叠变化 = 5.34)。
(C) HKAB-1生物膜(处理组)与浮游培养物(对照组)相比的生物膜相关基因的表达水平。使用ANOVA观察到基因和处理之间的显著交互作用[F(10, 40) = 125.67, p < 0.001;见材料与方法],表明在测试条件下基因调控的差异。值得注意的是,生物膜中adeB、adeG、bap、csuC、pilA和pilO显著上调(adeB: ΔΔCT = 7.88 ± 0.43;折叠变化 = 236.19;adeG: ΔΔCT = 7.54 ± 0.43;折叠变化 = 185.98;bap: ΔΔCT = 2.06 ± 0.43;折叠变化 = 4.17;basA: ΔΔCT = 6.05 ± 0.43;折叠变化 = 66.43;bfnL: ΔΔCT = 3.84 ± 0.43;折叠变化 = 14.33;pgaB: ΔΔCT = 5.55 ± 0.43;折叠变化 = 46.79;pilA: ΔΔCT = 2.73 ± 0.43;折叠变化 = 6.62;pilO: ΔΔCT = 3.77 ± 0.43;折叠变化 = 13.60)。
(D) 响应血清(处理组)的血红素获取和铁载体簇基因的表达水平。以MH2B中的基因表达作为对照。使用ANOVA观察到基因和处理之间的显著交互作用[F(4, 36) = 199.85, p < 0.001;见材料与方法],表明在测试条件下基因调控的差异。所有测试基因在血清暴露下显著上调(basA: ΔΔCT = 4.32 ± 0.42,折叠变化 = 19.96;bfnL: ΔΔCT = 6.05 ± 0.42,折叠变化 = 66.29;hemO: ΔΔCT = 9.13 ± 0.42,折叠变化 = 558.50;ACP71R_07005: ΔΔCT = 1.89 ± 0.42,折叠变化 = 3.71)。

L&G ROBO Global Robotics and Automation UCITS ETF

https://fundcentres.landg.com/en/fi/institutional/fund-centre/ETF/ROBO-Global-Robotics-and-Automation/#portfolioBreakdown

ETF Trading ID: IE00BMW3QX54
Basket Trade Date: 2025-08-25

Security Description ISIN Trading Currency Constituent Weight (Base)
FUJI CORP/AICHI NPV JP3809200003 JPY 0.0161
XPENG INC USD 0.00001 ADR US98422D1054 USD 0.0124
PTC INC USD 0.01 US69370C1009 USD 0.0145
YOKOGAWA ELECTRIC CORP NPV JP3955000009 JPY 0.0158
JENOPTIK AG NPV DE000A2NB601 EUR 0.0118
IPG PHOTONICS CORP USD 0.0001 US44980X1090 USD 0.0174
KRONES AG NPV DE0006335003 EUR 0.0125
TRIMBLE INC US8962391004 USD 0.0128
HIWIN TECHNOLOGIES CORP TWD 10.0 TW0002049004 TWD 0.0119
NABTESCO CORP NPV JP3651210001 JPY 0.0142
NVIDIA CORP USD 0.001 US67066G1040 USD 0.0154
QUALCOMM INC USD 0.0001 US7475251036 USD 0.0116
SAMSARA INC USD 0.0001 US79589L1061 USD 0.0098
SHENZHEN INOVANCE TECHNOLOG CNY 1.0 CNE100000V46 CNH 0.003
NOVANTA INC NPV CA67000B1040 USD 0.0155
ESTUN AUTOMATION CO LTD CNY 1.0 CNE100001X35 CNH 0.0043
XIAOMI CORP USD 0.000003 144A KYG9830T1067 HKD 0.0114
AMBARELLA INC USD 0.0005 KYG037AX1015 USD 0.0189
CADENCE DESIGN SYS INC USD 0.01 US1273871087 USD 0.0134
MICROCHIP TECHNOLOGY INC USD 0.001 US5950171042 USD 0.0102
NORDSON CORP NPV US6556631025 USD 0.0136
KARDEX HOLDING AG CHF 0.45 CH0100837282 CHF 0.0192
DAIHEN CORP NPV JP3497800007 JPY 0.0113
SHIBAURA M NPV JP3592600005 JPY 0.0105
SYMBOTIC INC USD 0.0001 US87151X1019 USD 0.0209
HIAB OYJ NPV FI4000571013 EUR 0.012
KALMAR OYJ NPV FI4000571054 EUR 0.0141
JOBY AVIATION INC USD 0.0001 KYG651631007 USD 0.0179
AUTODESK I COM USD0.01 US0527691069 USD 0.0115
SIEMENS AG NPV DE0007236101 EUR 0.0114
TESLA INC USD 0.001 US88160R1014 USD 0.0101
SMC CORP NPV JP3162600005 JPY 0.0114
SERVE ROBOTICS INC USD 0.0001 US81758H1068 USD 0.0086
STRATASYS LTD USD 0.0100 IL0011267213 USD 0.0128
EMERSON EL COM USD0.50 US2910111044 USD 0.0145
ILLUMINA INC USD 0.01 US4523271090 USD 0.0162
AZENTA INC US1143401024 USD 0.0118
INTUITIVE SURGICAL INC USD 0.001 US46120E6023 USD 0.0136
JBT MAREL CORP USD 0.01 US4778391049 USD 0.0154
DUERR AG NPV DE0005565204 EUR 0.0108
HARMONIC DRIVE SYSTEMS INC NPV JP3765150002 JPY 0.0122
DAIFUKU CO LTD NPV JP3497400006 JPY 0.0169
HEXAGON AB EUR 0.22 SE0015961909 SEK 0.011
ATS CORP CDA NPV CA00217Y1043 CAD 0.0123
APTIV PLC USD 0.01 JE00BTDN8H13 USD 0.0108
DEERE + CO USD 1.0 US2441991054 USD 0.0113
FANUC CORP NPV JP3802400006 JPY 0.0184
HON HAI PRECISION INDUSTRY TWD 10.0 TW0002317005 TWD 0.0168
MITSUBISHI ELECTRIC CORP NPV JP3902400005 JPY 0.0141
TERADYNE INC USD 0.125 US8807701029 USD 0.0197
ELEKTA AB SEK 0.5 SE0000163628 SEK 0.0095
THK CO LTD NPV JP3539250005 JPY 0.0112
YASKAWA EL NPV JP3932000007 JPY 0.0125
AUTOSTORE HOLDINGS LT USD 0.01 144A BMG0670A1099 NOK 0.0196
RENISHAW PLC 20P GB0007323586 GBP 0.0148
GXO LOGISTICS INC USD 0.01 US36262G1013 USD 0.0117
GLOBUS MED INC USD 0.001 US3795772082 USD 0.0114
COGNEX CORP USD 0.002 US1924221039 USD 0.0158
MANHATTAN ASSOCS INC USD 0.01 US5627501092 USD 0.0135
ADVANTECH CO LTD TWD 10.0 TW0002395001 TWD 0.0105
DELTA ELECTRONICS INC TWD 10.0 TW0002308004 TWD 0.0169
OMRON CORP NPV JP3197800000 JPY 0.0121
ROCKWELL AUTOMATION INC USD 1.0 US7739031091 USD 0.0166
SERVICENOW INC USD 0.001 US81762P1021 USD 0.0082
CELESTICA INC NPV CA15101Q2071 CAD 0.0204
AIRTAC INTERNATIONAL GROUP TWD 10.0 KYG014081064 TWD 0.0117
KION GROUP AG EUR 1.0 DE000KGX8881 EUR 0.0125
HAN S LASER TECHNOLOGY INDU CNY 1.0 CNE000001JQ1 CNH 0.0051
GEA GROUP AG NPV RFD DE0006602006 EUR 0.0148
SCHNEIDER ELECTRIC SE EUR 4.0 FR0000121972 EUR 0.0118
KEYENCE CO NPV JP3236200006 JPY 0.0126
ZEBRA TECHNOLOGIES CORP USD 0.01 US9892071054 USD 0.014
KOH YOUNG TECHNOLOGY INC KRW 100.0 KR7098460009 KRW 0.0112
TOYOTA IND NPV JP3634600005 JPY 0.0114
ABB LTD CHF 0.12 CH0012221716 CHF 0.0145
RASPBERRY PI HOLDINGS PLC 0.25P GB00BS3DYQ52 GBP 0.0081

Cash Component: Balancing number calculated as “1 minus the sum of constituent weights.”

Basket Client Disclaimer:
The weightings and holdings of the ETF may differ from time to time. Legal & General UCITS ETF PLC funds receive the calculation of this data from third parties. Neither the provider of this PCF nor Legal & General UCITS ETF PLC make any representation or warranty, regardless of the formats in which the PCF is provided to you, as to the accuracy of the information and shall not be liable for any damages resulting from the use of such information or any error in its calculation.

Human RNA-seq processing for Data_Ben_RNAseq_2025

Related posts:

http://xgenes.com/article/article-content/242/rna-seq-data-analysis-of-yersinia-on-grch38/

http://xgenes.com/article/article-content/209/rna-seq-skin-organoids-on-grch38-chrhsv1-final/

  1. Create raw_data

    mkdir raw_data; cd raw_data
    
    ln -s ../20250805_AV243904_0023_A/1_Palpha_2_5h_418_3/1_Palpha_2_5h_418_3_R1.fastq.gz Palpha_2_5h_3_R1.fastq.gz
    ln -s ../20250805_AV243904_0023_A/1_Palpha_2_5h_418_3/1_Palpha_2_5h_418_3_R2.fastq.gz Palpha_2_5h_3_R2.fastq.gz
    ln -s ../20250805_AV243904_0023_A/1_Palpha_2_5h_418_4/1_Palpha_2_5h_418_4_R1.fastq.gz Palpha_2_5h_4_R1.fastq.gz
    ln -s ../20250805_AV243904_0023_A/1_Palpha_2_5h_418_4/1_Palpha_2_5h_418_4_R2.fastq.gz Palpha_2_5h_4_R2.fastq.gz
    ln -s ../20250805_AV243904_0023_A/2_SA_2_5h_418_3/2_SA_2_5h_418_3_R1.fastq.gz SA_2_5h_3_R1.fastq.gz
    ln -s ../20250805_AV243904_0023_A/2_SA_2_5h_418_3/2_SA_2_5h_418_3_R2.fastq.gz SA_2_5h_3_R2.fastq.gz
    ln -s ../20250805_AV243904_0023_A/2_SA_2_5h_418_4/2_SA_2_5h_418_4_R1.fastq.gz SA_2_5h_4_R1.fastq.gz
    ln -s ../20250805_AV243904_0023_A/2_SA_2_5h_418_4/2_SA_2_5h_418_4_R2.fastq.gz SA_2_5h_4_R2.fastq.gz
    ln -s ../20250805_AV243904_0023_A/3_Pminus_2_5h_418_3/3_Pminus_2_5h_418_3_R1.fastq.gz Pminus_2_5h_3_R1.fastq.gz
    ln -s ../20250805_AV243904_0023_A/3_Pminus_2_5h_418_3/3_Pminus_2_5h_418_3_R2.fastq.gz Pminus_2_5h_3_R2.fastq.gz
    ln -s ../20250805_AV243904_0023_A/3_Pminus_2_5h_418_4/3_Pminus_2_5h_418_4_R1.fastq.gz Pminus_2_5h_4_R1.fastq.gz
    ln -s ../20250805_AV243904_0023_A/3_Pminus_2_5h_418_4/3_Pminus_2_5h_418_4_R2.fastq.gz Pminus_2_5h_4_R2.fastq.gz
    
    ln -s ../20250805_AV243904_0023_A/4_Palpha_5h_418_3/4_Palpha_5h_418_3_R1.fastq.gz Palpha_5h_3_R1.fastq.gz
    ln -s ../20250805_AV243904_0023_A/4_Palpha_5h_418_3/4_Palpha_5h_418_3_R2.fastq.gz Palpha_5h_3_R2.fastq.gz
    ln -s ../20250805_AV243904_0023_A/4_Palpha_5h_418_4/4_Palpha_5h_418_4_R1.fastq.gz Palpha_5h_4_R1.fastq.gz
    ln -s ../20250805_AV243904_0023_A/4_Palpha_5h_418_4/4_Palpha_5h_418_4_R2.fastq.gz Palpha_5h_4_R2.fastq.gz
    ln -s ../20250805_AV243904_0023_A/5_SA_5h_418_3/5_SA_5h_418_3_R1.fastq.gz SA_5h_3_R1.fastq.gz
    ln -s ../20250805_AV243904_0023_A/5_SA_5h_418_3/5_SA_5h_418_3_R2.fastq.gz SA_5h_3_R2.fastq.gz
    ln -s ../20250805_AV243904_0023_A/5_SA_5h_418_4/5_SA_5h_418_4_R1.fastq.gz SA_5h_4_R1.fastq.gz
    ln -s ../20250805_AV243904_0023_A/5_SA_5h_418_4/5_SA_5h_418_4_R2.fastq.gz SA_5h_4_R2.fastq.gz
    ln -s ../20250805_AV243904_0023_A/6_Pminus_5h_418_3/6_Pminus_5h_418_3_R1.fastq.gz Pminus_5h_3_R1.fastq.gz
    ln -s ../20250805_AV243904_0023_A/6_Pminus_5h_418_3/6_Pminus_5h_418_3_R2.fastq.gz Pminus_5h_3_R2.fastq.gz
    ln -s ../20250805_AV243904_0023_A/6_Pminus_5h_418_4/6_Pminus_5h_418_4_R1.fastq.gz Pminus_5h_4_R1.fastq.gz
    ln -s ../20250805_AV243904_0023_A/6_Pminus_5h_418_4/6_Pminus_5h_418_4_R2.fastq.gz Pminus_5h_4_R2.fastq.gz
    
    ln -s ../20250805_AV243904_0023_A/7_uninf_5h_418_3/7_uninf_5h_418_3_R1.fastq.gz uninf_5h_3_R1.fastq.gz
    ln -s ../20250805_AV243904_0023_A/7_uninf_5h_418_3/7_uninf_5h_418_3_R2.fastq.gz uninf_5h_3_R2.fastq.gz
    ln -s ../20250805_AV243904_0023_A/7_uninf_5h_418_4/7_uninf_5h_418_4_R1.fastq.gz uninf_5h_4_R1.fastq.gz
    ln -s ../20250805_AV243904_0023_A/7_uninf_5h_418_4/7_uninf_5h_418_4_R2.fastq.gz uninf_5h_4_R2.fastq.gz
    
    mkdir trimmed trimmed_unpaired;
    for sample_id in Palpha_2_5h_3 Palpha_2_5h_4 SA_2_5h_3 SA_2_5h_4 Pminus_2_5h_3 Pminus_2_5h_4 Palpha_5h_3 Palpha_5h_4 SA_5h_3 SA_5h_4 Pminus_5h_3 Pminus_5h_4 uninf_5h_3 uninf_5h_4; do
            java -jar /home/jhuang/Tools/Trimmomatic-0.36/trimmomatic-0.36.jar PE -threads 100 raw_data/${sample_id}_R1.fastq.gz raw_data/${sample_id}_R2.fastq.gz trimmed/${sample_id}_R1.fastq.gz trimmed_unpaired/${sample_id}_R1.fastq.gz trimmed/${sample_id}_R2.fastq.gz trimmed_unpaired/${sample_id}_R2.fastq.gz ILLUMINACLIP:/home/jhuang/Tools/Trimmomatic-0.36/adapters/TruSeq3-PE-2.fa:2:30:10:8:TRUE LEADING:3 TRAILING:3 SLIDINGWINDOW:4:15 MINLEN:36 AVGQUAL:20; done 2> trimmomatic_pe.log;
    done
    mv trimmed/*.fastq.gz .
  2. Create samplesheet.csv

    sample,fastq_1,fastq_2,strandedness
    Palpha_2_5h_3,Palpha_2_5h_3_R1.fastq.gz,Palpha_2_5h_3_R2.fastq.gz,auto
    Palpha_2_5h_4,Palpha_2_5h_4_R1.fastq.gz,Palpha_2_5h_4_R2.fastq.gz,auto
    SA_2_5h_3,SA_2_5h_3_R1.fastq.gz,SA_2_5h_3_R2.fastq.gz,auto
    SA_2_5h_4,SA_2_5h_4_R1.fastq.gz,SA_2_5h_4_R2.fastq.gz,auto
    ...
  3. Run nextflow

    ln -s ~/Tools/nf-core-rnaseq-3.12.0/ rnaseq
    #Adapt the genome path in ~/Tools/nf-core-rnaseq-3.12.0/conf/igenomes.config
    #Note that the current path is "/mnt/nvme1n1p1/Homo_sapiens/Ensembl/GRCh38/..."
    
    #---- SUCCESSFUL -----
    (host_env) /usr/local/bin/nextflow run rnaseq/main.nf --input samplesheet.csv --outdir results    --genome GRCh38         -profile docker -resume  --max_cpus 60 --max_memory 512.GB --max_time 2400.h --save_reference --aligner star_salmon  --skip_deseq2_qc --skip_fastqc
  4. Import data and construct DESeqDataSet object

    # Import the required libraries
    library("AnnotationDbi")
    library("clusterProfiler")
    library("ReactomePA")
    library(gplots)
    library(tximport)
    library(DESeq2)
    library("org.Hs.eg.db")
    library(dplyr)
    library(tidyverse)
    setwd("~/DATA/Data_Ben_RNAseq_2025/results/star_salmon")
    # Define paths to your Salmon output quantification files
    files <- c("Palpha_2_5h_r3" = "./Palpha_2_5h_3/quant.sf",
            "Palpha_2_5h_r4" = "./Palpha_2_5h_4/quant.sf",
            "SA_2_5h_r3" = "./SA_2_5h_3/quant.sf",
            "SA_2_5h_r4" = "./SA_2_5h_4/quant.sf",
            "Pminus_2_5h_r3" = "./Pminus_2_5h_3/quant.sf",
            "Pminus_2_5h_r4" = "./Pminus_2_5h_4/quant.sf",
            "Palpha_5h_r3" = "./Palpha_5h_3/quant.sf",
            "Palpha_5h_r4" = "./Palpha_5h_4/quant.sf",
            "SA_5h_r3" = "./SA_5h_3/quant.sf",
            "SA_5h_r4" = "./SA_5h_4/quant.sf",
            "Pminus_5h_r3" = "./Pminus_5h_3/quant.sf",
            "Pminus_5h_r4" = "./Pminus_5h_4/quant.sf",
            "uninf_5h_r3" = "./uninf_5h_3/quant.sf",
            "uninf_5h_r4" = "./uninf_5h_4/quant.sf")
    # Import the transcript abundance data with tximport
    txi <- tximport(files, type = "salmon", txIn = TRUE, txOut = TRUE)
    # Define the replicates and condition of the samples
    replicate <- factor(c("r3", "r4", "r3", "r4", "r3", "r4", "r3", "r4", "r3", "r4", "r3", "r4", "r3", "r4"))
    condition <- factor(c("Palpha_2_5h","Palpha_2_5h","SA_2_5h","SA_2_5h","Pminus_2_5h","Pminus_2_5h",    "Palpha_5h","Palpha_5h","SA_5h","SA_5h","Pminus_5h","Pminus_5h",    "uninf_5h","uninf_5h"))
    
    # Define the colData for DESeq2
    colData <- data.frame(condition=condition, replicate=replicate, row.names=names(files))
    # -- transcript-level count data (x2) --
    # Create DESeqDataSet object
    dds <- DESeqDataSetFromTximport(txi, colData=colData, design=~condition)
    write.csv(counts(dds), file="transcript_counts.csv")
    
    # -- gene-level count data (x2) --
    # Read in the tx2gene map from salmon_tx2gene.tsv
    tx2gene <- read.table("salmon_tx2gene.tsv", header=FALSE, stringsAsFactors=FALSE)
    # Set the column names
    colnames(tx2gene) <- c("transcript_id", "gene_id", "gene_name")
    # Remove the gene_name column if not needed
    tx2gene <- tx2gene[,1:2]
    # Import and summarize the Salmon data with tximport
    txi <- tximport(files, type = "salmon", tx2gene = tx2gene, txOut = FALSE)
    # Continue with the DESeq2 workflow as before...
    colData <- data.frame(condition=condition, replicate=replicate, row.names=names(files))
    dds <- DESeqDataSetFromTximport(txi, colData=colData, design=~condition)
    #dds <- dds[rowSums(counts(dds) > 3) > 2, ]    #60605-->26543
    write.csv(counts(dds, normalized=FALSE), file="gene_counts.csv")
    
    d.raw <- read.csv("gene_counts.csv", header=TRUE, row.names=1)
    dds <- DESeqDataSetFromMatrix(countData=d.raw, colData=colData, design=~condition+replicate)
    #dds <- DESeqDataSetFromMatrix(countData=d.raw, colData=colData, design=~condition)
    dim(counts(dds))
    head(counts(dds), 10)
    rld <- rlogTransformation(dds)
    
    #We don't need to run DESeq(dds) before estimateSizeFactors(dds). In fact, the typical workflow in DESeq2 is the opposite: we usually run estimateSizeFactors(dds) (and other preprocessing functions) before running the main DESeq(dds) function.
    #The estimateSizeFactors function is used to calculate size factors for normalization, which corrects for differences in library size (i.e., the number of read counts) between samples. This normalization step is crucial to ensure that differences in gene expression aren't merely due to differences in sequencing depth between samples.
    #The DESeq function, on the other hand, performs the main differential expression analysis, comparing gene expression between different conditions or groups.
    #So, the typical workflow is:
    #  - Create the DESeqDataSet object.
    #  - Use estimateSizeFactors to normalize for library size.
    #  - (Optionally, estimate dispersion with estimateDispersions if not using the full DESeq function later.)
    #  - Use DESeq for the differential expression analysis.
    #  - However, it's worth noting that if you run the main DESeq function directly after creating the DESeqDataSet object, it will automatically perform the normalization (using estimateSizeFactors) and dispersion estimation steps for you. In that case, there's no need to run estimateSizeFactors separately before DESeq.
    
    # draw simple pca and heatmap
    library(gplots)
    library("RColorBrewer")
    mat <- assay(rld)
    mm <- model.matrix(~condition, colData(rld))
    mat <- limma::removeBatchEffect(mat, batch=rld$replicate, design=mm)
    assay(rld) <- mat
    # -- pca --
    png("pca.png", 1200, 800)
    plotPCA(rld, intgroup=c("condition"))
    dev.off()
    png("pca_rep.png", 1200, 800)
    plotPCA(rld, intgroup=c("replicate"))
    dev.off()
    # -- heatmap --
    png("heatmap.png", 1200, 800)
    distsRL <- dist(t(assay(rld)))
    mat <- as.matrix(distsRL)
    hc <- hclust(distsRL)
    hmcol <- colorRampPalette(brewer.pal(9,"GnBu"))(100)
    heatmap.2(mat, Rowv=as.dendrogram(hc),symm=TRUE, trace="none",col = rev(hmcol), margin=c(13, 13))
    dev.off()
  5. (Optional, possibly has error) Size Factors

    sizeFactors(dds)
    #NULL
    # Estimate size factors
    dds <- estimateSizeFactors(dds)
    # Estimate dispersions
    dds <- estimateDispersions(dds)
  6. Select the differentially expressed genes

    #CONSOLE: mkdir degenes
    setwd("/mnt/md1/DATA/Data_Ben_RNAseq_2025/results/star_salmon/degenes")
    
    dds$condition <- relevel(dds$condition, "SA_2_5h")
    dds = DESeq(dds, betaPrior=FALSE)
    resultsNames(dds)
    clist <- c("Palpha_2_5h_vs_SA_2_5h")
    
    dds$condition <- relevel(dds$condition, "SA_5h")
    dds = DESeq(dds, betaPrior=FALSE)
    resultsNames(dds)
    clist <- c("Palpha_5h_vs_SA_5h")
    
    dds$condition <- relevel(dds$condition, "Pminus_2_5h")
    dds = DESeq(dds, betaPrior=FALSE)
    resultsNames(dds)
    clist <- c("Palpha_2_5h_vs_Pminus_2_5h", "SA_2_5h_vs_Pminus_2_5h")
    
    dds$condition <- relevel(dds$condition, "Pminus_5h")
    dds = DESeq(dds, betaPrior=FALSE)
    resultsNames(dds)
    clist <- c("Palpha_5h_vs_Pminus_5h", "SA_5h_vs_Pminus_5h")
    
    #dds$condition <- relevel(dds$condition, "uninf_2_5h")
    #dds = DESeq(dds, betaPrior=FALSE)
    #resultsNames(dds)
    #clist <- c("Palpha_2_5h_vs_uninf_2_5h", "SA_2_5h_vs_uninf_2_5h", "Pminus_2_5h_vs_uninf_2_5h")
    
    dds$condition <- relevel(dds$condition, "uninf_5h")
    dds = DESeq(dds, betaPrior=FALSE)
    resultsNames(dds)
    clist <- c("Palpha_5h_vs_uninf_5h", "SA_5h_vs_uninf_5h", "Pminus_5h_vs_uninf_5h")
    
    library(biomaRt)
    listEnsembl()
    listMarts()
    #--> total 69, 27  GRCh38.p7 and 39  GRCm38.p4
    ensembl <- useEnsembl(biomart = "ensembl", dataset = "hsapiens_gene_ensembl", version="104")
    datasets <- listDatasets(ensembl)
    
    for (i in clist) {
        i<-clist[1]
        contrast = paste("condition", i, sep="_")
        res = results(dds, name=contrast)
        res <- res[!is.na(res$log2FoldChange),]
        res_df <- as.data.frame(res)
        write.csv(as.data.frame(res_df[order(res_df$pvalue),]), file = paste(i, "all.txt", sep="-"))
        up <- subset(res_df, padj<=0.05 & log2FoldChange>=2)
        down <- subset(res_df, padj<=0.05 & log2FoldChange<=-2)
        write.csv(as.data.frame(up[order(up$log2FoldChange,decreasing=TRUE),]), file = paste(i, "up.txt", sep="-"))
        write.csv(as.data.frame(down[order(abs(down$log2FoldChange),decreasing=TRUE),]), file = paste(i, "down.txt", sep="-"))
    }
    
    # -- Save annotated DEGs: annotate human genes 'geness_res', note that the virus genes in that is ignored in the process since they are not in the database --
    for (i in clist) {
        #i<-clist[1]
        contrast = paste("condition", i, sep="_")
        res = results(dds, name=contrast)
        res <- res[!is.na(res$log2FoldChange),]
        #geness <- AnnotationDbi::select(edb86, keys = rownames(res), keytype = "GENEID", columns = c("ENTREZID","EXONID","GENEBIOTYPE","GENEID","GENENAME","PROTEINDOMAINSOURCE","PROTEINID","SEQNAME","SEQSTRAND","SYMBOL","TXBIOTYPE","TXID","TXNAME","UNIPROTID"))
        #geness <- AnnotationDbi::select(edb86, keys = rownames(res), keytype = "GENEID", columns = c("GENEID", "ENTREZID", "SYMBOL", "GENENAME","GENEBIOTYPE","TXBIOTYPE","SEQSTRAND","UNIPROTID"))
        # In the ENSEMBL-database, GENEID is ENSEMBL-ID.
        #geness <- AnnotationDbi::select(edb86, keys = rownames(res), keytype = "GENEID", columns = c("GENEID", "SYMBOL", "GENEBIOTYPE"))  #  "ENTREZID", "TXID","TXBIOTYPE","TXSEQSTART","TXSEQEND"
        #geness <- geness[!duplicated(geness$GENEID), ]
        #using getBM replacing AnnotationDbi::select
        #filters = 'ensembl_gene_id' means the records should always have a valid ensembl_gene_ids.
        geness <- getBM(attributes = c('ensembl_gene_id', 'external_gene_name', 'gene_biotype', 'entrezgene_id', 'chromosome_name', 'start_position', 'end_position', 'strand', 'description'),
            filters = 'ensembl_gene_id',
            values = rownames(res),
            mart = ensembl)
        geness_uniq <- distinct(geness, ensembl_gene_id, .keep_all= TRUE)
        #merge by column by common colunmn name, in the case "GENEID"
        res$ENSEMBL = rownames(res)
        identical(rownames(res), rownames(geness_uniq))
        res_df <- as.data.frame(res)
        geness_res <- merge(geness_uniq, res_df, by.x="ensembl_gene_id", by.y="ENSEMBL")
        dim(geness_res)
        rownames(geness_res) <- geness_res$ensembl_gene_id
        geness_res$ensembl_gene_id <- NULL
    
        df_sorted <- as.data.frame(geness_res[order(geness_res$padj),])
        write.csv(df_sorted, file = paste(i, "all_annotated.txt", sep="-"))
        up <- subset(df_sorted, padj<=0.05 & log2FoldChange>=2)
        down <- subset(df_sorted, padj<=0.05 & log2FoldChange<=-2)
        write.csv(as.data.frame(up[order(up$log2FoldChange,decreasing=TRUE),]), file = paste(i, "up_annotated.txt", sep="-"))
        write.csv(as.data.frame(down[order(abs(down$log2FoldChange),decreasing=TRUE),]), file = paste(i, "down_annotated.txt", sep="-"))
    }
    
    #Under KONSOLE
    for i in Palpha_2_5h_vs_Pminus_2_5h Palpha_2_5h_vs_SA_2_5h Palpha_5h_vs_Pminus_5h Palpha_5h_vs_SA_5h Palpha_5h_vs_uninf_5h Pminus_5h_vs_uninf_5h SA_2_5h_vs_Pminus_2_5h SA_5h_vs_Pminus_5h SA_5h_vs_uninf_5h; do echo "~/Tools/csv2xls-0.4/csv_to_xls.py ${i}-all_annotated.txt ${i}-up_annotated.txt ${i}-down_annotated.txt -d$',' -o ${i}.xls;"; done
  7. Generate volcano-plots including highlighting the pre-defined genes

    # -- Identify the Ensembl IDs for the genes mentioned in the provided text (TNF-Alpha, IKBK/CHUK, IKBKG, MAP3K7, MAPK9, MAPK10, MAPK11, MAPK12, MAPK13, MAPK14) --
    using reliable genomic databases. Then, I’ll integrate these IDs into the provided R code to mark these specific genes in green on the volcano plot. I’ll ensure the code remains functional and compatible with your requirements, maintaining the non-compressed volcano plot structure from the previous response.
    Step 1: Finding Ensembl IDs for the Genes
    The genes mentioned are part of the TNF-Alpha pathway and related signaling pathways (e.g., NF-κB and MAPK cascades). Below, I list each gene with its corresponding Ensembl ID, sourced from the Ensembl database (GRCh38/hg38 assembly, accessed via web resources like Ensembl.org and GeneCards).
    
    TNF-Alpha (TNF):
    
    Official gene symbol: TNF
    Ensembl ID: ENSG00000232810
    Description: Tumor necrosis factor, a cytokine involved in inflammation and immune response.
    
    IKBK/CHUK:
    
    Official gene symbol: CHUK (also known as IKK-alpha, IKK1)
    Ensembl ID: ENSG00000213341
    Description: Component of inhibitor of nuclear factor kappa B kinase complex, part of the IKK complex in NF-κB signaling.
    
    IKBKG:
    
    Official gene symbol: IKBKG (also known as NEMO, IKK-gamma)
    Ensembl ID: ENSG00000269335
    Description: Regulatory subunit of the IKK complex, critical for NF-κB activation.
    
    MAP3K7:
    
    Official gene symbol: MAP3K7 (also known as TAK1)
    Ensembl ID: ENSG00000135341
    Description: Mitogen-activated protein kinase kinase kinase 7, involved in MAPK and NF-κB pathways.
    
    MAPK9:
    
    Official gene symbol: MAPK9 (also known as JNK2)
    Ensembl ID: ENSG00000050748
    Description: Mitogen-activated protein kinase 9, part of the JNK signaling pathway.
    
    MAPK10:
    
    Official gene symbol: MAPK10 (also known as JNK3)
    Ensembl ID: ENSG00000109339
    Description: Mitogen-activated protein kinase 10, involved in JNK signaling.
    
    MAPK11:
    
    Official gene symbol: MAPK11 (also known as p38-beta)
    Ensembl ID: ENSG00000185386
    Description: Mitogen-activated protein kinase 11, part of the p38 MAPK pathway.
    
    MAPK12:
    
    Official gene symbol: MAPK12 (also known as p38-gamma)
    Ensembl ID: ENSG00000188130
    Description: Mitogen-activated protein kinase 12, involved in p38 MAPK signaling.
    
    MAPK13:
    
    Official gene symbol: MAPK13 (also known as p38-delta)
    Ensembl ID: ENSG00000156711
    Description: Mitogen-activated protein kinase 13, part of the p38 MAPK pathway.
    
    MAPK14:
    
    Official gene symbol: MAPK14 (also known as p38-alpha)
    Ensembl ID: ENSG00000112062
    Description: Mitogen-activated protein kinase 14, a key component of the p38 MAPK pathway.
    
    Note on IKBK: The text mentions “IKBK/CHUK,” which likely refers to CHUK (IKK-alpha). There is no gene explicitly named “IKBK” in standard databases, but it may be a typo or shorthand for IKBKB (IKK-beta, Ensembl ID: ENSG00000104365). Since the text explicitly lists CHUK, I include only CHUK here, but I can add IKBKB (ENSG00000104365) if you confirm it’s needed.
    
    #grep "ENSG00000232810" Palpha_5h_vs_SA_5h-all_annotated.txt
    #grep "ENSG00000213341" Palpha_5h_vs_SA_5h-all_annotated.txt
    #grep "ENSG00000269335" Palpha_5h_vs_SA_5h-all_annotated.txt
    #grep "ENSG00000135341" Palpha_5h_vs_SA_5h-all_annotated.txt
    #grep "ENSG00000050748" Palpha_5h_vs_SA_5h-all_annotated.txt
    #grep "ENSG00000109339" Palpha_5h_vs_SA_5h-all_annotated.txt
    #grep "ENSG00000185386" Palpha_5h_vs_SA_5h-all_annotated.txt
    #grep "ENSG00000188130" Palpha_5h_vs_SA_5h-all_annotated.txt
    #grep "ENSG00000156711" Palpha_5h_vs_SA_5h-all_annotated.txt
    #grep "ENSG00000112062" Palpha_5h_vs_SA_5h-all_annotated.txt
    #"ENSG00000232810","TNF","protein_coding",7124,"6",31575565,31578336,1,"tumor necrosis factor [Source:HGNC Symbol;Acc:HGNC:11892]",17354.5202707282,-0.0316703649357798,1.51550966895126,-0.0208975010748007,0.983327420043257,0.999911624451988
    #"ENSG00000213341","CHUK","protein_coding",1147,"10",100188300,100229596,-1,"component of inhibitor of nuclear factor kappa B kinase complex [Source:HGNC Symbol;Acc:HGNC:1974]",250.048543715369,0.0180137792628405,0.29151899644714,0.0617928144730933,0.950727825773712,0.999911624451988
    #"ENSG00000269335","IKBKG","protein_coding",8517,"X",154541199,154565046,1,"inhibitor of nuclear factor kappa B kinase regulatory subunit gamma [Source:HGNC Symbol;Acc:HGNC:5961]",264.16016859718,-0.0596284805706239,0.317465418784091,-0.187826695578385,0.851012508150622,0.999911624451988
    #"ENSG00000135341","MAP3K7","protein_coding",6885,"6",90513573,90587072,-1,"mitogen-activated protein kinase kinase kinase 7 [Source:HGNC Symbol;Acc:HGNC:6859]",469.168500006136,0.102648288503779,0.230048819356802,0.446202196519746,0.655451196420353,0.999911624451988
    #"ENSG00000050748","MAPK9","protein_coding",5601,"5",180233143,180292099,-1,"mitogen-activated protein kinase 9 [Source:HGNC Symbol;Acc:HGNC:6886]",249.338619945305,0.0631383542055737,0.2271647559144,0.2779408009461,0.781057802736406,0.999911624451988
    #"ENSG00000109339","MAPK10","protein_coding",5602,"4",85990007,86594625,-1,"mitogen-activated protein kinase 10 [Source:HGNC Symbol;Acc:HGNC:6872]",3.75355645627412,-2.0901236921552,2.18774228429073,-0.955379300004171,0.339385918189734,0.999911624451988
    #"ENSG00000185386","MAPK11","protein_coding",5600,"22",50263713,50270767,-1,"mitogen-activated protein kinase 11 [Source:HGNC Symbol;Acc:HGNC:6873]",8.66154083806627,-0.057183741613102,0.905513595426625,-0.0631506162932433,0.949646568726793,0.999911624451988
    #"ENSG00000188130","MAPK12","protein_coding",6300,"22",50245450,50261716,-1,"mitogen-activated protein kinase 12 [Source:HGNC Symbol;Acc:HGNC:6874]",11.0165465721666,-0.068123411110505,0.771289101509761,-0.0883240940098294,0.929619089537679,0.999911624451988
    #"ENSG00000156711","MAPK13","protein_coding",5603,"6",36127809,36144524,1,"mitogen-activated protein kinase 13 [Source:HGNC Symbol;Acc:HGNC:6875]",2429.62022870584,0.0304563554360708,0.161662995832214,0.188394105152429,0.850567720370941,0.999911624451988
    #"ENSG00000112062","MAPK14","protein_coding",1432,"6",36027677,36111236,1,"mitogen-activated protein kinase 14 [Source:HGNC Symbol;Acc:HGNC:6876]",571.205891076513,0.166160923432922,0.215977780993788,0.769342673437788,0.44168991057234,0.999911624451988
    
    # 批量火山图绘制脚本
    
    # 加载库
    library(ggplot2)
    library(ggrepel)
    
    # 预定义基因
    predefined_genes <- c("TNF", "CHUK", "IKBKG", "MAP3K7", "MAPK9",
                          "MAPK10", "MAPK11", "MAPK12", "MAPK13", "MAPK14")
    
    # 输入文件列表
    files <- c(
      "./Palpha_2_5h_vs_Pminus_2_5h-all_annotated.txt",
      "./Palpha_2_5h_vs_SA_2_5h-all_annotated.txt",
      "./Palpha_5h_vs_Pminus_5h-all_annotated.txt",
      "./Palpha_5h_vs_SA_5h-all_annotated.txt",
      "./Palpha_5h_vs_uninf_5h-all_annotated.txt",
      "./Pminus_5h_vs_uninf_5h-all_annotated.txt",
      "./SA_2_5h_vs_Pminus_2_5h-all_annotated.txt",
      "./SA_5h_vs_Pminus_5h-all_annotated.txt",
      "./SA_5h_vs_uninf_5h-all_annotated.txt"
    )
    
    # 循环绘制
    for (f in files) {
    
      # 读取数据
      geness_res <- read.csv(file = f, sep = ",", row.names = 1)
    
      # 颜色分类
      geness_res$Color <- ifelse(geness_res$padj > 0.05 | abs(geness_res$log2FoldChange) < 2, "gray",
                                ifelse(geness_res$log2FoldChange > 0, "red", "blue"))
    
      # 特定基因绿色
      geness_res$Color[geness_res$external_gene_name %in% predefined_genes] <- "green"
    
      # 点大小
      geness_res$PointSize <- ifelse(geness_res$external_gene_name %in% predefined_genes, 5, 3)
    
      # 排序选前50上下调
      geness_res$invert_Padj <- (-log10(geness_res$padj)) * sign(geness_res$log2FoldChange)
      top_g <- unique(c(
        geness_res[order(geness_res$invert_Padj, decreasing = TRUE), 'external_gene_name'][1:50],
        geness_res[order(geness_res$invert_Padj, decreasing = FALSE), 'external_gene_name'][1:50]
      ))
    
      # y轴刻度
      y_breaks <- seq(0, ceiling(max(-log10(geness_res$padj), na.rm = TRUE)), by = 5)
      y_labels <- y_breaks
    
      # 计算 -log10(padj)
      geness_res$adjusted_pvalue <- -log10(geness_res$padj)
    
      # 输出文件名
      out_png <- paste0(sub("-all_annotated.txt", "", basename(f)), ".png")
    
      # 绘图
      png(out_png, width = 1000, height = 1000)
      p <- ggplot(geness_res, aes(x = log2FoldChange, y = adjusted_pvalue,
                                  color = Color, size = PointSize, label = external_gene_name)) +
        geom_vline(xintercept = c(2, -2), lty = "dashed", size = 1.5) +
        geom_hline(yintercept = -log10(0.05), lty = "dashed", size = 1.5) +
        geom_point(data = subset(geness_res, !external_gene_name %in% predefined_genes), size = 3) +
        geom_point(data = subset(geness_res, external_gene_name %in% predefined_genes), size = 5) +
        labs(x = "log2(Fold change)", y = "-log10(P-adj)", color = "Significance") +
        scale_color_identity() +
        scale_size_identity() +
        geom_text_repel(
          data = subset(geness_res,
                        (external_gene_name %in% top_g & padj < 0.05 & abs(log2FoldChange) >= 2) |
                        external_gene_name %in% predefined_genes),
          size = 7,
          point.padding = 0.3,
          color = "black",
          min.segment.length = 0.1,
          box.padding = 0.3,
          max.overlaps = 20
        ) +
        theme_bw(base_size = 24) +
        theme(legend.position = "bottom") +
        scale_y_continuous(breaks = y_breaks, labels = y_labels)
    
      print(p)
      dev.off()
    
      message("图已生成: ", out_png)
    }
    
    # -- Alternative R Code (Using Ensembl IDs) --
    
    geness_res <- read.csv(file = "Pminus_5h_vs_uninf_5h-all_annotated.txt", sep=",", row.names=1)
    #geness_res <- df_sorted
    # Color setting
    geness_res$Color <- ifelse(geness_res$padj > 0.05 | abs(geness_res$log2FoldChange) < 2, "gray",
                            ifelse(geness_res$log2FoldChange > 0, "red", "blue"))
    # Predefined genes colored in green
    predefined_genes <- c("")
    geness_res$Color[geness_res$external_gene_name %in% predefined_genes] <- "green"
    geness_res$invert_Padj <- (-log10(geness_res$padj)) * sign(geness_res$log2FoldChange)
    top_g <- unique(c(geness_res[order(geness_res$invert_Padj, decreasing = TRUE), 'external_gene_name'][1:100],
                    geness_res[order(geness_res$invert_Padj, decreasing = FALSE), 'external_gene_name'][1:100]))
    
    # Calculate breaks for the y-axis based on the data
    y_breaks <- seq(0, ceiling(max(-log10(geness_res$padj), na.rm = TRUE)), by = 5)
    y_labels <- y_breaks
    
    # Use original -log10(padj) values without compression
    geness_res$adjusted_pvalue <- -log10(geness_res$padj)
    
    # Create the plot
    png(paste(i, "png", sep="."), width=1000, height=1000)
    ggplot(geness_res, aes(x = log2FoldChange, y = adjusted_pvalue, color = Color, label = external_gene_name)) +
      geom_vline(xintercept = c(2, -2), lty = "dashed", size = 1.5) +
      geom_hline(yintercept = -log10(0.05), lty = "dashed", size = 1.5) +
      geom_point(size = 3) +
      labs(x = "log2(Fold change)", y = "-log10(P-adj)", color = "Significance") +
      scale_color_identity() +
      geom_text_repel(data = subset(geness_res, external_gene_name %in% top_g & padj < 0.05 & (abs(log2FoldChange) >= 2)),
                      size = 7,
                      point.padding = 0.15,
                      color = "black",
                      min.segment.length = .1,
                      box.padding = .2,
                      lwd = 2) +
      theme_bw(base_size = 24) +
      theme(legend.position = "bottom") +
      scale_y_continuous(breaks = y_breaks, labels = y_labels)
    dev.off()

NCBI BioSample Submission Strategy for PJI and Nasal Microbiota Study

Which database for genome and epidome data

For NCBI submissions, whole genome sequencing (WGS) assemblies of your S. epidermidis PJI isolates should go to GenBank under the Genome database.
The raw sequencing reads for these isolates should go to the Sequence Read Archive (SRA).

Your epidome data (species-specific amplicon sequencing) is also acceptable for SRA submission.
When you upload, choose Library strategy = AMPLICON, and clearly specify the target gene in your metadata.
Both types of datasets should be linked under a single BioProject and corresponding BioSamples.


Do I need BioSamples for each patient and sample type?

Yes — for NCBI submissions, you must create a separate BioSample for each biological sample type you sequenced, even if they come from the same patient.

Key points:

  • BioProject: One per overall study (e.g., “Population structure and genomic features of Staphylococcus epidermidis from prosthetic joint infection and nasal microbiota”).
  • BioSamples: One per distinct biological sample.
    • Nasal swab (metagenomics) and PJI isolate from the same patient are two BioSamples.
    • Metagenomics and epidome (amplicon) from the same nasal swab can share a BioSample if they are truly from the same physical specimen.
  • Why separate?
    • Different source material → different metadata (host body site, isolation method, etc.).
    • Makes downstream searches, linking, and data reuse much cleaner.
  • Data linking:
    • Each BioSample can link to multiple datasets: SRA (raw reads), GenBank (assembly), amplicon reads.
    • All are tied together under one BioProject.

If needed, a custom NCBI BioSample metadata spreadsheet can be prepared so that nose WGS, nose epidome, and PJI isolate genomes are all neatly linked in one BioProject.


BioSample Submission Guidance

For each patient, you should create separate BioSample records for:

  • WGS of the nasal metagenomics sample
  • WGS of the PJI isolates
  • Amplicon sequencing (Epidome) of the nasal sample

This is because each dataset type (different source material, sequencing method, and library strategy) represents a distinct biological sample in NCBI’s schema.
Even if they come from the same patient, they are technically different samples with separate metadata and accession numbers.

Example:

  • Patient_1_nose_WGS
  • Patient_1_nose_epidome
  • Patient_1_PJI_WGS

Database Choice for Submission

  • Whole genome sequencing (Illumina + ONT):
    Submit assemblies to GenBank or RefSeq under your BioProject.

  • Amplicon sequencing (Epidome method):
    Submit raw reads to SRA under the same BioProject and BioSample, but with library_strategy = AMPLICON.
    You can also link these datasets to relevant BioSample records for nasal microbiome analysis.

足突(Podosome)、胞外囊泡(Extracellular Vesicle)与基质金属蛋白酶(MMPs)综合解析

足突(Podosome)

  • 定义:存在于巨噬细胞、树突状细胞和某些癌细胞中的富含肌动蛋白的黏附结构。
  • 功能:促进细胞迁移、黏附和基质降解,分泌MMPs以降解细胞外基质(ECM)。
  • 结构:由富含肌动蛋白的核心和环形黏附区构成。
  • 特点:动态性强,直接作用于细胞与基质接触点。

胞外囊泡(Extracellular Vesicle)

  • 定义:细胞分泌到细胞外环境的膜包被结构,包括外泌体、微囊泡、凋亡小体。
  • 功能:细胞间信息传递,参与免疫调节、肿瘤进展、组织修复;可携带MMPs影响基质重塑。
  • 结构:脂双层膜包裹,内含蛋白质、脂质、核酸等多种分子。
  • 特点:稳定、可远距离运输信号。

足突 vs 胞外囊泡

  • 来源:足突是细胞内结构延伸;胞外囊泡是细胞分泌物。
  • 作用范围:足突作用于局部接触,胞外囊泡进行远距离信号传递。
  • 组成:足突以细胞骨架蛋白为主;胞外囊泡含多种生物分子。
  • 动态性:足突短暂且快速重塑;胞外囊泡存活期长。

基质金属蛋白酶(MMPs)

  • 定义:锌离子依赖的内肽酶,分解ECM蛋白成分。
  • 分类:胶原酶(MMP-1, MMP-8, MMP-13)、明胶酶(MMP-2, MMP-9)、基质溶酶(MMP-3, MMP-10)等。
  • 功能
    • 组织重塑(如发育、伤口愈合)。
    • 病理降解(如肿瘤侵袭、炎症)。
  • 调控:受TIMPs抑制,表达受细胞因子调控。
  • 来源:由多种细胞分泌,可通过足突或胞外囊泡运输。

基质(Extracellular Matrix, ECM)

  • 定义:细胞外的复杂网络结构,为细胞提供支撑和信号平台。
  • 组成:胶原、层黏连蛋白、纤维连接蛋白、糖胺聚糖、蛋白聚糖等。
  • 功能:结构支持、细胞黏附、信号传导、动态重塑。

足突是否会吞噬或排出细胞?

  • 足突不会直接吞噬或排出整个细胞。
  • 吞噬依赖于伪足或吞噬杯;排出依赖胞外囊泡。
  • 足突的作用主要是通过降解基质辅助细胞运动或吞噬的空间准备。

综合关系

  • 足突与MMPs:局部降解基质,促进侵袭或迁移。
  • 胞外囊泡与MMPs:远程传递基质降解信号。
  • 共同点:都与MMPs密切相关,但作用范围不同。

“吞噬杯” 的英文是 phagocytic cup

它指的是在 吞噬作用(phagocytosis) 过程中,细胞膜和肌动蛋白骨架向目标颗粒延伸并包围形成的半杯状结构,最终闭合形成吞噬小泡(phagosome)。

Risks of Rebooting into Rescue Mode

Since your website is still running correctly, it indicates that your server (IP: 85.90.244.31) is operational, and the issue is likely isolated to the SSH service (sshd) and/or the authentication system, which is preventing logins via SSH (kex_exchange_identification: read: Connection reset by peer) and Weblish (Login incorrect). The libcrypt.so.1 and libc6 errors from your Debian Buster-to-Bullseye upgrade attempt are likely causing these authentication issues. Booting into Linode’s Rescue Mode is a safe and standard recovery method, but I understand your concern about potential risks to the running server, especially since your website is still up. Below, I’ll address the risks of using Rescue Mode, provide steps to minimize disruption, and offer alternative approaches to fix the issue without immediately rebooting into Rescue Mode.

Risks of Rebooting into Rescue Mode

Rebooting into Rescue Mode involves temporarily shutting down your server and booting into a recovery environment (Finnix). Here are the potential risks and how to mitigate them:

  1. Temporary Downtime:
    • Risk: Rebooting will stop all running services (e.g., your website, hosted on Apache/Nginx), causing temporary downtime (typically a few minutes).
    • Mitigation: Schedule the reboot during a low-traffic period and notify users if possible. Since your website is running, the downtime should be brief, and services should restart automatically unless the system is severely broken.
  2. Failure to Reboot Normally:
    • Risk: If the libc6 or libcrypt.so.1 issues have corrupted critical system components, the server might not boot properly after exiting Rescue Mode.
    • Mitigation: Before rebooting, ensure you have a recent Linode backup (check the “Backups” tab in the Linode dashboard). Linode’s backups allow you to restore the server to a working state if the reboot fails. Also, follow the steps below to make minimal changes in Rescue Mode.
  3. Data Loss:
    • Risk: Incorrect commands in Rescue Mode (e.g., deleting critical files) could cause data loss.
    • Mitigation: Only run targeted commands (provided below) and avoid destructive actions like formatting disks. Back up critical files (e.g., /etc/ssh/sshd_config, /etc/passwd) before making changes.
  4. Website Configuration Issues:
    • Risk: If your website depends on specific configurations or services, changes in Rescue Mode might affect them.
    • Mitigation: Focus on fixing only the authentication and SSH issues (libc6, libcrypt1, sshd) without altering web server configurations (e.g., Apache/Nginx configs in /etc/nginx or /etc/apache2).

Given that your website is running, the server’s core functionality is intact, and the issue is likely specific to sshd and authentication libraries. Rescue Mode is still the safest way to fix this, as you can’t log in via Weblish or SSH, but I’ll also explore alternatives to avoid rebooting immediately.

Steps to Use Rescue Mode Safely

To minimize risks and restore SSH/Weblish access:

  1. Check for Backups:
    • In the Linode dashboard, go to the “Backups” tab and confirm you have a recent backup. If not, enable automatic backups or create a manual snapshot before proceeding.
  2. Notify Users (Optional):
    • If your website has users, consider posting a maintenance notice for a brief downtime window (5-10 minutes).
  3. Boot into Rescue Mode:
    • Log into cloud.linode.com, select your server, and go to the “Rescue” tab.
    • Click “Reboot into Rescue Mode”. This will shut down the server (stopping your website temporarily) and boot into Finnix.
  4. Open Weblish Console:
    • Once rebooted, open Weblish from the “Console” tab. You should see a Finnix prompt (root@finnix:~#).
  5. Mount the Filesystem:
    • List disks:
      
      lsblk

Identify your root partition (e.g., /dev/sda1).

Mount it: bashmount /dev/sda1 /mnt mount –bind /dev /mnt/dev mount –bind /proc /mnt/proc mount –bind /sys /mnt/sys If you have a separate /boot partition (e.g., /dev/sda2), mount it: bashmount /dev/sda2 /mnt/boot

Chroot into the Filesystem: bashchroot /mnt

Fix Authentication Issues:

Reset Root Password (to fix “Login incorrect”): bashpasswd Enter a new password. Fix libcrypt.so.1: bashwget http://deb.debian.org/debian/pool/main/libx/libxcrypt/libcrypt1_4.4.18-4_amd64.deb dpkg -i libcrypt1_4.4.18-4_amd64.deb

Fix libc6: bashwget http://deb.debian.org/debian/pool/main/g/glibc/libc6_2.31-13+deb11u10_amd64.deb dpkg -i libc6_2.31-13+deb11u10_amd64.deb

Repair Packages: bashdpkg –configure -a apt update apt install -f

Reinstall openssh-server: bashapt install –reinstall openssh-server

Verify SSH Configuration:

Check /etc/ssh/sshd_config: bashgrep PermitRootLogin /etc/ssh/sshd_config Ensure it’s set to: bashPermitRootLogin yes Edit with nano if needed. Test sshd: bash/usr/sbin/sshd -t

Exit and Reboot:

Exit chroot: bashexit

Unmount filesystems: bashumount /mnt/dev /mnt/proc /mnt/sys /mnt/boot /mnt Omit /mnt/boot if not mounted. In the Linode dashboard, reboot into normal mode.

Test Access:

Try Weblish with root and the new password. Test SSH: bashssh -v root@85.90.244.31

Check your website to ensure it’s back online.

Alternatives to Avoid Rebooting Immediately Since your website is running and you’re hesitant to reboot, here are alternative approaches to explore first:

Check Linode Support Ticket:

Since you’ve already opened a support ticket, check for updates. Linode support can often access your server or provide insights without requiring a reboot. Share that your website is still running to prioritize non-disruptive solutions.

Use Linode’s Lish via SSH:

Instead of Weblish, try accessing Lish via SSH from your local machine: bashssh -t your-linode-username>@lish-.linode.com Replace with your Linode account username, with your server’s region (e.g., frankfurt for 85.90.244.31), and with your server’s name. For example: bashssh -t user@lish-frankfurt.linode.com linode123456 This may bypass the “Login incorrect” issue if Weblish is misconfigured. If you get a prompt, try root and your password.

Inspect Running Services Remotely:

Since your website is running, check if you can access any alternative management interface (e.g., a web-based control panel like cPanel or a custom API). If you have a monitoring tool or secondary service (e.g., FTP), use it to gather more information about the server’s state.

Wait for Linode Support:

If downtime is a major concern, wait for Linode support to respond. They may be able to fix the issue without a reboot by accessing the server’s console directly or mounting the disk in a recovery environment.

Minimizing Risks

Backup First: Confirm you have a Linode backup or snapshot in the dashboard. This ensures you can restore the server if anything goes wrong. Test Website Post-Reboot: After fixing in Rescue Mode, check your website immediately to ensure the web server (e.g., Apache/Nginx) restarts correctly: bashsystemctl status apache2 # or nginx systemctl restart apache2 # or nginx

Targeted Fixes: Only modify authentication and SSH-related components (libc6, libcrypt1, sshd) to avoid affecting the web server. Monitor Logs: After regaining access, check /var/log/auth.log for SSH errors and /var/log/syslog for system issues: bashtail -f /var/log/auth.log tail -f /var/log/syslog

Why Rescue Mode Is Likely Necessary The libcrypt.so.1 and libc6 errors suggest a broken authentication system, which is why both SSH and Weblish logins are failing. Since your website is running, the web server process (likely not dependent on the broken libraries) is unaffected, but sshd and PAM (authentication) rely on libc6 and libcrypt1. Rescue Mode is the most reliable way to fix these without requiring normal login access. The downtime should be minimal (a few minutes), and with a backup, the risk of permanent issues is low. Next Steps

Confirm Backup: Check the “Backups” tab in Linode’s dashboard. Try Lish via SSH: Attempt the Lish SSH command above to see if you can log in without rebooting. Proceed with Rescue Mode: If Lish fails, schedule a brief maintenance window and follow the Rescue Mode steps. Update Support Ticket: Inform Linode that your website is running but SSH/Weblish are inaccessible. Share any new errors from Lish or Rescue Mode attempts.

If you try Rescue Mode or Lish and encounter specific errors (e.g., mount failures, apt errors), share the output, and I can provide precise guidance. Alternatively, if you prefer to wait for Linode support, let me know, and I can help craft a follow-up message to emphasize urgency while noting the website is still operational. Let me know how you’d like to proceed!