fasta矩阵组合脚本

又是给女朋友做的……没有需求就没有动力这真的是一个合格的程序员么喂。

因为是在Windows下用,不能用bash也不能写Python,只好写成VBS。

第一次用VBS,这货比起Python真是难用得要命,微软太不争气了。不过也算是学了一门新技能吧。

其实这脚本一点也不健壮,文件数量过多时会堆栈溢出,文件名太长会报错,文件太大倒是没测过,想必也有问题。

她已经用完了,咱也没动力改了。有需求请自取。

‘Author by [email protected]
‘用于对当前路径下多个.fasta或.fas文件按矩阵进行组合,结果存放在result目录中
‘示例:当前路径下有A.fasta、B.fasta和C.fasta三个文件
‘      运行脚本后,result目录中将生成A+B.fas、B+C.fas、A+C.fas、A+B+C.fas四个文件
‘      其中,A+B.fas的每一个矩阵都由A.fasta和B.fasta的对应矩阵拼合而成,以此类推
‘      结果矩阵的名称将采用第一个源矩阵的名称
‘限制:请保证每个文件中矩阵的顺序相同且格式正确(每个矩阵以">矩阵名"开头)。

‘主函数入口
Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")
fso.CreateFolder(".\result")
ForEachPair GetFileName

‘获取文件扩展名
Private Function GetFileExt(ByVal sFileName)
    Dim P
    For P = Len(sFileName) To 1 Step -1
        If InStr(".", Mid(sFileName, P, 1)) Then
            Exit For
        End If
    Next
    GetFileExt = Right(sFileName, Len(sFileName) - P)
End Function

