public static string TransferTo(this Aminoacid from, Aminoacid to, out int mutationCount)
        {
            var fromCodes = from.Codes;
            var toCodes   = to.Codes;

            if (fromCodes.Length == 0 || toCodes.Length == 0)
            {
                mutationCount = int.MaxValue;
                return(string.Empty);
            }

            var lst = (from f in fromCodes
                       from t in toCodes
                       let m = TransferTo(f, t)
                               orderby m
                               select new { From = f, To = t, TransCost = m }).ToList();

            var min = (from l in lst
                       where l.TransCost == lst[0].TransCost
                       select l).ToList();

            mutationCount = min[0].TransCost;

            return((from m in min
                    let r = MyConvert.Format("{0}->{1}", m.From, m.To)
                            select r).Merge(" ! "));
        }
Beispiel #2
0
 public void TestGetAtomMassPercent()
 {
   Aminoacid aa = new Aminoacid();
   aa.Initialize('G', "Glydddddd", 57.02147, 57.05, "Glycine", "C2H3NO", true, "", 2.1);
   double atomCPercent = aa.GetAtomMassPercent(Atom.C);
   Assert.AreEqual(Atom.C.MonoMass * 2 / aa.MonoMass, atomCPercent, 0.0001);
 }
        private static bool DoIsRnaEditing(Aminoacid from, Aminoacid to, ref string mutationstr)
        {
            var fromCodes = from.Codes;

            var toCodes = to.Codes;

            var lst = (from f in fromCodes
                       from t in toCodes
                       let m = TransferTo(f, t)
                               where m == 1
                               select new { From = f, To = t, TransCost = m }).ToList();

            foreach (var m in lst)
            {
                for (int i = 0; i < m.From.Length; i++)
                {
                    //if (m.From[i] == 'T' && m.To[i] == 'C')
                    if (m.From[i] == 'A' && m.To[i] == 'G')
                    {
                        mutationstr = string.Format("{0}->{1}", m.From, m.To);
                        return(true);
                    }
                }
            }

            return(false);
        }
Beispiel #4
0
        public ProteinCarbonRangePredictor()
        {
            var aas = new Aminoacids();

            this.maxCarbonPercentAminoacid = aas.GetMaxCarbonPercentAminoacid();
            this.minCarbonPercentAminoacid = aas.GetMinCarbonPercentAminoacid();
        }
