我的掙扎 與 TBtools 的開發(fā)
到底還是寫了一篇推文,卻著實(shí)想不到一個合適的題目??赡苓@是我寫過最長的一篇推文,約莫萬字。這篇推文的主要內(nèi)容應(yīng)該包括:
TBtools 開發(fā)為了什么?
TBtools 是怎么開發(fā)出來的?
TBtools 版本迭代歷史?
JIGplot <- JJplot2 <- JJplot 的迭代過程?
我是如何接觸生信的?
本碩博均是園藝果樹專業(yè),如何一步一步自學(xué)并入門生信。
一份生信編程入門書籍清單 和 社群與論壇推薦。
一些不堪回首的往事。
感謝陪伴我和幫助過我的人。
PS:推文在 TBtools 文稿 Online 前后,已經(jīng)基本成型。原定在期刊官方公號推文后再行推出,但一周以來,身邊和用戶朋友一再催促。也罷,推文也是我碩博生活至今小結(jié),就此推出,用互聯(lián)網(wǎng)幫我記住這些經(jīng)歷。
寫在前面
2020年06月22日,TBtools 終于還是發(fā)表在正式期刊(Molecular Plant)上。

這不僅僅是我一個人的開心,而是一小群人的快樂。這群人,或者對 TBtools 的開發(fā)極度支持,或者看著 TBtools 一步一步,一步又一步成長成現(xiàn)在模樣。五年有余,說長不長,可以覆蓋了一部分用戶的碩士博士階段。說短,其實(shí)也不短。軟件開發(fā)不同于濕實(shí)驗(yàn)開展,前者周期往往足夠短,甚至兩三個月可以完成和測試。文稿的撰寫到發(fā)表,從某個角度來說,是在用戶朋友和生信小圈子一些朋友的催促下完成??偟膩碚f,這應(yīng)也算一個工作的階段性成果,所以值得記錄一下。華南農(nóng)大園藝學(xué)院果樹系,本科 --> 碩士 --> 博士,Emmm,是我常常不務(wù)正業(yè)的十年。而我折騰的與生信擦邊的各項(xiàng),正好也是TBtools 的開發(fā)過程。以下,用相對碎片化的方式,整理一下這些那些我還記得的片段。
遇到了第一個生信坑
2014年前后,在碩士導(dǎo)師何業(yè)華教授的建議下,我們做了一個轉(zhuǎn)錄組項(xiàng)目。那個項(xiàng)目算是學(xué)院里面較早開展。導(dǎo)致這一項(xiàng)目數(shù)據(jù)沒有及時撰寫并發(fā)表成文的原因有很多。其中一點(diǎn)或許是,我從結(jié)題報告中看到,植物的測序數(shù)據(jù)卻可能含有真菌或其他微生物序列污染。那會年輕,過不了這道坎。于是還是決心,自己從原始數(shù)據(jù)開始,折騰這套污染了的數(shù)據(jù)?;蛟S也是這個原因,接觸生信至今,我始終保持警惕,確保避開可能的坑。
Emmm... 年代久遠(yuǎn)這套數(shù)據(jù),后來就打水漂了。想想還是有點(diǎn)對不起碩導(dǎo)。不過一起簽合同的其他項(xiàng)目,最后還是整理了并發(fā)了一個 PLOS One,似乎也還好。

我覺得我這些圖表,其實(shí)還做得不錯。這已經(jīng)是2016年的事情了。

合伙買了二手服務(wù)器
折騰數(shù)據(jù),必然是需要計算資源。正好那會浩哥(即 TBtools 論文二作)也計劃開始搞分析,于是我們二人合伙從淘寶搞了一個二手服務(wù)器。如果我沒記錯,加上我們自己買的民用硬盤和其他,大概也就五六千。配置是相對奇葩的狀態(tài),似乎是1T還是3T,內(nèi)存排滿72G,線程16個。那會這個配置其實(shí)可以滿足轉(zhuǎn)錄組數(shù)據(jù)分析的需求了,所以我們用得還是開心。

服務(wù)器的費(fèi)用是兩人各出一半,即每人3k左右。那會園藝學(xué)院碩士補(bǔ)助,多半是100~200。所以,或許很多人不知道 ,我出的這一半其實(shí)是我碩士三年的補(bǔ)助,或者說飯錢(估計浩哥也不知道 )。以至于,后來有那么大半個月,我其實(shí)是靠著我女朋友的飯卡吃飯的(沒有更好的方式)。
學(xué)習(xí)了 Perl 語言
解讀公司的結(jié)題報告,是一件麻煩的事情。2014年那會,其實(shí)做科研服務(wù)的公司很多,但都不太成熟 。公司返回的結(jié)果,往往是一些大文件或者大表格。整理起來比較麻煩。于是,多少學(xué)習(xí)編程語言成為必須。那會沒有太多糾結(jié),在浩哥的推薦下,我學(xué)起了perl。如果我沒有記錯,有那么一段時間,可能是個把月,我就只呆在宿舍,常常門也不出,等著其他人給我?guī)э?。我只是刷編程書(其?shí)后來我還看了不少perl相關(guān)電子書,不過大駱駝我是買的紙質(zhì)書),試試運(yùn)行代碼,反反復(fù)復(fù)。用perl寫了不少腳本,做了不少有趣的事情。我甚至只用 perl CGI 架了一個小網(wǎng)站,提供序列批量獲取和BLAST的功能(命名為xxxblast,對標(biāo) wwwblast;我沒有用框架,因?yàn)榇_實(shí)也不夠機(jī)智)。