‘获取除了路径和扩展名的主文件名
Private Function GetFileMain(ByVal sFilename)
    Dim P, Q
    For P = Len(sFileName) To 1 Step -1
        If InStr(".", Mid(sFileName, P, 1)) Then
            Exit For
        End If
    Next

    For Q = P To 1 Step -1
        If InStr("\", Mid(sFileName, Q, 1)) Then
            Exit For
        End If
    Next
    GetFileMain = Mid(sFileName, Q+1, P-Q-1)
End Function

‘获取所有.fasta文件的完整文件名
Private Function GetFileName
    Dim fso, path, filelist, fastafiles()
    Dim i, f, arrsize
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set path = fso.GetFolder(".")
    Set filelist = path.Files
    i = 0
    arrsize = 1
    Redim fastafiles(arrsize)
    For each f in filelist
        If GetFileExt(f) = "fasta" Or GetFileExt(f) = "fas" Then
            If i = arrsize Then
                arrsize = arrsize + 1
                Redim Preserve fastafiles(arrsize - 1)
            End If
            fastafiles(i) = f
            i = i + 1
        End If
    Next
    If i = 0 Then
        MsgBox("没有找到.fasta文件,请检查本文件所在路径")
        WScript.Quit
    End If
    GetFileName = fastafiles
End Function

‘将一个文件拆分成若干个sample
Private Function SplitSample(ByVal filename)
    Dim fso, f1, content, array, newarray, i
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set f1 = fso.OpenTextFile(filename, 1)
    content = f1.ReadAll
    f1.Close
    array = Split(content, ">", -1, vbTextCompare)
    If array(0) = "" Then
        Redim newarray(UBound(array) - 1)
        For i = 1 To UBound(array)
            newarray(i-1) = array(i)
        Next
    Else
        newarray = array
    End If
    SplitSample = newarray
End Function

‘将两个sample合并为一个,只保留第一个sample的标题
Private Function JoinSample(ByVal sample1, ByVal sample2)
    Dim lnary1, lnary2, tarary, i, j

    lnary1 = Split(sample1, vbNewLine, -1, vbTextCompare)
    lnary2 = Split(sample2, vbNewLine, -1, vbTextCompare)
    Redim tarary(UBound(lnary1) + UBound(lnary2) + 1)
    For i = 0 To UBound(lnary1)
        tarary(i) = lnary1(i)
    Next
    For j = i + 1 To i + UBound(lnary2)
        ‘不合并第二个sample的第一行,因为也是标题
        tarary(j) = lnary2(j - i)
    Next
    tarary(0) = ">" & tarary(0) & vbNewLine
    JoinSample = Join(tarary, "")
End Function

‘将两个文件合并到一个文件中
Private Function JoinFile(ByVal file1, ByVal file2)
    Dim tarary, ary1, ary2, tarfile, fso, fp, i, maxelem, sample
    ‘MsgBox file1 & "+" & file2
    tarfile = ".\result\" & GetFileMain(file1) & "+" & GetFileMain(file2) & ".fas"
    Set fso = CreateObject("Scripting.FileSystemObject")
    If fso.FileExists(tarfile) Then
        JoinFile = tarfile
        Exit Function
    End If
    ary1 = SplitSample(file1)
    ary2 = SplitSample(file2)
    If UBound(ary1) <> UBound(ary2) Then
        MsgBox(file1 & "的样本数" & UBound(ary1) & "与" & file2 & "的样本数" & UBound(ary2) & "不相等")
        WScript.Quit
    End If
    maxelem = UBound(ary1)
    Redim tarary(maxelem)
    For i = 0 To maxelem
        tarary(i) = JoinSample(ary1(i), ary2(i))
    Next

    ‘写入文件
    Set fp = fso.CreateTextFile(tarfile, True)
    For each sample in tarary
        ‘因为sample末尾没有换行,此处输出换行
        fp.WriteLine(sample)
    Next
    fp.Close
    JoinFile = tarfile
End Function

‘对文件进行排列组合
Private Function ForEachPair(ByVal list)
    Dim i, j, k, newlist, combfile
    If UBound(list) = 1 Then
        ‘只有两个元素则结束递归
        ForEachPair = JoinFile(list(0), list(1))
    Else
        Redim newlist(UBound(list) - 1)
        For i = 0 To UBound(list)
            k = 0
            For j = 0 To UBound(list)
                If i <> j Then
                    newlist(k) = list(j)
                    ‘MsgBox("list(" & j & ") " & list(j) & "newlist(" & k & ") " & newlist(k))
                    k = k + 1
                End If
            Next
            ‘MsgBox(Join(newlist, " | "))
            If i = 0 Then
                combfile = ForEachPair(newlist)
            Else
                ForEachPair newlist
            End If
        Next
        ‘因为不考虑排列,只需用第一个和后面的组合在一起就可以
        ForEachPair = JoinFile(list(0), combfile)
    End If
End Function

fasta矩阵组合脚本

时间: 2024-10-16 00:15:22

fasta矩阵组合脚本的相关文章

调用域名注册api,查询所有域名组合脚本

今天有个想法,想查询所有短域名是否被注册了,a-z1-9组成的所有3,4位组合的.com域名是否有没被注册的,于是开干,google后知道万网提供一个api可以查询, http://panda.www.net.cn/cgi-bin/check.cgi?area_domain=google.com, 后面的google.com可以换做你想查询的域名,结果会返回一个xml页面,如下  <?xml   version="1.0" encoding="gb2312"?

用于拆解和组合PDF中各个对象的shell脚本

拆解脚本 header_start=0 header_len=15 xref_start=$(strings -a -t d $1 | grep -e "\bxref\b" | awk '{print $1}') trailer_start=$(strings -a -t d $1 | grep -e "\btrailer\b" | awk '{print $1}') #echo $xref_start #echo $trailer_start xref_len=$

矩阵卷积Matlab(转载)

转载自:http://blog.csdn.net/anan1205/article/details/12313593 两个矩阵卷积转化为矩阵相乘形式--Matlab应用(这里考虑二维矩阵,在图像中对应)两个图像模糊(边缘)操作,假设矩阵A.B,A代表源图像,B代表卷积模板,那么B的取值决定最后运算的结果. Matlab中的应用函数--conv2(二维卷积,一维对应conv) 函数给出的公式定义为: 同一维数据卷积一样,它的实质在于将卷积模板图像翻转(旋转180),这里等同于一维信号的翻转,然后将

【转】【矩阵】三维坐标旋转矩阵算法

3D数学 ---- 矩阵和线性变换 一般来说,方阵能描述任意线性变换.线性变换保留了直线和平行线,但原点没有移动.线性变换保留直线的同时,其他的几何性质如长度.角度.面积和体 积可能被变换改变了.从非技术意义上说,线性变换可能“拉伸”坐标系,但不会“弯曲”或“卷折”坐标系. 矩阵是怎样变换向量的 向量在几何上能被解释成一系列与轴平行的位移,一般来说,任意向量v都能写成“扩展”形式: 另一种略有差别的形式为: 注意右边的单位向量就是x,y,z轴,这里只是将概念数学化,向量的每个坐标都表明了平行于相

poj 3233 Matrix Power Series(等比矩阵求和)

http://poj.org/problem?id=3233 ps转: 用二分方法求等比数列前n项和:即 原理: (1)若n==0 (2)若n%2==0     (3)若n%2==1 代码如下: LL sum(LL p,LL n) { if(n==0) return 1; if(n&1) return (1+pow(p,(n>>1)+1))*sum(p,n>>1); else return (1+pow(p,(n>>1)+1))*sum(p,(n-1)>&

算法重拾之路——strassen矩阵乘法

***************************************转载请注明出处:http://blog.csdn.net/lttree******************************************** 第一章:分治与递归 STRASSEN矩阵乘法 算法描述: 矩阵乘法是线性代数中最常见的问题之一,它在数值计算中有广泛的应用.设A 和 B 是两个n × n矩阵,它们的乘积AB同样是一个n×n矩阵.A和B的乘积矩阵C 中的元素cij定义为: 按照这个定义来看,计算

tf.transpose函数的用法讲解

tf.transpose函数中文意思是转置,对于低维度的转置问题,很简单,不想讨论,直接转置就好(大家看下面文档,一看就懂). tf.transpose(a, perm=None, name='transpose') Transposes a. Permutes the dimensions according to perm. The returned tensor's dimension i will correspond to the input dimension perm[i]. If

CV:object detection(Haar)

一. Haar分类器的前世今生 人脸检测属于计算机视觉的范畴,早期人们的主要研究方向是人脸识别,即根据人脸来识别人物的身份,后来在复杂背景下的人脸检测需求越来越大,人脸检测也逐渐作为一个单独的研究方向发展起来. 目前的人脸检测方法主要有两大类:基于知识和基于统计. "基于知识的方法主要利用先验知识将人脸看作器官特征的组合,根据眼睛.眉毛.嘴巴.鼻子等器官的特征以及相互之间的几何位置关系来检测人脸.基于统计的方法则将人脸看作一个整体的模式--二维像素矩阵,从统计的观点通过大量人脸图像样本构造人脸模

OpenGL变换

概述 OpenGL变换矩阵 实例:GL_MODELVIEW矩阵 实例:GL_PROJECTION矩阵 概述 OpenGL管线中,在光栅化操作之前,包括顶点位置与法线向量的几何数据经顶点操作与图元装配操作进行变换. 模型坐标 它是模型对象的局部坐标系,同时也是任何变换之前模型对象的初始位置与朝向.为了变换模型对象,可以使用glRotatef().glTranslatef().glScalef(). 观察坐标 它由模型坐标乘以GL_MODELVIEW矩阵产生.在OpenGL中,可以使用GL_MODE