Beispiel #5
0
    public void TestInitialize()
    {
      Aminoacid aa = new Aminoacid();

      Assert.AreEqual(false, aa.Visible);
      aa.Initialize('G', "Glydddddd", 57.02147, 57.05, "Glycine", "C2H3NO", true, "", 2.1);
      Assert.AreEqual("Gly", aa.ThreeName);
      Assert.AreEqual(57, aa.NominalMass);
      Assert.AreEqual("G Gly 57.0215 57.05 Glycine C2H3NO", aa.ToString());
    }
        /// <summary>从本地加载氨基酸数据 </summary>
        public static async Task LoadDataAsync()
        {
            if (loaded)
            {
                throw new PolymerModelException("PolymerModel has been loaded");
            }
            string aminoacidData = await IOUtil.ReadInStreamingAssetsAsync(string.Empty, "Aminoacid.csv");

            AminoacidDt = CSVHelper.ReadCSVStr(aminoacidData);
            string connectionData = await IOUtil.ReadInStreamingAssetsAsync(string.Empty, "Connection.csv");

            ConnectionDt = CSVHelper.ReadCSVStr(connectionData);

            //将Connection数据表转化为字典,有助于后续的数据查找
            Dictionary <string, List <DataRow> > connectionDic = new Dictionary <string, List <DataRow> >();

            foreach (DataRow connectionDataRow in ConnectionDt.Rows)
            {
                string type = connectionDataRow["Type"].ToString();
                if (!connectionDic.ContainsKey(type))
                {
                    connectionDic.Add(type, new List <DataRow>());
                }
                connectionDic[type].Add(connectionDataRow);
            }

            //遍历氨基酸数据表 + connectionDic 一起构建氨基酸数据结构
            foreach (DataRow aminoacidDataRow in AminoacidDt.Rows)
            {
                string        type          = aminoacidDataRow["Type"].ToString();
                AminoacidType aminoacidType = (AminoacidType)Enum.Parse(typeof(AminoacidType), type);
                string        chinese       = aminoacidDataRow["Chinese"].ToString();
                bool          isStandard    = aminoacidDataRow["IsStandard"].ToString() == "1";
                string[]      atomNames     = aminoacidDataRow["Atoms"].ToString().Trim('[', ']').Split(' ');
                Dictionary <KeyValuePair <string, string>, BondType> connection = new Dictionary <KeyValuePair <string, string>, BondType>();
                if (connectionDic.ContainsKey(type))
                {
                    //若该残基包含键
                    foreach (DataRow connectionDataRow in connectionDic[type])
                    {
                        string   firstAtom  = connectionDataRow["First"].ToString();
                        string   secondAtom = connectionDataRow["Second"].ToString();
                        BondType bondType   = (BondType)Enum.Parse(typeof(BondType), connectionDataRow["BondType"].ToString());
                        connection.Add(new KeyValuePair <string, string>(firstAtom, secondAtom), bondType);
                    }
                }
                Aminoacid aminoacid = new Aminoacid(aminoacidType, chinese, isStandard, atomNames, connection);
                Aminoacid.Aminoacids.Add(aminoacid.Type, aminoacid);
            }
            loaded = true;
        }
        protected void WriteAtom(StreamWriter sw, Aminoacid samAA, Aminoacid refAA, Atom[] atoms, string atomName, bool outputZero = true)
        {
            foreach (var atom in atoms)
            {
                if (samAA.Composition.ContainsKey(atom) || refAA.Composition.ContainsKey(atom))
                {
                    sw.WriteLine("{0}\t{1}\t{2}", atomName, samAA.Composition.ContainsKey(atom) ? samAA.Composition[atom] : 0, refAA.Composition.ContainsKey(atom) ? refAA.Composition[atom] : 0);
                    return;
                }
            }

            if (outputZero)
            {
                sw.WriteLine("{0}\t0\t0", atomName);
            }
        }
        public static bool IsRnaEditing(this Aminoacid from, Aminoacid to, out string mutationStr)
        {
            if (RnaEditingMap == null)
            {
                PrepareRnaEditingMap();
            }

            var pair = new Pair <char, char>(from.OneName, to.OneName);

            if (RnaEditingMap.ContainsKey(pair))
            {
                mutationStr = RnaEditingMap[pair];
                return(true);
            }

            mutationStr = string.Empty;
            return(false);
        }
    /// <summary>解析Pdb文件数据</summary>
    private void ParsePdbData(string str)
    {
        using (StringReader sr = new StringReader(str))
        {
            string record = null;//当前读取的记录

            //蛋白质作用域***********/
            string id                         = null;
            string classification             = null;
            string publishDate                = null;
            Dictionary <string, Chain> chains = new Dictionary <string, Chain>();
            Vector3 minPos                    = Vector3.zero;
            Vector3 maxPos                    = Vector3.zero;
            Vector3 centerPos                 = Vector3.zero; // 蛋白质的中心位置
            //*************************/

            //肽链作用域*************/
            OXTAtom oxt = null;
            Dictionary <int, AminoacidInProtein> seqAminoacids = new Dictionary <int, AminoacidInProtein>();
            //*************************/

            //氨基酸作用域***********/
            char   altloc     = ' '; // 可替位置标示符
            string resName    = null;
            string chainId    = null;
            int    residueSeq = 0;
            Dictionary <AtomInAminoacid, Vector3> atomInAminoacidPos    = new Dictionary <AtomInAminoacid, Vector3>();
            Dictionary <AtomInAminoacid, int>     atomInAminoacidSerial = new Dictionary <AtomInAminoacid, int>();
            //*************************/

            AminoacidInProtein currentAminoacidInProtein = null;
            bool completeLastAminoacid = true;//已完成上一个残基的读取

            while ((record = sr.ReadLine()) != null)
            {
                //原子作用域
                string title = record.Substring(0, 6);
                if (title.StartsWith("HEADER"))
                {
                    classification = record.Substring(10, 40).Trim(); //11-50
                    publishDate    = record.Substring(50, 9);         //51-59
                    id             = record.Substring(62, 4);         //63-66
                }
                else if (title.StartsWith("ATOM"))
                {
                    //氨基酸残基相关部分
                    int lastResidueSeq = residueSeq;
                    residueSeq = int.Parse(record.Substring(22, 4).Trim()); //23-26列:残基序列号作为判断标志
                    if (lastResidueSeq != residueSeq && !completeLastAminoacid)
                    {
                        //若当前record为新的氨基酸残基的第一条记录(或记录为TER)
                        currentAminoacidInProtein = new AminoacidInProtein(altloc, resName, chainId, lastResidueSeq, atomInAminoacidPos, atomInAminoacidSerial);
                        seqAminoacids.Add(lastResidueSeq, currentAminoacidInProtein);
                        atomInAminoacidPos    = new Dictionary <AtomInAminoacid, Vector3>();
                        atomInAminoacidSerial = new Dictionary <AtomInAminoacid, int>();
                        completeLastAminoacid = true;
                    }
                    else
                    {
                        completeLastAminoacid = false;
                        //record[16]是第17列,是用来标记同分异构体的,同分异构体的数据所在的行 在PDB文件里是挨在一起的,只需要显示同一种氨基酸的
                        //同分异构体里的一种异构体氨基酸就可以了,所以只需要PDB文件里的一种异构体氨基酸数据行。
                        if (record[16] != altloc)
                        {
                            continue; //若当前可替换标识符不是默认则跳过当前记录行
                        }
                    }

                    chainId = record.Substring(21, 1); //22
                    altloc  = record[16];              //17
                    resName = record.Substring(17, 3); //18-20

                    //原子相关部分
                    string  atomName   = record.Substring(12, 4).Trim();              //13-16
                    int     atomSerial = int.Parse(record.Substring(6, 5).Trim());    //7-11
                    float   x          = float.Parse(record.Substring(30, 8).Trim()); //31-38
                    float   y          = float.Parse(record.Substring(38, 8).Trim()); //39-46
                    float   z          = float.Parse(record.Substring(46, 8).Trim()); //47-54
                    Vector3 pos        = new Vector3(x, y, z);
                    if (minPos == Vector3.zero)
                    {
                        minPos = pos;
                    }
                    if (maxPos == Vector3.zero)
                    {
                        maxPos = pos;
                    }
                    if (x > maxPos.x)
                    {
                        maxPos.x = x;
                    }
                    if (y > maxPos.y)
                    {
                        maxPos.y = y;
                    }
                    if (z > maxPos.z)
                    {
                        maxPos.z = z;
                    }
                    if (x < minPos.x)
                    {
                        minPos.x = x;
                    }
                    if (y < minPos.y)
                    {
                        minPos.y = y;
                    }
                    if (z < minPos.z)
                    {
                        minPos.z = z;
                    }
                    if (atomName == "OXT")
                    {
                        oxt = new OXTAtom(atomSerial, pos);
                    }
                    else
                    {
                        atomInAminoacidPos.Add(Aminoacid.Generate(resName)[atomName], pos);
                        atomInAminoacidSerial.Add(Aminoacid.Generate(resName)[atomName], atomSerial);
                    }
                }
                else if (title.StartsWith("TER"))
                {                                                           //链结束,TER是判断链是否结束的标志位
                    //氨基酸残基结算
                    residueSeq = int.Parse(record.Substring(22, 4).Trim()); //23-26列:残基序列号用来记录当前氨基酸残基的序列号
                    currentAminoacidInProtein = new AminoacidInProtein(altloc, resName, chainId, residueSeq, atomInAminoacidPos, atomInAminoacidSerial);
                    seqAminoacids.Add(residueSeq, currentAminoacidInProtein);
                    atomInAminoacidPos    = new Dictionary <AtomInAminoacid, Vector3>();
                    atomInAminoacidSerial = new Dictionary <AtomInAminoacid, int>();
                    completeLastAminoacid = true;

                    //肽链结算
                    Chain chain = new Chain(chainId, seqAminoacids, oxt);
                    oxt           = null;
                    seqAminoacids = new Dictionary <int, AminoacidInProtein>();
                    chains.Add(chain.ID, chain);
                }
                else if (title.StartsWith("HETATM"))
                { //非标准残基
                }
                else if (title.StartsWith("CONECT"))
                { //非标准残基间的原子连接关系
                }
            }
            centerPos = new Vector3((minPos.x + maxPos.x) / 2, (minPos.y + maxPos.y) / 2, (minPos.z + maxPos.z) / 2);
            Protein protein = new Protein(id, classification, publishDate, chains, centerPos);
            GetModel <PdbLoaderModel>().ProteinData = protein;
            Debug.Log("读取pdb完成");
        }
    }