我印象深刻的,或許還是寫出來的第一個我自認(rèn)為有用的腳本。那個腳本的功能非常簡單,批量提取Fasta序列。說起來還是有點(diǎn)搞笑(公眾號也曾提及),那天晚上我寫到凌晨三點(diǎn),終于認(rèn)為腳本穩(wěn)定且正確,具體邏輯是:
用一個腳本把原始的Fasta序列整理成一行ID一行序列的格式
使用另一個腳本讀取一個ID列表,然后遍歷1. 中格式化好的序列,匹配的輸出
這個功能的低能實(shí)現(xiàn),讓我興奮了好一會。
現(xiàn)在想想還是有趣,因?yàn)?Perl腳 本我早已不寫,而 Perl 只活在我的命令行里面。批量提起Fasta序列?我早已能夠隨手寫一行 perl 命令搞定。不僅僅是批量提取序列,甚至包括更為復(fù)雜的分析。
Emmm,回想起來,我甚至已經(jīng)忘了,到底那本 Perl入門經(jīng)典小駱駝,是浩哥的,還是我的。多半應(yīng)是他的,而我忘了也沒打算還他了。
學(xué)習(xí) Linux
那是一個寒假,我第一次沒有回家里過年。借了浩哥的一本《鳥哥的Linux私房菜》,硬是啃了一個星期(還是兩個星期?)??型昃驼垓v服務(wù)器,邊折騰邊重新啃,來來回回,應(yīng)是翻了不下三遍,書中也被我用鉛筆寫滿的標(biāo)注。也因此,我自認(rèn)為現(xiàn)在的 Linux 基礎(chǔ)起碼比不少自稱搞生信的要扎實(shí)一點(diǎn)。

當(dāng)然,這還得益于另外一些 Linux 操作相關(guān)書籍的閱讀。Linux的學(xué)習(xí),似乎主要還是對文件系統(tǒng)的了解。其次才是一些shell下的 工具或命令。由于我先學(xué)了 perl,所以更多工作我會寫 perl 單行來完成,而不會用 awk 或者 sed 等。說得自大一點(diǎn),我認(rèn)識的人里面,沒有一個 perl 單行寫得比我更好。一是我寫得早,二是我寫得久,三是我天天寫。
學(xué)習(xí) R 語言
Perl 學(xué)了,Linux 也基本掌握了,那么生信數(shù)據(jù)分析的文本處理,已經(jīng)基本得到解決??梢暬蔀楫?dāng)務(wù)之急。事實(shí)上,那會我和小庭子有大體的分工,我搞Perl,他學(xué)R語言,后面合伙就可以更快地做點(diǎn)事情。當(dāng)然,后來各自課題和生活上事情較多,我還是自己學(xué)了一下。提起R語言入門,我從來推薦《R語言初學(xué)者指南》。

Emmm,那么到底這本書是我的還是浩哥的,我還是忘記了。不過,可以認(rèn)為這本書確實(shí)是簡單??赐炅?,再看看 《ggplot2:數(shù)據(jù)分析與圖形藝術(shù)》,那么似乎真的沒什么統(tǒng)計圖表是不能在短時間內(nèi)完成的。后來我發(fā)現(xiàn),R語言真正方便的應(yīng)該是統(tǒng)計,而可視化是附加的事情。只能說生態(tài)賦予了R在統(tǒng)計可視化上的完美優(yōu)勢。

開發(fā)了密碼子偏好性分析流程 R2CUB
很少人知道我做過密碼子偏好性分析。因?yàn)槲业恼n題中并沒有這一部分,而那會只是一時興起。應(yīng)是研二研三了,我估摸著花了個把星期的時間,開發(fā)了一個流程。這個流程在數(shù)據(jù)分析上是純粹的 Perl 語言 naive 實(shí)現(xiàn),所以并沒有任何其他依賴,只需要電腦上安裝基礎(chǔ)版本的 Perl 語言解釋器即可。文檔,手冊等等,我也整理完善,甚至喊了其他朋友測試魯棒性。

是的,這是那會我把文章都寫了,最后似乎沒有投稿。DIAMOND,那會才剛剛出來,網(wǎng)絡(luò)上沒看到多少應(yīng)用(如果說看到廣泛使用的,那至少也一年后了)??赡芤彩俏矣玫迷?,所以對他當(dāng)時版本的局限有一定的了解。后面我再也沒有關(guān)注,主要還是用回 BLAST。分析結(jié)果出來的,RSCU 和 ENI 等數(shù)值計算出來了,那么可視化就用 R 腳本。

