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(" ! ")); }
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); }
public ProteinCarbonRangePredictor() { var aas = new Aminoacids(); this.maxCarbonPercentAminoacid = aas.GetMaxCarbonPercentAminoacid(); this.minCarbonPercentAminoacid = aas.GetMinCarbonPercentAminoacid(); }
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完成"); } }