/// <summary> /// /// </summary> /// <param name="domainInterfaceId"></param> /// <param name="domainInterfaceTable"></param> /// <param name="pdbpfamTable"></param> /// <param name="chainAtomsHash"></param> /// <returns></returns> private DomainInterface ReadIntraDomainInterfaceFromChain(int domainInterfaceId, DataTable domainInterfaceTable, DataTable pdbpfamTable, Dictionary <string, ChainAtoms> chainAtomsHash) { DomainInterface domainInterface = new DomainInterface(); DataRow[] domainInterfaceRows = domainInterfaceTable.Select(string.Format("DomainInterfaceID = '{0}'", domainInterfaceId)); if (domainInterfaceRows.Length > 0) { long domainId1 = Convert.ToInt64(domainInterfaceRows[0]["DomainID1"].ToString()); long domainId2 = Convert.ToInt64(domainInterfaceRows[0]["DomainID2"].ToString()); string asymChain = domainInterfaceRows[0]["AsymChain1"].ToString().TrimEnd(); if (chainAtomsHash.ContainsKey(asymChain)) { ChainAtoms chain = chainAtomsHash[asymChain]; Range[] domainRanges1 = GetDomainRange(pdbpfamTable, domainId1); Range[] domainRanges2 = GetDomainRange(pdbpfamTable, domainId2); domainInterface.domainInterfaceId = domainInterfaceId; domainInterface.firstSymOpString = asymChain + "_1_555"; domainInterface.secondSymOpString = asymChain + "_1_555"; domainInterface.domainId1 = domainId1; domainInterface.domainId2 = domainId2; domainInterface.chain1 = GetDomainAtoms(chain.CartnAtoms, domainRanges1); domainInterface.chain2 = GetDomainAtoms(chain.CartnAtoms, domainRanges2); domainInterface.GetInterfaceResidueDist(); } } return(domainInterface); }
/// <summary> /// /// </summary> /// <param name="thisEntryCrystal"></param> /// <param name="asymChain"></param> /// <param name="threeLetterSeq"></param> /// <returns></returns> private AtomInfo[] ReadChainAtoms(EntryCrystal thisEntryCrystal, string asymChain, out string threeLetterSeq) { ChainAtoms chain = null; threeLetterSeq = ""; for (int i = 0; i < thisEntryCrystal.atomCat.ChainAtomList.Length; i++) { if (thisEntryCrystal.atomCat.ChainAtomList[i].AsymChain == asymChain) { chain = thisEntryCrystal.atomCat.ChainAtomList[i]; break; } } for (int i = 0; i < thisEntryCrystal.entityCat.EntityInfoList.Length; i++) { EntityInfo entityInfo = thisEntryCrystal.entityCat.EntityInfoList[i]; string[] asymChains = entityInfo.asymChains.Split(','); if (asymChains.Contains(asymChain)) { threeLetterSeq = entityInfo.threeLetterSeq; } } if (chain == null) { return(null); } AtomInfo[] chainAtoms = chain.CartnAtoms; return(chainAtoms); }
/// <summary> /// atom coordinates for domains /// A SCOP domain may have multiple segmentations /// </summary> /// <param name="chain"></param> /// <param name="ranges"></param> /// <returns></returns> private AtomInfo[] GetDomainAtoms(ChainAtoms chain, string rangeString) { AtomInfo[] domainAtoms = null; List <AtomInfo> domainAtomList = new List <AtomInfo> (); int startPos = -1; int endPos = -1; int seqId = -1; string[] ranges = rangeString.Split(';'); foreach (string range in ranges) { if (range == "-") { domainAtoms = chain.CartnAtoms; } else { string[] posFields = range.Split('-'); startPos = ParseHelper.ConvertSeqToInt(posFields[0]); endPos = ParseHelper.ConvertSeqToInt(posFields[1]); foreach (AtomInfo atom in chain.CartnAtoms) { seqId = ParseHelper.ConvertSeqToInt(atom.seqId); if (seqId >= startPos && seqId <= endPos) { domainAtomList.Add(atom); } } } } return(domainAtomList.ToArray()); }
/// <summary> /// atoms for each domain /// </summary> /// <param name="pdbId"></param> /// <param name="chainId"></param> /// <param name="domainRangesHash"></param> /// <returns></returns> public Dictionary <string, AtomInfo[]> ReadAtomsOfDomains(string pdbId, string chainId, Dictionary <string, string> domainRangesHash) { string xmlFile = Path.Combine(ProtCidSettings.dirSettings.coordXmlPath, pdbId + ".xml.gz"); string crystalXmlFile = ParseHelper.UnZipFile(xmlFile, ProtCidSettings.tempDir); // read data from crystal xml file EntryCrystal thisEntryCrystal; XmlSerializer xmlSerializer = new XmlSerializer(typeof(EntryCrystal)); FileStream xmlFileStream = new FileStream(crystalXmlFile, FileMode.Open); thisEntryCrystal = (EntryCrystal)xmlSerializer.Deserialize(xmlFileStream); xmlFileStream.Close(); Dictionary <string, AtomInfo[]> domainAtomsHash = new Dictionary <string, AtomInfo[]>(); ChainAtoms chain = null; for (int i = 0; i < thisEntryCrystal.atomCat.ChainAtomList.Length; i++) { if (thisEntryCrystal.atomCat.ChainAtomList[i].AsymChain == chainId) { chain = thisEntryCrystal.atomCat.ChainAtomList[i]; } } foreach (string DomainID in domainRangesHash.Keys) { string rangeString = (string)domainRangesHash[DomainID]; domainAtomsHash.Add(DomainID, GetDomainAtoms(chain, rangeString)); } return(domainAtomsHash); }
// so it doesn't depend on the Appsetting // added on Sept. 22, 2016 /// <summary> /// /// </summary> /// <param name="pdbId"></param> /// <param name="asymChain"></param> /// <returns></returns> public AtomInfo[] ReadChainAtomsFromFile(string coordXmlFile, string asymChain) { if (asymChain == "") { return(null); } // read data from crystal xml file EntryCrystal thisEntryCrystal; XmlSerializer xmlSerializer = new XmlSerializer(typeof(EntryCrystal)); FileStream xmlFileStream = new FileStream(coordXmlFile, FileMode.Open); thisEntryCrystal = (EntryCrystal)xmlSerializer.Deserialize(xmlFileStream); xmlFileStream.Close(); ChainAtoms chain = null; for (int i = 0; i < thisEntryCrystal.atomCat.ChainAtomList.Length; i++) { if (thisEntryCrystal.atomCat.ChainAtomList[i].AsymChain == asymChain) { chain = thisEntryCrystal.atomCat.ChainAtomList[i]; break; } } if (chain == null) { return(null); } AtomInfo[] chainAtoms = chain.CartnAtoms; return(chainAtoms); }
/// <summary> /// /// </summary> /// <param name="pdbId"></param> /// <param name="asymChain"></param> /// <returns></returns> public AtomInfo[] ReadChainAtoms(string pdbId, string asymChain) { if (asymChain == "") { return(null); } string xmlFile = Path.Combine(ProtCidSettings.dirSettings.coordXmlPath, pdbId + ".xml.gz"); string crystalXmlFile = ParseHelper.UnZipFile(xmlFile, ProtCidSettings.tempDir); // read data from crystal xml file EntryCrystal thisEntryCrystal; XmlSerializer xmlSerializer = new XmlSerializer(typeof(EntryCrystal)); FileStream xmlFileStream = new FileStream(crystalXmlFile, FileMode.Open); thisEntryCrystal = (EntryCrystal)xmlSerializer.Deserialize(xmlFileStream); xmlFileStream.Close(); ChainAtoms chain = null; for (int i = 0; i < thisEntryCrystal.atomCat.ChainAtomList.Length; i++) { if (thisEntryCrystal.atomCat.ChainAtomList[i].AsymChain == asymChain) { chain = thisEntryCrystal.atomCat.ChainAtomList[i]; break; } } File.Delete(crystalXmlFile); if (chain == null) { return(null); } AtomInfo[] chainAtoms = chain.CartnAtoms; return(chainAtoms); }
/// <summary> /// /// </summary> /// <param name="chain1"></param> /// <param name="chain2"></param> /// <param name="modelType">local, or global</param> /// <returns></returns> public StructAlignOutput AlignTwoChains(ChainAtoms chain1, ChainAtoms chain2, string modelType) { AtomInfo[] calphaAtoms1 = chain1.CalphaAtoms(); AtomInfo[] calphaAtoms2 = chain2.CalphaAtoms(); StructAlignOutput alignOutput = AlignTwoSetsAtoms(calphaAtoms1, calphaAtoms2, modelType); return(alignOutput); }
/// <summary> /// write the interactive chains into a pdb formated text file /// </summary> /// <param name="pdbId"></param> /// <param name="interChains"></param> public string WriteBiolUnitFile(string pdbId, string buId, Dictionary <string, AtomInfo[]> buChains, string destDir, DataTable asuInfoTable, string type) { string fileName = Path.Combine(destDir, pdbId + "_" + buId + "." + type); FileStream fileStream = new FileStream(Path.Combine(filePath, fileName), FileMode.Create, FileAccess.Write); StreamWriter fileWriter = new StreamWriter(fileStream); string header = "HEADER " + pdbId + " " + DateTime.Today; fileWriter.WriteLine(header); List <string> chainSymOpList = new List <string> (buChains.Keys); chainSymOpList.Sort(); string[] chainSymOpStrs = new string[chainSymOpList.Count]; chainSymOpList.CopyTo(chainSymOpStrs); // string[] chainSymOpStrs = SortChainSymOpList(chainSymOpList); Dictionary <string, string> asymPolymerTypeHash = GetAsymChainPolymerTypeHash(asuInfoTable); string chainRemarkString = GetChainComponentRemarkString(chainSymOpStrs, asuInfoTable, type); fileWriter.WriteLine(chainRemarkString); bool isChainLigand = false; int atomId = 0; int count = 0; try { string preSymOpNum = "0"; foreach (string chain in chainSymOpStrs) { string[] fields = chain.Split('_'); string symOpNum = fields[1]; if (preSymOpNum != symOpNum) { atomId = 0; } isChainLigand = IsChainLigand(fields[0], asymPolymerTypeHash); ChainAtoms buChain = new ChainAtoms(); buChain.CartnAtoms = (AtomInfo[])buChains[chain]; buChain.SortByAtomId(); string chainId = letters[count % letters.Length].ToString(); WriteOneChain(buChain.CartnAtoms, chainId, ref atomId, isChainLigand, fileWriter); count++; preSymOpNum = symOpNum; } fileWriter.WriteLine("END"); } catch (Exception ex) { string errorMsg = ex.Message; throw ex; } finally { fileWriter.Close(); } return(fileName); }
/// <summary> /// write the interactive chains into a pdb formated text file /// </summary> /// <param name="pdbId"></param> /// <param name="interChains"></param> public string WriteBiolUnitFile(string pdbId, string buId, Dictionary <string, AtomInfo[]> buChains, string destDir, string remark, string type) { string fileName = Path.Combine(destDir, pdbId + "_" + buId + "." + type); FileStream fileStream = new FileStream(Path.Combine(filePath, fileName), FileMode.Create, FileAccess.Write); StreamWriter fileWriter = new StreamWriter(fileStream); string header = "HEADER " + pdbId + " " + DateTime.Today; fileWriter.WriteLine(header); fileWriter.WriteLine(remark); List <string> chainSymOpList = new List <string> (buChains.Keys); string[] chainSymOpStrs = SortChainSymOpList(chainSymOpList); int atomId = 0; int count = 0; try { string preSymOpNum = "0"; foreach (string chain in chainSymOpStrs) { string[] fields = chain.Split('_'); string symOpNum = fields[1]; if (preSymOpNum != symOpNum) { atomId = 0; } ChainAtoms buChain = new ChainAtoms(); buChain.CartnAtoms = (AtomInfo[])buChains[chain]; buChain.SortByAtomId(); string chainId = letters[count % letters.Length].ToString(); WriteOneChain(buChain.CartnAtoms, chainId, ref atomId, fileWriter); count++; preSymOpNum = symOpNum; } fileWriter.WriteLine("END"); } catch (Exception ex) { string errorMsg = ex.Message; throw ex; } finally { fileWriter.Close(); } return(fileName); }
/// <summary> /// /// </summary> /// <param name="pdbId"></param> /// <param name="asuChains"></param> /// <param name="destDir"></param> /// <param name="remark"></param> /// <returns></returns> public string WriteAsymUnitFile(string pdbId, Dictionary <string, AtomInfo[]> asuChainsHash, string[] asymChainsInOrder, string[] fileChainsInOrder, string[] nonpolymerAsymChains, string destDir, string remark) { string fileName = Path.Combine(destDir, pdbId + ".ent"); FileStream fileStream = new FileStream(Path.Combine(filePath, fileName), FileMode.Create, FileAccess.Write); StreamWriter fileWriter = new StreamWriter(fileStream); string header = "HEADER " + pdbId + " " + DateTime.Today; fileWriter.WriteLine(header); fileWriter.WriteLine(remark); int atomId = 0; int chainCount = 0; string fileChain = ""; bool nonpolymerChain = false; try { foreach (string asymChain in asymChainsInOrder) { nonpolymerChain = false; ChainAtoms asuChain = new ChainAtoms(); asuChain.CartnAtoms = asuChainsHash[asymChain]; asuChain.SortByAtomId(); fileChain = fileChainsInOrder[chainCount]; if (Array.IndexOf(nonpolymerAsymChains, asymChain) > -1) { nonpolymerChain = true; } WriteOneChain(asuChain.CartnAtoms, fileChain, ref atomId, nonpolymerChain, fileWriter); chainCount++; } fileWriter.WriteLine("END"); } catch (Exception ex) { string errorMsg = ex.Message; throw ex; } finally { fileWriter.Close(); } return(fileName); }
/// <summary> /// /// </summary> /// <param name="domainEntityInfo"></param> /// <param name="chainInfo"></param> /// <returns></returns> private AtomInfo[] GetDomainSegmentAtoms(DomainSegmentInfo domainEntityInfo, ChainAtoms chainInfo) { ArrayList domainAtomList = new ArrayList(); int seqId = -1; foreach (AtomInfo atom in chainInfo.CartnAtoms) { seqId = Convert.ToInt16(atom.seqId); if (seqId >= domainEntityInfo.seqStart && seqId <= domainEntityInfo.seqEnd) { // AddAtomToList(atom, domainAtomList); domainAtomList.Add(atom); } } AtomInfo[] domainAtoms = new AtomInfo[domainAtomList.Count]; domainAtomList.CopyTo(domainAtoms); return(domainAtoms); }
/// <summary> /// /// </summary> /// <param name="pdbId"></param> /// <param name="asuChains"></param> /// <param name="destDir"></param> /// <param name="remark"></param> /// <returns></returns> public void WriteAsymUnitFile(string coordFileName, Dictionary <string, AtomInfo[]> asuChainsHash, string[] asymChainsInOrder, string[] fileChainsInOrder, string[] hetChains, string remark) { FileStream fileStream = new FileStream(coordFileName, FileMode.Create, FileAccess.Write); StreamWriter fileWriter = new StreamWriter(fileStream); fileWriter.WriteLine(remark); int atomId = 0; int chainCount = 0; string fileChain = ""; bool isHetatmChain = false; try { foreach (string asymChain in asymChainsInOrder) { isHetatmChain = false; if (asuChainsHash.ContainsKey(asymChain)) { ChainAtoms asuChain = new ChainAtoms(); asuChain.CartnAtoms = asuChainsHash[asymChain]; asuChain.SortByAtomId(); fileChain = fileChainsInOrder[chainCount]; if (Array.IndexOf(hetChains, asymChain) > -1) { isHetatmChain = true; } WriteOneChain(asuChain.CartnAtoms, fileChain, ref atomId, isHetatmChain, fileWriter); chainCount++; } } fileWriter.WriteLine("END"); } catch (Exception ex) { string errorMsg = ex.Message; throw ex; } finally { fileWriter.Close(); } }
/// <summary> /// /// </summary> /// <param name="pdbId"></param> /// <param name="asymChain"></param> /// <returns></returns> public AtomInfo[] ReadChainAtomsFromFile(string coordXmlFile, string asymChain, out string threeLetterSeq) { threeLetterSeq = ""; if (asymChain == "") { return(null); } // read data from crystal xml file EntryCrystal thisEntryCrystal; XmlSerializer xmlSerializer = new XmlSerializer(typeof(EntryCrystal)); FileStream xmlFileStream = new FileStream(coordXmlFile, FileMode.Open); thisEntryCrystal = (EntryCrystal)xmlSerializer.Deserialize(xmlFileStream); xmlFileStream.Close(); ChainAtoms chain = null; for (int i = 0; i < thisEntryCrystal.atomCat.ChainAtomList.Length; i++) { if (thisEntryCrystal.atomCat.ChainAtomList[i].AsymChain == asymChain) { chain = thisEntryCrystal.atomCat.ChainAtomList[i]; break; } } for (int i = 0; i < thisEntryCrystal.entityCat.EntityInfoList.Length; i++) { EntityInfo entityInfo = thisEntryCrystal.entityCat.EntityInfoList[i]; string[] asymChains = entityInfo.asymChains.Split(','); if (asymChains.Contains(asymChain)) { threeLetterSeq = entityInfo.threeLetterSeq; } } if (chain == null) { return(null); } AtomInfo[] chainAtoms = chain.CartnAtoms; return(chainAtoms); }
/// <summary> /// /// </summary> /// <param name="thisEntryCrystal"></param> /// <param name="asymChain"></param> /// <returns></returns> private AtomInfo[] ReadChainAtoms(EntryCrystal thisEntryCrystal, string asymChain) { ChainAtoms chain = null; for (int i = 0; i < thisEntryCrystal.atomCat.ChainAtomList.Length; i++) { if (thisEntryCrystal.atomCat.ChainAtomList[i].AsymChain == asymChain) { chain = thisEntryCrystal.atomCat.ChainAtomList[i]; break; } } if (chain == null) { return(null); } AtomInfo[] chainAtoms = chain.CartnAtoms; return(chainAtoms); }
/// <summary> /// /// </summary> /// <param name="pdbId"></param> /// <param name="asuChains"></param> /// <param name="destDir"></param> /// <param name="remark"></param> /// <returns></returns> public string WriteAsymUnitFile(string pdbId, Dictionary <string, AtomInfo[]> asuChainsHash, string destDir, string remark) { string fileName = Path.Combine(destDir, pdbId + ".ent"); FileStream fileStream = new FileStream(Path.Combine(filePath, fileName), FileMode.Create, FileAccess.Write); StreamWriter fileWriter = new StreamWriter(fileStream); string header = "HEADER " + pdbId + " " + DateTime.Today; fileWriter.WriteLine(header); fileWriter.WriteLine(remark); List <string> asymChainList = new List <string>(asuChainsHash.Keys); asymChainList.Sort(); int atomId = 0; try { foreach (string asymChain in asymChainList) { ChainAtoms asuChain = new ChainAtoms(); asuChain.CartnAtoms = asuChainsHash[asymChain]; asuChain.SortByAtomId(); WriteOneChain(asuChain.CartnAtoms, asymChain, ref atomId, fileWriter); } fileWriter.WriteLine("END"); } catch (Exception ex) { string errorMsg = ex.Message; throw ex; } finally { fileWriter.Close(); } return(fileName); }
/// <summary> /// atoms for each domain /// </summary> /// <param name="pdbId"></param> /// <param name="chainId"></param> /// <param name="domainRangesHash"></param> /// <returns></returns> public Dictionary <long, AtomInfo[]> ReadAtomsOfDomains(string pdbId, string chainId, Dictionary <long, string> domainRangesHash, Dictionary <string, ChainAtoms> chainAtomsHash) { Dictionary <long, AtomInfo[]> domainAtomsHash = new Dictionary <long, AtomInfo[]>(); ChainAtoms chain = null; foreach (string asymChain in chainAtomsHash.Keys) { if (asymChain == chainId) { chain = chainAtomsHash[asymChain]; } } foreach (long DomainID in domainRangesHash.Keys) { string rangeString = (string)domainRangesHash[DomainID]; AtomInfo[] domainAtoms = GetDomainAtoms(chain, rangeString); if (domainAtoms != null && domainAtoms.Length > 0) { domainAtomsHash.Add(DomainID, domainAtoms); } } return(domainAtomsHash); }
/// <summary> /// /// </summary> /// <param name="fileName"></param> /// <param name="pdbId"></param> /// <param name="chainAtomsHash"></param> /// <param name="remark"></param> /// <returns></returns> public string WriteAtoms(string fileName, string pdbId, Dictionary <string, AtomInfo[]> chainAtomsHash, string remark) { FileStream fileStream = new FileStream(fileName, FileMode.Create, FileAccess.Write); StreamWriter fileWriter = new StreamWriter(fileStream); string header = "Header " + pdbId.ToString() + " " + DateTime.Today.ToShortDateString(); fileWriter.WriteLine(header); fileWriter.WriteLine(remark); List <string> asymChainList = new List <string> (chainAtomsHash.Keys); asymChainList.Sort(); int atomId = 0; try { foreach (string asymChain in asymChainList) { ChainAtoms asuChain = new ChainAtoms(); asuChain.CartnAtoms = (AtomInfo[])chainAtomsHash[asymChain]; asuChain.SortByAtomId(); WriteOneChain(asuChain.CartnAtoms, asymChain, ref atomId, fileWriter); } fileWriter.WriteLine("END"); } catch (Exception ex) { string errorMsg = ex.Message; throw ex; } finally { fileWriter.Close(); } return(fileName); }
//extracts atoms from pdb file public static AtomCategory readPdbFile(string pdbfilename, ref Dictionary <Tuple <string, string>, double> partialCharges) { AtomCategory myAtomCategory = new AtomCategory(); ChainAtoms chainAtoms = new ChainAtoms(); ArrayList atomList = new ArrayList(); string preAsymId = ""; string asymID = ""; if (File.Exists(pdbfilename)) { using (StreamReader sr = new StreamReader(pdbfilename)) { String line; // Read and display lines from the file until the end of // the file is reached. Int32 seqID = -1; Int32 previousSeqID = -1; while ((line = sr.ReadLine()) != null) { string[] spLine = Array.FindAll <string>(((string)line).Split( new char[] { ' ', '\t', ',', ';' }), delegate(string s) { return(!String.IsNullOrEmpty(s)); }); List <string> splitLine = new List <string>(spLine); if (splitLine[0] == "HETATM" && splitLine[3] == "MSE") { splitLine[0] = "ATOM"; splitLine[3] = "MET"; } if (splitLine[0] == "ENDMDL") { break; } if (splitLine[0] == "ATOM") { AtomInfo myAtom = new AtomInfo(); asymID = line.Substring(21, 1); myAtom.altConfID = ""; myAtom.atomId = Convert.ToInt32(line.Substring(6, 5).Trim()); myAtom.atomName = line.Substring(12, 4).Trim(); myAtom.residue = line.Substring(17, 3); myAtom.authResidue = myAtom.residue; myAtom.authSeqId = line.Substring(22, 4).Trim(); if (Convert.ToInt32(myAtom.authSeqId) != previousSeqID) { seqID = seqID + 1; } myAtom.seqId = seqID.ToString(); previousSeqID = Convert.ToInt32(myAtom.authSeqId); AtomParser.Coordinate coord = new Coordinate(); coord = new Coordinate(Convert.ToDouble(line.Substring(30, 8).Trim()), Convert.ToDouble(line.Substring(38, 8).Trim()), Convert.ToDouble(line.Substring(46, 8).Trim())); myAtom.xyz = coord; myAtom.atomType = line.Substring(76, 2).Trim(); //This handful of conditions are occasionally different and throw off the check for hydrogen bonding, etc if (myAtom.atomName == "HG") { myAtom.atomName = "HG1"; } if (myAtom.atomName == "OG") { myAtom.atomName = "OG1"; } if ((myAtom.atomName == "NH1" && myAtom.residue == "ARG") || (myAtom.atomName == "NZ" && myAtom.residue == "LYS")) { myAtom.atomType = "N1+"; } if ((myAtom.atomName == "OD2" && myAtom.residue == "ASP") || (myAtom.atomName == "OE2" && myAtom.residue == "GLU")) { myAtom.atomType = "O1-"; } myAtom.bFac = Convert.ToDouble(line.Substring(60, 6).Trim()); myAtom.occupancy = 1.00; //Compare chain ID. If this is now a new chain, write existing list, and create empty new ones. if (preAsymId != asymID && preAsymId != "" && atomList.Count > 0) { chainAtoms.AsymChain = preAsymId; chainAtoms.AuthAsymChain = preAsymId; chainAtoms.EntityID = "1"; // problem with int to string in new version chainAtoms.PolymerType = "-"; AtomInfo[] atomArray = new AtomInfo[atomList.Count]; atomList.CopyTo(atomArray); chainAtoms.CartnAtoms = atomArray; myAtomCategory.AddChainAtoms(chainAtoms); atomList = new ArrayList(); chainAtoms = new ChainAtoms(); } //Add atom to current list of atoms if it is not a water molecule if (myAtom.residue.ToUpper() != "HOH") { if (myAtom.atomType == "H") { Tuple <string, string> key = new Tuple <string, string> (myAtom.residue, myAtom.atomName); if (partialCharges.ContainsKey(key) == true) { atomList.Add(myAtom); } } else { atomList.Add(myAtom); } } preAsymId = asymID; } } //Capture final chain if (atomList.Count > 0) { chainAtoms.AsymChain = preAsymId; chainAtoms.AuthAsymChain = preAsymId; chainAtoms.EntityID = "1"; chainAtoms.PolymerType = "-"; AtomInfo[] atomArray = new AtomInfo[atomList.Count]; atomList.CopyTo(atomArray); chainAtoms.CartnAtoms = atomArray; myAtomCategory.AddChainAtoms(chainAtoms); atomList = new ArrayList(); chainAtoms = new ChainAtoms(); } } } myAtomCategory.Resolution = 2.5; return(myAtomCategory); }
/// <summary> /// write the interactive chains into a pdb formated text file /// </summary> /// <param name="pdbId"></param> /// <param name="interChains"></param> public string WriteBiolUnitFile(string pdbId, string buId, Dictionary <string, AtomInfo[]> buChains, string destDir, CrystalInfo cryst1, Matrix fractMatrix) { string fileName = Path.Combine(destDir, pdbId + "_" + buId.ToString() + ".pdb"); FileStream fileStream = new FileStream(Path.Combine(filePath, fileName), FileMode.Create, FileAccess.Write); StreamWriter fileWriter = new StreamWriter(fileStream); string header = "HEADER " + pdbId + " " + DateTime.Today; fileWriter.WriteLine(header); string remark = "REMARK 290 "; int count = 0; List <string> chainSymOpList = new List <string> (buChains.Keys); string[] chainSymOpStrs = SortChainSymOpList(chainSymOpList); foreach (string chainAndSymOpStr in chainSymOpStrs) { string thisRemark = remark + letters[count].ToString() + ": "; // format of chainAndSymOpStr: chain_symOpNum_fullsymString string[] fields = chainAndSymOpStr.Split('_'); thisRemark += fields[0].PadRight(3, ' '); thisRemark += fields[1].PadRight(3, ' '); thisRemark += fields[2].PadRight(30, ' '); fileWriter.WriteLine(thisRemark); count++; } string crystString = FormatCrystString(cryst1); string fractString = FormatFractString(fractMatrix); fileWriter.WriteLine(crystString); fileWriter.WriteLine(fractString); int atomId = 0; count = 0; try { string preSymOpNum = "0"; foreach (string chain in chainSymOpStrs) { string[] fields = chain.Split('_'); string symOpNum = fields[1]; if (preSymOpNum != symOpNum) { atomId = 0; } ChainAtoms buChain = new ChainAtoms(); buChain.CartnAtoms = (AtomInfo[])buChains[chain]; buChain.SortByAtomId(); string chainId = letters[count % letters.Length].ToString(); WriteOneChain(buChain.CartnAtoms, chainId, ref atomId, fileWriter); count++; preSymOpNum = symOpNum; } fileWriter.WriteLine("END"); } catch (Exception ex) { string errorMsg = ex.Message; throw ex; } finally { fileWriter.Close(); } return(fileName); }