可以看到具體到科屬還是分得比較好的,單純只用RSCU做了一個聚類。其實(shí)這個流程還是不錯的。我曾經(jīng)在園藝學(xué)院生物技術(shù)所(現(xiàn)在似乎已經(jīng)改成其他名字了)組會上,開始分享進(jìn)展時,回車一鍵化流程,分享結(jié)束了,也就可以看結(jié)果(其實(shí)跑起來一個物種也就幾分鐘)。當(dāng)然,最后我并沒有從中看出有用的生物學(xué)意義 ,所以流程和文稿都打入冷宮,不再啟用。鼓搗了這個流程,我便意識到一個問題,即常規(guī)流程,命令行運(yùn)行,實(shí)在太麻煩。
學(xué)習(xí)界面化軟件開發(fā)
這里涉及到一個點(diǎn),為什么我一定要搞界面化軟件。前述已經(jīng)提及,碩士生活補(bǔ)助全部投到了服務(wù)器(換句話說,其實(shí)已經(jīng)不夠錢吃飯),所以在一段時間內(nèi),我做過一些現(xiàn)在看起來有點(diǎn)坑的業(yè)務(wù),比如代寫 Perl/R 腳本,五塊或者十塊錢一個,接了不少。而后來,接轉(zhuǎn)錄組測序數(shù)據(jù)分析業(yè)務(wù),才發(fā)現(xiàn)其實(shí)搞分析原來沒那么廉價。當(dāng)然,做這些事情,是其他更為艱難的生存無奈所迫,具體便不做開展?;氐街黝},了解我的人,知道我做買賣有兩個原則:
只賣我覺得好的東西
只賣給有需要的人
既然接了一些分析業(yè)務(wù),常常就會遇到客戶問題(當(dāng)然,自己分析結(jié)果自己課題組使用起來,也一樣)。其中最經(jīng)典的就是Fasta序列提取?,F(xiàn)在回想起來,我仍然想不明白,那會做生信擦邊課題的人真的很多,而搞科研服務(wù)的公司也有不少,為什么就沒有人做一個界面友好,功能實(shí)用的小軟件。僅僅是從轉(zhuǎn)錄組組裝結(jié)果中批量提取Fasta序列(如某幾個差異表達(dá)基因的序列),就必須要求客戶安裝 Perl 解釋器,然后用 perl 腳本....
于是,我還是決定下來寫界面化工具。我沒有記錯的話,那會我買了一本Java 入門書籍和一本 C++ 入門經(jīng)典教材。

翻了一天多Java,用notepad++,寫了簡單的界面化軟件,大體是一個sci-hub鏈接自動獲取的功能(Emmm,是的,沒有用IDE,這主要是我之前寫perl的習(xí)慣沒有調(diào)整過來;sci-hub在國內(nèi)似乎才剛剛興起,并不像現(xiàn)在這樣到處是文獻(xiàn)獲取神器)。

總體上,感覺寫Java代碼的效率明顯不如perl。于是,我又翻了兩天C++。

寫了幾個命令行小工具,卻沒有搞明白如何更好地打界面,尤其是打造跨平臺的界面化軟件(注意,我們永遠(yuǎn)無法確定用戶到底是Windows,MacOS,還是Linux)。在這樣的背景下,我又重新轉(zhuǎn)向Java,然后寫了一個簡單的序列提取工具,隨后釋放到網(wǎng)絡(luò)上。
那會可以釋放的地方極少,大體上就是:
bioinformatics*中國 QQ交流群
PLOB
沒有了。整體上,其實(shí)還得到不少有趣的評價。

界面非常簡單,Jar包是22Kb。不小也不大。
開發(fā)一點(diǎn)相對有用的工具
掌握了基本的界面化軟件開發(fā),我想到的第一件事就是如何更好地分發(fā)已有的教程或者簡便操作。在這段時間,我操作系統(tǒng)轉(zhuǎn)向ubuntu(Linux的一個發(fā)行版,這似乎是我第一次嘗試在工作中不使用windows)。用Java寫了一個感覺比較有趣的東西,大體就是可以方便地將任何命令行轉(zhuǎn)換成界面工具。比如,只要編寫一個配置文件,那么就可以把 BLAST 命令轉(zhuǎn)換成界面化工具

自動轉(zhuǎn)換界面

事實(shí)上,這個小工具可以認(rèn)為是簡單的插件化軟件開發(fā),或者是一個通用的界面化工具,比如我們只需要編寫簡單的配置文件,就可以把perl單行,一些命令行調(diào)用的工具,或者是 perl 和 R 畫圖腳本轉(zhuǎn)換成界面工具。

是的,我甚至還在一個服務(wù)器上部署了插件中心....

圖中一語成讖,后來,我碩士確實(shí)延期了一年,現(xiàn)在博士也延期了【微笑臉】^_^。
后來,就沒有后來了。EasyGUI 的這個工具無法很好地自動布局界面。另外實(shí)用性其實(shí)不太高,畢竟他只是一個純粹的自動界面化接口。
在這之前,有傳言 blast2go(一個強(qiáng)大且通用的GO注釋軟件)要開始收費(fèi),或者說不再提供免費(fèi)版本。我大體看了下 blast2go 的文章以及他所使用的數(shù)據(jù)庫,基本了解了主要邏輯后,自己寫了一個 perl 版本的 idmapping,功能即將NR等蛋白序列庫注釋轉(zhuǎn)換為GO注釋。事實(shí)上,用起來還是不錯。看著bioinformatics*群不時討論到GO注釋相關(guān)問題,一時興起,我又寫了一個 Java 界面化工具,并直接命名為 blast3go。

這個工具,還是比較有趣,GO注釋邏輯是自己實(shí)現(xiàn)。而富集分析以及可視化,使用的是 R 語言包,包括 GOstats 和 topGO (那會我還沒認(rèn)識大濕兄,也不知道 ClusterProfiler)。效果圖如下,

