從重測序到批量Indel引物設(shè)計,R與python結(jié)合--自動屏蔽SNP區(qū)域
自從來到實驗室,得到師兄流傳下來的引物批量設(shè)計腳本后,就一直掛記于心。無奈當時python水平不好,實在看不太懂,故而一直念叨到了現(xiàn)在。其實我現(xiàn)在python水平也不咋地,因為相比于我熟悉的R來說,python實在太不順手了。無論是從語言風格還是IDE風格上來說,我始終更喜歡R。其實如果R調(diào)用linux程序方便好用一點的話,我自己寫的腳本恐怕早就出來了,但是無論我怎么調(diào)用system,system2,我還是調(diào)用不了primer3_core……
幸好,ChatGPT救我狗命。R的部分基本都是我寫的,我只讓ChatGPT給了一些優(yōu)化改進。而python部分則基本都是ChatGPT給出的,當然,其中有很多互動和排錯,可以說是我和ChatGPT的結(jié)晶。嘿嘿嘿,結(jié)晶,嘿嘿嘿,我們的結(jié)晶~
本文件還有一個優(yōu)勢便是可以結(jié)合檢測到的SNP與小indel區(qū)域的位置,自動向primer傳遞設(shè)計引物時應(yīng)該屏蔽的區(qū)域,增加引物結(jié)合準確性。
言歸正傳,重測序后檢測snp和indel,會得到variation文件,格式如下:

現(xiàn)在,讓我們開始吧!
設(shè)計思路的草稿:
#生成csv文件,包含chr,目標區(qū)域開始pos,目標長度,gap的cM位置,序列
#首先接受csv文件
#讀取序列,
#根據(jù)gap得到目標區(qū)域,生成input_file。根據(jù)gap長度小于10,10到30,以及大于30,分別確定PRIMER_PRODUCT_SIZE_RANGE
#有沒有辦法得到exclude_region?
#得到結(jié)果,提取PRIMER_LEFT_0_SEQUENCE,PRIMER_RIGHT_0_SEQUENCE
#PRIMER_LEFT_0_TM,PRIMER_RIGHT_0_TM,
#PRIMER_PAIR_0_PRODUCT_SIZE
#生成新的csv文件,以單一序列得到的結(jié)果舉例:
#第一行:chr,pos,產(chǎn)物長度,chr-cM的名字,Primer-F,DNA序列
#第二行:null,null,null,null,Primer-R,null
現(xiàn)在,對得到的variation進一步篩選
上面的代碼對variation進行了篩選,得到了長度在一定范圍內(nèi)的Indel,并對其長度進行了度量。
上面的代碼獲得primer3_core的運行所需要的一些參數(shù)。當提取的seq中g(shù)ap左右的序列長度小于25時,會在seq前面加上長度不夠的字樣,并且會提供ref_length(幫助判斷gap是不是同一條DNA鏈的),方便后續(xù)自己判斷是否需要合并gap來設(shè)計引物。
上面的代碼則檢索給出的sequence中,存在variation的區(qū)域,并給出設(shè)計引物時應(yīng)該屏蔽的區(qū)間
然后,編寫一個函數(shù)將以上部分封裝起來
以上,R語言的部分結(jié)束,下面是python的部分。
該部分我計劃在linux環(huán)境中執(zhí)行。命令格式為:python3 ./get_primer.py ../輸入文件名.xlsx 輸出文件名
primer3輸入文件格式可以去官網(wǎng)查看,有相應(yīng)需求的也可以自己更改。我這里設(shè)置只用返回一對引物即可。并對產(chǎn)物長度根據(jù)indel的長度進行了調(diào)整。
上面這個函數(shù)extract_primer_info會提取primer3輸出文件中的信息。
最后,再加上:
這個python文件便完成了,然后便可以快樂地批量設(shè)計引物了。感謝ChatGPT,雖然還有很多可以改進之初,但確實幫助非常大。
最后再說一遍,命令格式為:python3 ./get_primer.py ../輸入文件名.xlsx 輸出文件名,是在linux環(huán)境中執(zhí)行的。
把這段代碼發(fā)出來也是因為有python部分ChatGPT有大量的參與,算是取之于民,用之于民吧~
大家覺得有用的話就投個幣吧~
#2023.2.26更改了一些bug并重新上傳