是的,打包的就是我自己寫好的腳本....我嘗試了幾乎所有可用的 java 和 R 語言交互接口,最后發(fā)現(xiàn)效果都不如直接調(diào)用 Rscript。這段經(jīng)歷,事實(shí)上也讓我徹底對打包 R 甚至使用 R 語言失去偏好。
認(rèn)識大佬,初識生信
上述,我提及數(shù)次,bioinformatics*中國 這一 QQ 社群。在那里,我認(rèn)識了一群人,真正意識到生物信息其實(shí)不是我認(rèn)知的樣子。他們之中,有專門做算法開發(fā)的,軟件設(shè)計的,流程部署的,科研應(yīng)用的。這些人,改變了我對生信的認(rèn)知,甚至是讓我真正明白,什么是生信入門。由于我個人相對積極地參與群里的交流討論,后來做了群管,并擔(dān)任了一屆群主(后來由于 TBtools 社群管理需要,屆滿我就退群了)。期間,我們在群里舉辦了兩三年每周 seminar,一次20期(可惜那會沒有做充分的錄屏)。四五年前的事情,我自認(rèn)為那至少是國內(nèi)最早開展的生信交流網(wǎng)絡(luò)直播。后面過了一些時日,才看到各類公司或者社群搞起類似的事情??偟膩碚f,我從其中學(xué)習(xí)了很多??上У氖牵@個社群那會早已滿2000人,所以對入群感興趣的,可能早就沒有機(jī)會(因?yàn)椋易约阂不夭蝗チ耍?。由于我們只想做精不想做大,所以清理人出群是我們的日常工作。這一習(xí)慣,現(xiàn)在沿襲到所有 TBtools使用交流群。

值得提的是,在這期間,我有幸在 Zinky (趙齊,現(xiàn)任職于中腫)的帶領(lǐng)下,蹭了中山大學(xué)任間教授課題組的兩三次組會。我也因此明白,其實(shí)生信軟件開發(fā),有非常多值得做的事情,而 Java 這門語言,似乎存在很大希望(雖然,五年后的今天,傳言他們已經(jīng)幾乎不再使用 Java 做界面化軟件開發(fā)了,可能 python+Qt?或者專注網(wǎng)頁工具)。

偶然合作,共同開發(fā) EasyCodeML
如果讓我一定要推薦質(zhì)量高的生信交流QQ社群的話,那么有且只有兩個:
bioinformatics*中國
生物軟件交流群
后者應(yīng)是福建農(nóng)林大學(xué)高芳鑾老師(Raindy)組建并后續(xù)由幾位大佬一起維護(hù)的QQ群。前者重點(diǎn)在大數(shù)據(jù),后者重點(diǎn)在群體演化以及傳統(tǒng)的生信數(shù)據(jù)分析。在一次偶然的討論中,Raindy 提到正選擇位點(diǎn)分析,是常見分析,但很多做進(jìn)化分析的朋友,卻常常搞不清楚如何操作,單純正確的分析邏輯,可能需要數(shù)周甚至上月入門。降低門檻,讓這類分析不再困難,于是他提出了 CodeML 分析的界面化可能。那會我正好沒有手上沒有更多值得開發(fā)的項(xiàng)目,也就一拍即合。當(dāng)然,后來的事情就顯得復(fù)雜。因?yàn)槲也]有進(jìn)化分析的背景,所以我們經(jīng)過了艱難的溝通,才勉強(qiáng)完成了第一個使用版本(圖示為最終版本,圖片來源:http://wap.sciencenet.cn/blog-460481-1163040.html?mobile=1)。

關(guān)于 EasyCodeML 的開發(fā),我其實(shí)測試了不少方法。單純在進(jìn)化樹可視化以及分支選擇上,我直接使用了 JavaScript 的 D3.js 庫,從零畫樹,并實(shí)現(xiàn)瀏覽器的交互。第一版 EasyCodeML,其實(shí)是 Java 同時打包一個 Chrome 的瀏覽器驅(qū)動,用戶進(jìn)行分支選取,其實(shí)是調(diào)用本地 Chrome,在網(wǎng)頁瀏覽器搞定。隨后才跳轉(zhuǎn)回 Java 界面??梢宰⒁獾剑?/p>
從交互的角度,R 語言出圖自然是不行的,那也沒什么合適的 R 語言進(jìn)化樹可視化包
從便利的角度來談,調(diào)用本地網(wǎng)頁瀏覽器,讓人很難受 。
當(dāng)然,這是最早期的版本....早已廢棄。我們合作的最新版本,在2018年已經(jīng)發(fā)表。這也是我第一篇共一以及共通訊的生信軟件類文章。
著手開發(fā)自己的繪圖引擎
在幾乎相同的時間上,由于課題的需要,我也受夠了 blast3go 的不實(shí)用性。開始了 BioCJava 項(xiàng)目,主要實(shí)現(xiàn)了序列批量提取和GO注釋,以及GO富集分析的功能(這個時候 ,富集分析已經(jīng)是我自己純粹的Java實(shí)現(xiàn),所以跟 R語言不再有交集)。
一方面EasyCodeML的進(jìn)化樹分支選取上需要更好地實(shí)現(xiàn),另一方面 BioCJava 項(xiàng)目只能做純粹的文本處理,實(shí)用性不高。似乎還是一個寒假,甚至又是過年在家的時候 ,我讀了《The Grammer of Graphics》這本書,重新理解了圖層語法。

那時的我,覺得圖層語法實(shí)在太流弊。Java也應(yīng)該有一個。于是我自己著手寫了 JJplot (參考R語言ggplot2的名字)。如果我沒記錯話,我為此還畫了一些UML,畢竟實(shí)現(xiàn)還是沒那么簡單。說是圖層語法,其實(shí)實(shí)現(xiàn)下來還是naive。不過足夠我用于完成 EasyCodeML 的進(jìn)化樹分支可視化選取 以及 GO Level 2 注釋可視化。
TBtools 開發(fā)伊始
所有的無奈,全部的認(rèn)知,讓我在 TBtools 的實(shí)現(xiàn),有更細(xì)致的思考。參考前述,一開始 TBtools 的名字是 BioCJava。但兩三次被認(rèn)為是 biojava 的界面打包后(不能怪別人看不到 CJ 二字,但實(shí)在不爽)我臨時決定修改程序名字為 TBtools,意指 Tools for Biologists。后來在大群釋放后 ,被傳布成了 Tao Bao tools,意思是?淘寶工具。嗯,多少可以蹭點(diǎn)淘寶熱度,其實(shí)也不錯。誤打誤撞,我也沒有再修改他的名字。
這是一個相對早期版本的 BioCJava,時間是 2015年08月31日(項(xiàng)目開始的一個月后)

注意到,這個時候 TBtools 的 Logo 已經(jīng)存在。這個 Logo 還是有點(diǎn)故事,主要貢獻(xiàn)的人是前述提到的女朋友,即借我飯卡,我白吃白喝了個把月的那個。也可以看到,BioCJava 只有三個基本功能,誰也不會想到,五年后的幾天,TBtools 界面上就是 140+ 個功能(更不提背后的 360+ 個命令行功能)。那會用戶其實(shí)非常少,應(yīng)不到10個人,主要還是找我?guī)兔Ψ治鰯?shù)據(jù)的老師或者課題組同學(xué)。
TBtools 開發(fā)第一年
在這個時間點(diǎn)上,我仍然還在大群(即 bioinformatics*中國)活躍。所以 TBtools 主要推廣還是在大群。基于群里的交流討論,我也不斷改進(jìn)和開發(fā) TBtools。

這已經(jīng)是開發(fā)約莫一年后的樣子。主要只是拓展了GO注釋,富集分析,以及GO層級統(tǒng)計的功能。為什么一年時間才寫這些功能?因?yàn)槲乙灿猩飳W(xué)實(shí)驗(yàn)和其他課題要開展,TBtools 的開發(fā)從始至終,可以說是一個上班摸魚或業(yè)余消磨時間的方式 。當(dāng)然,這一年的跨度,可能還是在 JJplot 的開發(fā)上。
TBtools 開發(fā)第二年
這一年,我碩士延期了。不過這個延期是我自己要求的。因?yàn)槲覄倓偨鉀Q了一些不得不解決的現(xiàn)實(shí)問題,可以開始更有尊嚴(yán)的活著。于是,我那會打算是爭取出國(當(dāng)然,最后沒有出去有另外的原因,包括身體,家庭,去向以及offer來得太晚)。無論如何,這一年卻也是 TBtools 成長飛快的一年。我暑期在家,想明白了一點(diǎn)事情,于是將 JJplot 全盤推倒,重新寫了一個更具圖層語法意義,支持全圖縮放和交互的 JJplot2。于是才會有系列其它可視化內(nèi)容,包括韋恩圖以及共線性可視化等。

值得一提的是,Omicshare.com 論壇開設(shè)不久,我也就跑到論壇上做了一些宣傳,最后還當(dāng)了一個版塊的版主(當(dāng)然,現(xiàn)在還是)?,F(xiàn)在,我沒有繼續(xù)主動在上面推廣 TBtools,原因主要是論壇重點(diǎn)在于生信討論,不太適合過多推廣TBtools。無論如何,我覺得 Omicshare 論壇,仍然是我極力推薦的生信論壇(可能得到充分的公司資金支持,所以可以較好地運(yùn)轉(zhuǎn))。感興趣的可以點(diǎn)擊這個鏈接?http://www.omicshare.com/user/register.php?uhash=1659401951,跳轉(zhuǎn)并注冊賬號。

對應(yīng)的也有一些云平臺免費(fèi)或者收費(fèi)的小工具可以使用。
在論壇上,仍然可以搜索到一些非常早期的 TBtools 教程。當(dāng)然,更多的,大家或許可以討論一些生信相關(guān)話題。不時看到一些我感興趣的話題,我仍然有在回復(fù)。
在此期間,我也發(fā)現(xiàn)論壇并不太適合我個人與 TBtools 用戶的溝通與交流,主要在于時效性。此外,QQ群里,用戶也可以相互討論交流。于是,我建立了第一個 TBtools 使用交流群。

在兩三年后,大體是這樣(注意到,保持每天請出QQ群的習(xí)慣);而現(xiàn)在,8群也滿...

JIGplot 的到來
轉(zhuǎn)眼就是2017年,我注冊了并開始運(yùn)營《生信札記》微信公眾號(當(dāng)然用心經(jīng)營是一年后)。在上面撰寫了一些生信學(xué)習(xí)經(jīng)驗(yàn),而后來便主要用于分享TBtools 使用實(shí)例。TBtools 社群在接下來的一年間快速增長,很快便滿人。有了bioinformatics*中國的管理和發(fā)展經(jīng)驗(yàn),我試圖嘗試另外的發(fā)展方式,即若有必要,就開設(shè)新群。但很快,兩個2000人群的名額已經(jīng)用完,大群任期也臨近。我便換屆卸任,將重心轉(zhuǎn)移到接下來的博士課題和TBtools社群管理上。
或許2017年的整整一年,是我相對輕松的一年,那邊碩士畢業(yè)沒有問題,這邊博士也定了去處。我重新思考了繪圖引擎的實(shí)現(xiàn)。值得提及,這段時間,大濕兄(Y蜀黍,現(xiàn)任職于南方醫(yī)科大,博導(dǎo))在他的公號上不時更新了一些推送。我現(xiàn)在只有大體模糊的記憶,其中一句話,對我的觸動相對較多,總結(jié)一下,所有的計算機(jī)圖形可視化,都可用 點(diǎn) 決定。兩個點(diǎn)就是一條線,三個點(diǎn)就是一個圖形。這本身只是一個初中幾何知識,但我卻用了兩三年才想明白。于是,在接下來的半年到一年內(nèi),我又一次完全推翻了 JJplot2 實(shí)現(xiàn),開發(fā)了 JIGplot。

這一次,我不再執(zhí)著于圖層語法的實(shí)現(xiàn),當(dāng)然思想上我依然有所參考。相應(yīng)實(shí)現(xiàn)的思考,在一個PPT(腳注未展示),我可能已經(jīng)打開,思考,調(diào)整,關(guān)閉了不下百次(Emmm,我不小心都快被自己感動哭了)。所有的思考和努力,熔鑄在 JIGplot。
從此,TBtools 的可視化相關(guān)功能得到絕對地拓展。


博士研究生階段
時間飛逝,碩士一年的延期結(jié)束,我也開始了博士研究生生活。在這一期間,碩士課題組做了一部分菠蘿基因家族分析的工作,同時博士課題組(我尚未畢業(yè))也在做一些家族分析工作。我看著他們做一些結(jié)構(gòu)域預(yù)測可視化,MEME motif可視化,甚至于基因結(jié)構(gòu)可視化時,總是難受。因?yàn)樾收娴奶停赡芨阃炅艘獌扇?。既然有了JJplot2,我反手就是一個生物序列可視化功能,無論是結(jié)構(gòu)域,MEME還是基因結(jié)構(gòu),直接繼承一個類,于是變成三個獨(dú)立可視化功能。Emmm,感覺這個功能一下子幫大家省了不少時間。
JJplot2 的實(shí)現(xiàn),并不支持拼圖。而 JIGplot 天生就是圖層化。博士期間我進(jìn)一步開發(fā)的 MetaGeneStructurePlot,支持一鍵化,一張圖同時展示 ,進(jìn)化樹,MEME motif,基因結(jié)構(gòu),結(jié)構(gòu)域,甚至其他。

當(dāng)然,可能也是這個功能的推廣,TBtools一度(或者甚至一直)被人認(rèn)為就是專門做基因家族分析的工具。對于這個,我也很無奈。
博士研究生這三四年,事情確實(shí)多了許多,課題也多了很多。TBtools 的開發(fā)主要是基于我個人或者課題組課題需要,所以功能也在不斷豐富。其中包括一些比較基因組相關(guān)工具。當(dāng)然,更多的其實(shí)并沒有開放出來,所以可能知道的人不是很多??偟膩碚f,雖然這兩三年沒有非常明顯的階段性突破(如還再推翻繪圖引擎 JIGplot),但更多功能得到開發(fā),優(yōu)化,增強(qiáng)和拓展。如果說我碩士階段對應(yīng)了 TBtools 的出生和兒童時期,那么博士階段對應(yīng)的則是 TBtools 長大成人,并辦了成人禮(TBtools文章終于有了歸宿)。
TBtools 功能現(xiàn)狀
TBtools 能夠有如此豐富的功能,有賴于我所在課題組(博士-夏瑞教授課題組和碩士-何業(yè)華教授課題組),TBtools 三十多位群管 以及 目前 2萬有余用戶的意見和建議。相關(guān)的推送已經(jīng)有很多,這里附上一張簡圖,

目前已開放的GUI功能140+,而這個數(shù)字,事實(shí)上還在增長。
TBtools 投稿經(jīng)歷
前述已基本理清 TBtools 項(xiàng)目開發(fā)始末??梢哉f,TBtools 從一開始就是我個人課題或者分析需求導(dǎo)向開發(fā);說得直白一點(diǎn),那么是順手寫一寫。未曾想過他會走到今天,更沒想過將其撰寫成文并發(fā)表。
第一次撰寫成文,已經(jīng)是2018年年初(開發(fā)了約三年),在較多用戶的催促下,草草整理了一份 PDF 文檔。文檔相對粗糙,我花了兩三天就做完,就放到 bioRxiv,因?yàn)槠渌n題也在開展。

其中的圖表是這樣的

可以看到,基因結(jié)構(gòu)的圖片也只是朋友華南植物園王潔雨(演化生物學(xué)-公眾號那個老王)畫的,我截圖拿來用了。圖中還帶著水印。很明顯,那會的想法只是放上去,不要再被用戶懟說鏈接不好引用。
就這樣,過了半年,我們手上項(xiàng)目暫有停歇,另外多少我對論文發(fā)表有了新的認(rèn)知,應(yīng)是包括《園藝研究》主編程宗明老師的一次報告提及,既然工作做了,就還是要發(fā)表。我與夏老師商量后,決定還是花點(diǎn)時間,盡量投了。我們又花了幾天,寫了一篇感覺還不錯的短文,application Note,投到《Bioinformatics》。大體是這個狀態(tài)(這些可以在 bioRxiv查看到)


其實(shí)這張圖表也挺好看的。若是做一點(diǎn)生物信息的,多少還是有一種執(zhí)念,即發(fā)一篇《Bioinformatics》( 二區(qū) ),那時我也有(此前,已有一區(qū)刊物的朋友邀請投稿,我們婉拒了)。沒有太多意外,Bioinformatics 編輯回信,大體是“我們稿件太多,懶得理你”。明顯只是客套話,但也沒辦法(后來Bioinformatics分?jǐn)?shù) IF 一跌再跌,也就再也沒想法更新并投過去了)。值得注意的是,投過去時,JIGplot已經(jīng)開發(fā)并放進(jìn)去了,我對 TBtools 的工作其實(shí)比較有信心,至少創(chuàng)新點(diǎn)是有的。但悲劇是沒辦法的。我與夏老師就這個事情討論過一次,大體原因是,文稿內(nèi)容和圖片確實(shí)無法反應(yīng)出 TBtools 的創(chuàng)新點(diǎn)和優(yōu)勢所在,換句話說,怪不了別人。此后不久,我們接到了另一個生信相關(guān)期刊(三區(qū))邀請投稿,我們婉拒了;也接到國內(nèi)國外其他期刊約稿,我們還是婉拒了。期間,不少朋友給了這些那些的建議,可惜,那時的我確實(shí)不在狀態(tài)。
就這樣,又過了一年。2019年年末,我家中有事離開學(xué)校,于是有了一段相對長的空余時間可以做點(diǎn)事情。夏老師和我前前后后討論了數(shù)次,多半是“激烈討論”(其實(shí)這個對我們兩個是常態(tài),但無論如何爭吵,在課題或者學(xué)術(shù)的角度上,目標(biāo)是一致的)。最終,我們努力打磨,加上一起參與到 TBtools 界面,文檔,文稿工作的老張(張翼),Margaret 和 Hanna,終于還是得到一個不錯結(jié)果,新的文稿基本可以展示 TBtools 的部分主要特性。


一共是三個圖,這也是某種意義上的 TBtools 文稿完全重寫的第三版。當(dāng)然,更為幸運(yùn)的是,分子植物期刊(Molecular Plant)的編委老師們愿意花時間了解 TBtools 相關(guān)工作,我們終于也得到了文稿送審的機(jī)會。在編輯和審稿人的建議下,我們再次完全重寫了TBtools文稿(這應(yīng)算作第四版),并補(bǔ)充了兩張圖。前前后后,我們幾個人花了挺多時間和精力。最新的這版文稿,展示了 TBtools 更多的特性。靜態(tài)圖片終歸是靜態(tài)圖片,無法完全展示,但我覺得這應(yīng)該已經(jīng)是極限。

經(jīng)過了大半年的努力,文稿被接收發(fā)表。對于這四個 TBtools 文稿版本,感興趣的可以直接在 bioRxiv 上下載并與 Mol Plant 期刊的文稿對比。
爭了一口氣
生活,或許如此。我們不需要過多理會別人的看法,而只堅(jiān)持做自己覺得值得的事情。TBtools 開發(fā)早期,遇到過不少質(zhì)疑,甚至是詆毀。甚至于一些人身攻擊。五六年前的事情,也不值得詳細(xì)提及。不過,看不上 TBtools 的,依然大有人在。這是一件理所當(dāng)然的事情。從 TBtools 表面上能做的事情來說,確實(shí)并沒有多少明顯的超越。因?yàn)槲乙恢笨粗氐氖?span style="box-sizing: border-box;font-weight: 600;">降低甚至抹除數(shù)據(jù)分析的門檻,節(jié)省生物科研工作者的時間。所以 TBtools 主要開發(fā)目標(biāo)一直是,將繁雜的分析過程簡約化,常用的分析自動化。TBtools 里面幾乎每一個功能都包含了我個人思考,即使是 BLAST 等界面化功能,我也專門做了序列類型的預(yù)判,從而節(jié)省了軟件參數(shù)設(shè)置的時間。相應(yīng)的優(yōu)化還有很多,但是這些并不能被評判者們所看到。
有時候想想,你的汗水,你的努力結(jié)果,都在大多數(shù)人看不到的地方,那么并不能怪別人看不上你。只能說,可能你做的東西,本身就不容易被認(rèn)可。當(dāng)然,我運(yùn)氣比較好,一是 TBtools 用戶朋友看得到,二是 博士導(dǎo)師和碩士導(dǎo)師的幫忙,三是 Molecular Plant 期刊的編委和審稿人愿意花時間了解 TBtools 的工作。三者結(jié)合,即天時地利人和,于是 TBtools 終于得以見刊。
當(dāng)我知道文稿被接受的時候,多少我是松了一口氣(甚至有早期用戶與我提及他都要哭了)?;蛟S這是因?yàn)?span style="box-sizing: border-box;font-weight: 600;">我們已經(jīng)自認(rèn)優(yōu)秀太久,終于還是爭了一口氣。我們打了那些看不上我們的人一記響亮的耳光,我們也不再需要承受無理的質(zhì)疑:都沒發(fā)文章,軟件能用嗎?預(yù)印本靠譜嗎,不敢引用云云....
感謝
TBtools 的開發(fā),完善,到現(xiàn)在階段性的成果出來。事實(shí)上,需要感謝的人或者社群很多。以下我大體列舉出來,但依然會存在遺漏,請注意到的朋友提醒下我。順序按我腦海里浮現(xiàn)的順序排列,不對應(yīng)感謝的份量:
華南農(nóng)業(yè)大學(xué)何業(yè)華教授,2009年本科入學(xué),當(dāng)年十月份,我便進(jìn)入他的課題組,組培,分子,大田都接觸了不少。碩士也順利推免,此間一些我個人無奈但也不可抗拒的事情發(fā)生。何老師給與了我充分的自由,讓我得以有足夠的時間鼓搗數(shù)據(jù)分析,并最終找到解決辦法。
湖南農(nóng)業(yè)大學(xué)陳浩博士,跟著浩哥走,于是我有機(jī)會學(xué)習(xí)并了解生物信息數(shù)據(jù)分析。
貴州師范學(xué)院吳亞,前述提起多次的女朋友(現(xiàn)在是我的妻子),我們一起經(jīng)歷了生病卻不夠錢買藥的階段,一起租過半夜漏水的房子。每每想起,覺得委屈了她。她幫我設(shè)計了Logo,在早期界面設(shè)計和圖形配色上給與了不少建議(比如MEME motif 可視化的配色方案)。
bioinformatics*中國 QQ交流群的所有群管,如果沒有他們,或許我從未明白生信分析到底是啥。千言萬語,不如我們在群里開車的默契。此處不做展開。

中山大學(xué)的任間教授以及我齊哥(Zinky),他們讓我看到 Java 開發(fā)可視化工具的無限可能。或許沒有他們,那么我在 Java 學(xué)習(xí)上,可能一直無法入門。
南方醫(yī)科大學(xué)余光創(chuàng)教授(我大濕兄,你們Y蜀黍),他不停地在博客或者公眾號上分享的計算機(jī)繪圖邏輯,觸發(fā)了我的思考,從而才有 JIGplot 的充分實(shí)現(xiàn)。
華南農(nóng)業(yè)大學(xué)夏瑞教授,TBtools 的完善得益于博士課題以及課題組其他成員的需求,建議和意見。TBtools 文稿構(gòu)思,寫作,投稿甚至于最終發(fā)表,我們一起耗費(fèi)了大量時間和精力。前前后后 ,一個軟件,鼓搗了兩年文稿,全部推倒重寫了三版。同時還要感謝張翼,Margaret 和 Hanna 在其中的時間和精力付出。
TBtools 三十多位群管,當(dāng) TBtools 在交流群里,在其他社群里,在公眾號上被懟的時候,是他們一直鼓勵我,相信我,并支持我,于是我得以堅(jiān)持下去。

OmicShare論壇及其各個版主,雖然我退群有兩三年,不過OmicShare活躍的那段日子,同樣也是回憶,也是 TBtools 成長的一個階段。我仍然相信,OmicShare論壇可以也值得一直辦下去。必要的商業(yè)化,是保證公益可持續(xù)不可或缺的部分。
早期曾經(jīng)捐助過 TBtools 開發(fā)的用戶朋友,我印象中至少有三個人,現(xiàn)在應(yīng)該都在高校工作了吧,他們捐助了加和起來估計有 500 塊錢,那會正是我經(jīng)濟(jì)窘迫,而 TBtools 開發(fā)不被認(rèn)可,孤助無援的時候。他們讓我覺得這些工作,其實(shí)還是值得。我認(rèn)為,一定的物質(zhì)激勵,或許恰恰是成事的關(guān)鍵。這里還需要感謝南京大學(xué)的一個老師,我們來來回回聊了幾次,他似乎習(xí)慣把我拉黑,以至于我確實(shí)沒搞清楚,他到底是姓湯還是姓周?
SCAU生物信息交流群,這是我和浩哥一起組建的華南農(nóng)大生物信息交流群。其中成員仍然不多。浩哥和我開始做生信的時候,我們自認(rèn)為校內(nèi)并沒有做生信的老師。六年后的今天則有所不同。五年大招人和人才引進(jìn),華南農(nóng)現(xiàn)在應(yīng)是有一些側(cè)重生信數(shù)據(jù)分析相關(guān)研究的課題組。當(dāng)然,這并不影響我們組建的這個社群存在的意義,雖然他一直沒有太多人。但, TBtools 的開發(fā),尤其是菜單的重構(gòu),我有印象是在群里討論中有了決定。
支持并幫助推廣 TBtools 的系列公眾號,這里不便一一列舉,但我認(rèn)為你們應(yīng)該知曉。
參與 TBtools使用 和 基因家族分析 講演的朋友們,你們的資助使得我有足夠的資金購置安裝器授權(quán),使得所有用戶尤其是新手用戶,有更好的 TBtools 安裝和使用體驗(yàn)。
TBtools 的 2萬+ 用戶。TBtools 的開發(fā)和完善,得益于社群的使用意見和反饋。如果沒有用戶的意見或建議,TBtools 不可能有現(xiàn)在的狀態(tài)。
寫在最后
洋洋灑灑,不小心就碼了一個長文?;ヂ?lián)網(wǎng),是有記憶的。多年以后,我回頭來看,這篇推文,或許會更為有趣。感謝冥冥中,你著實(shí)讓我相信,一切搞不死你的,會讓你變得更強(qiáng)。
最后,還是用我的 QQ 簽名作為結(jié)束語吧。
