蛋白质PDB文件读取C++代码

VTK C++实战:从PDB文件到蛋白质三维可视化完整开发指南 科学可视化是连接原始数据与直观洞察的关键技术,其核心在于将复杂数据转化为可交互的图形表示。VTK(Visualization Toolkit)作为一套强大的开源可视化系统,通过其管线式架构,为数据处理、几何生成和渲染提供了完整的解决方案。在生物信息学与结构生物学领域,PDB文件作为存储蛋白质、核酸等生物大分子三维结构的标准格式,其可视化对于理解分子构象、功能及相互作用至关重要。利用VTK内置的vtkPDBReader和vtkProteinRibbonFilter等专业组件,开发者可以高效地将原子坐标文本数据 阅读详情

在生物信息学中,PDB数据库是非常重要的蛋白质结构数据库。PDB数据文件的读取是进行蛋白质结构相关预测的重要步骤!下面给出了简单的PDB文件读取的C++代码,以供参考:


#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <sstream>
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

class Residue {
public:
	vector<double*> atomxyzs;
	vector<string> atominfos;	// each element for example : "ATOM      1  N   GLU    98    "
	int caind;
	int cbind;
	int res_pos;
	int orig_res_pos;

	Residue(vector<double*> _atomxyzs, vector<string> _atominfos, int _caind, int _cbind, int _res_pos, int _orig_res_pos){
		atomxyzs = _atomxyzs;
		atominfos = _atominfos;
		caind = _caind;
		cbind = _cbind;
		res_pos = _res_pos;
		orig_res_pos = _orig_res_pos;
	}
};

class Protein{
private:
	string pdbpath;				// in
	vector<Residue> residues;	// out

public:
	Protein(string _pdbpath){
		pdbpath = _pdbpath;

		readPDB();
	}

	int size(){
		return residues.size();
	}

	Residue getIthResidue(int i){
		return residues[i];
	}

	int getIthResidueOriginalIndexInProt(int i){
		return residues[i].orig_res_pos;
	}

	double* getIthResidueCAXYZ(int i){
		return residues[i].atomxyzs[residues[i].caind];
	}

	double* getIthResidueCBXYZ(int i){
		return residues[i].atomxyzs[residues[i].cbind];
	}

	vector<Residue> getResidues(){
		return residues;
	}

	void save(vector<Residue> _residues, string savepath){
		ofstream fout(savepath);
		for (int i = 0; i < _residues.size(); i++){
			Residue res = _residues[i];
			for (int j = 0 ; j < res.atominfos.size(); j++){
				char temp[1000];

				string atominfo = res.atominfos[j];	// "ATOM      1  N   GLU    98    "
				double* xyz = res.atomxyzs[j];	//"  66.677"
				char xstr[9];
				char ystr[9];
				char zstr[9];
				sprintf(xstr, "%8.3f", xyz[0]);
				sprintf(ystr, "%8.3f", xyz[1]);
				sprintf(zstr, "%8.3f", xyz[2]);
				string useless = "  1.00  0.00";
				fout << atominfo << xstr << ystr << zstr << useless << endl;
			}
		}

		fout.close();
	}
	
	/*char* formatDouble(double v, int ch_num){
		char tmp[64];
		sprintf(tmp, "%8.3f %8.3f %8.3f\n", x[i][0], x[i][1], x[i][2]);
	}*/

private:
	void readPDB(){
		vector<int> atomindex;
		vector<string> atominfos;
		vector<double*> points;
		int ca_pos_in_res = 0;
		int cb_pos_in_res = 0;

		int pre_index = -9999999;
		ifstream fin(pdbpath);
		string line;
		getline(fin, line);
		string lastline(line);
		bool isFirstATOM = true;
		bool isContainCA = false;
		int tmp_pos = 0;
		int res_pos = 1;
		int atom_pos = 1;
		while (fin.good()){
			if (line.compare(0, 3, "TER")==0)
				break;
			if (line.compare(0, 4, "ATOM")==0){
				char cstr[50];
				double x = 0.0;
				strcpy(cstr, (line.substr(30, 8)).c_str());
				sscanf(cstr, "%lf", &x);

				double y = 0.0;
				strcpy(cstr, (line.substr(38, 8)).c_str());
				sscanf(cstr, "%lf", &y);

				double z = 0.0;
				strcpy(cstr, (line.substr(46, 8)).c_str());
				sscanf(cstr, "%lf", &z);

				double* xyz = new double[3];
				xyz[0] = x;
				xyz[1] = y;
				xyz[2] = z;

				string atominfo = line.substr(0, 30);	
				
				int now_index = -999999;
				strcpy(cstr, (line.substr(22, 4)).c_str());
				sscanf(cstr, "%d", &now_index);

				if (line.compare(13, 3, "CA ")==0){
					isContainCA = true;
					ca_pos_in_res = tmp_pos;

					if (isFirstATOM){
						pre_index = now_index;
					}
				}

				if (line.compare(13, 3, "CB ")==0){
					cb_pos_in_res = tmp_pos;
				}

				if (now_index != pre_index){
					if (isContainCA){
						if (pre_index != -9999999){
							Residue tmpResidue(points, atominfos, ca_pos_in_res, cb_pos_in_res, res_pos, pre_index);
							residues.push_back(tmpResidue);
							res_pos++;
						}
						points.clear();
						points.push_back(xyz);
						atominfos.clear();
						atominfos.push_back(atominfo);

						tmp_pos = 0;
						isContainCA = false;
						if (line.compare(13, 3, "CA ")==0){
							isContainCA = true;
						}
					}else{
						if (isFirstATOM){
							points.push_back(xyz);
							atominfos.push_back(atominfo);
						}
					}
					pre_index = now_index;
				}else{
					points.push_back(xyz);
					atominfos.push_back(atominfo);
				}

				isFirstATOM = false;

				tmp_pos++;
			}

			lastline = line;
			getline(fin, line);
		}

		if (isContainCA || lastline.length() >= 16 || lastline.compare(13, 3, "CA ")==0){
			Residue tmpResidue(points, atominfos, ca_pos_in_res, cb_pos_in_res, res_pos, pre_index);
			residues.push_back(tmpResidue);
		}
		
		fin.close();
	}
};


PDB多重身份解析:蛋白质数据库、Oracle可插拔数据库与程序调试文件 PDB作为技术领域常见的缩写,在不同场景下具有截然不同的含义。在结构生物学中,PDB(Protein Data Bank)是存储蛋白质三维结构的核心数据库,包含原子坐标等关键数据。数据库领域则指Oracle的可插拔数据库(Pluggable Database),实现多租户架构的资源隔离。开发调试场景下,PDB文件(Program Database)承载着Windows程序的调试符号信息。理解这些概念的区别对技术实践至关重要,比如通过Biopython库操作蛋白质PDB数据,或使用Visual Studio配 阅读详情

相关推荐

Acellera-proteinprepare:蛋白质预处理工具详解与应用

蛋白质预处理是计算生物学和分子模拟中的关键步骤,涉及加氢、质子化状态调整和缺失残基处理等技术。Acellera-proteinprepare作为Python生态中的专业工具,通过自动化这些繁琐步骤,显著提高了工作效率。其核心原理依赖于OpenBabel和RDKit等化学信息学工具,支持多种分子力场如Amber和CHARMM。在药物发现和结构生物学研究中,该工具能快速准备蛋白质结构用于分子动力学模拟,特别适用于GPCR等复杂蛋白体系。通过合理配置pH值和氢键优化参数,研究人员可以针对不同生理环境(如溶酶体或线

weixin_42548708的博客 309

c++可视化界面_生物信息学分析实用小技巧(二):蛋白质可视化

PyMOL可视化蛋白质写在前面的上次推文介绍了如何用多种方法批量快速下载高通量测序数据,主要介绍了Aspera的用法和axel用法。这里再额外提一句,Aspera的使用需要足够的学习,学会如何解决报错,如何解决网络协议问题。 这次我再介绍一个简单使用的软件——PyMOL的使用,昨天晚上,我的好朋友反馈给我说这个软件教程密密麻麻一堆,不知道如何下手。因为她的任务是做蛋白质结构...

weixin_39604897的博客 690

药物对接仿真软件:Rosetta_(1).Rosetta软件概述

创建模块文件在目录下创建一个新的C++文件,例如。实现模块功能在模块文件中实现自定义的功能。public:// 获取评分函数// 创建任务工厂// 创建任务// 获取侧链集合// 调整侧链// 注册模块选项// 注册模块// 注册模块编译模块将自定义模块文件添加到Rosetta的编译系统中。可以通过编辑文件,添加自定义模块的路径和文件名。在重新编译Rosettamake -j4创建协议文件在目录下创建一个新的XML协议文件,例如。定义协议步骤。

kkchenjj的博客 803

PDB文件概说

  文/玄魂 .PDB文件,全称为“程序数据库”文件。我们使用它(更确切的说是看到它被应用)大多数场景是调试应用程序。目前我们对.PDB文件的普遍认知是它存储了被编译文件的调试信息,作为符号文件存在。那么,它具体包含哪些内容呢?在调试过程中是怎样发挥作用的呢?我们有没有办法去操作这个文件呢? 1. PDB文件内容 .PDB文件的内部格式,微软并没有公开,现在仍然是一个秘密,但是它提供了相关...

weixin_33721427的博客 624

reflector:C++ 的反射系统(从 PDB 文件中提取信息)

反射器 C++ 反射系统(从 PDB 文件中提取信息)更多信息: :

读取PDB文件

读取PDB中重原子坐标,并以一定格式输出

微软提供的解析 PDB 文件的源代码的使用方法

微软提供的解析 PDB 文件的源代码的使用方法: 管理员启动 CMD, 输入: regsvr32.exe “C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\DIA SDK\bin\msdia140.dll” 注意路径不同. 在 F:\VS2019\DIA SDK\Samples\DIA2Dump 找到源代码, 编译可用. ...

Aaron的博客 2231

使用matlab读写PDB文件:这两个程序接受并输出各种PDB文件格式的数据-matlab开发

这两个程序都使用数据结构来存储有关 PDB 的信息。 我发现这些程序对于处理PDB和可视化3D点信息都是有用的 -- 用法示例:绘制 3IJU.pdb 的原子 -- PDBdata = pdb2mat('3IJU.pdb'); % 从 PDB 文件读入数据plot3(PDBdata.X, PDBdata.Y, PDBdata.Z, '.'); % 绘制数据的 3D 图-- 用法示例:将 3IJU.pdb 的原子沿 x 方向平移 10 埃 -- PDBdata = pdb2mat('3IJU.pdb'); % 从 PDB 文件读入数据PDBdata.X = PDBdata.X + 10; % 平移坐标PDBdata.outfile = '3IJU_tran10angXdir.pdb'; % 更新文件名mat2pdb(PDBdata); % 以 PDB 格式输出数据 -- 示例用法:在一个

调试之pdb文件(C++)

pdb:program database 一、内容  * public,private 和static函数地址;  * 全局变量的名字和地址;  * 参数和局部变量的名字和在堆栈的偏移量;  * class,structure 和数据的类型定义;  * Frame Pointer Omission 数据,用来在x86上的native堆栈的遍历;  * 源代码文件的名字和行数;

HITXuQin的专栏 8870

ifix eda 读写查 pdb 代码

针对ifix 的过程数据库,通过api eda 方式进行点的增加、删除、修改、查询等。

手把手教学|用飞书+扣子工作流实现自动化批量图片生成,效率提升99%!体验完整操作流程

在先前的文章中,我们已经深入探讨了扣子智能体的多种应用场景,以及如何创建和使用工作流进行高效管理。本文将引领大家通过一个具体案例,将扣子的工作流功能嵌入飞书应用中,实现操作的自动化与高效化。

weixin_66485800的博客 6028

【亲测免费】 reduce:为PDB文件添加和修正氢原子的工具

reduce:为PDB文件添加和修正氢原子的工具 项目介绍 在现代生物科学研究中,蛋白质结构分析是至关重要的一环。reduce 是一款开源工具,专注于为蛋白质数据银行(PDB)文件添加和修正氢原子。这一功能对于理解蛋白质的三维结构以及进行分子动力学模拟和量子化学计算至关重要。reduce 通过优化处理,确保每个原子周围都有正确数量的氢原子,以实现准确的模型构建。 项目技术分析 reduce 的技术...

gitblog_00346的博客 668

Xilinx的DDR4 IP

Xilinx的DDR4 IP

weixin_39896700的博客 4456

dssp:标准化蛋白质二级结构赋值工具

dssp:标准化蛋白质二级结构赋值工具 项目介绍 dssp 是一个开源的蛋白质二级结构赋值程序,旨在为蛋白质数据库(PDB)中的所有蛋白质条目提供标准的二级结构信息。该程序由 Wolfgang Kabsch 和 Chris Sander 设计,并不断发展以支持更广泛的功能。最新版本的 dssp 4.4 提供了全 mmCIF 支持,并引入了对多聚脯氨酸螺旋的定义。 项目技术分析 dssp 程序使用 ...

gitblog_00777的博客 955

RAID 0/1/5/10 性能实测:4块 SATA SSD 组阵列,顺序读写速度对比

本文通过实测对比了RAID 0/1/5/10在4块SATA SSD上的顺序读写性能,详细展示了不同RAID级别的配置方法、理论性能与实际测试数据。测试结果显示,RAID 0在顺序读写速度上表现最佳,而RAID 10则在性能与数据安全之间取得了平衡,适合数据库服务器等关键应用场景。

weixin_33462167的博客 423

OpenEuler内核编译及替换

一、内核源码下载 在gitee上下载OpenEuler内核源码 下载地址 选择需要的内核版本源码压缩包进行下载 二、内核编译 1.解压缩 将下载好的源码进行解压 tar xvf openeuler-kernel-4.19.90-2107.1.0.tar.gz 2.清理源代码树 解压后得到一个名为kernel的内核源码文件夹,进入后执行命令 make mrproper 清理过去内核编译产生的config,第一次编译时可不执行此命令 3.生成内核配置文件.config 先将将系统原配置文件拷贝过来,原

m0_56602092的博客 2万+

(48)VTK C++开发示例 --- 加载PDB(Protein Data Bank)文件

本文介绍了使用VTK库读取和可视化PDB格式分子结构文件的方法。通过vtkPDBReader读取文件后,利用vtkSphereSource创建原子球体模型,并通过vtkGlyph3D映射原子数据。化学键则用vtkTubeFilter生成管状结构表示。程序可根据原子数量动态调整分辨率,支持氢键和B因子缩放。提供了完整的CMake配置和C++实现代码,适用于Windows和Linux系统,需要VTK 9.4.1环境。示例使用咖啡因分子结构文件演示了3D分子可视化效果。

mahuifa的博客 634

YOLOv13改进策略【特征提取层】| 引入注意力卷积模块RFAConv,关注感受野空间特征 助力yolov13精度提升

RFAConv:创新空间注意力和标准卷积运算感受野空间特征是针对卷积核设计的,根据卷积核大小动态生成。以3×3卷积核为例,它由非重叠滑动窗口组成,每个窗口代表一个感受野滑块。

Limiiiing的博客 359

pdb学习1

前言: … 目录1 PDB调试命令2 关键命令3 调试示例3.1 示例13.2 示例24 补充 1 PDB调试命令 2 关键命令 1.断点设置 (Pdb) b 10 # 断点设置在本py的第10行 (Pdb) b test.py:20 # 断点设置到 test.py第20行 2.删除断点 (Pdb) b # 查看断点编号 (Pdb) cl 2 # 删除第2个断点 3.运行 (Pdb) n # 单步运行 (Pdb) s # 细点运行 也就是遇到函数、方法会进入里面 (Pdb) c .

qq_36783816的博客 323

[AI] 企业内网部署大模型的三种常见方案:从“能用”到“好用”的技术选型指南

企业内网部署大模型的三种方案解析:本地模型安全但门槛高,平台方案(如Dify)最平衡推荐,混合架构适合进阶需求。关键路径是渐进式演进,从快速验证到平台化建设,核心在于流程优化而非单纯选模型。数据安全、成本可控和工程落地能力是决策重点。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 768

【Bug已解决】Codex CLI 报错 apply_patch 失败:无法应用补丁的解决方案

方案适用场景推荐指数统一换行符规范跨平台协作项目的标准配置⭐⭐⭐⭐⭐关闭自动格式化冲突IDE 与 Codex 并发编辑同一文件⭐⭐⭐⭐缩小任务改动范围长期有效的使用习惯优化⭐⭐⭐⭐⭐统一 UTF-8 编码涉及非 UTF-8 遗留文件的项目⭐⭐⭐提示重新读取文件单次失败后的快速恢复方式⭐⭐⭐⭐报错的本质是Codex 生成补丁时读取的文件内容,与实际应用补丁时磁盘上的文件内容出现了不一致,常见诱因包括换行符风格混用、文件被其他工具并发修改、编码问题等。

一键难忘的博客 7289

分子对接PyRasetta--Pose

分子对接PyRasetta--Pose

weixin_53637133的博客 1008

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

MMTF-CPP 开源项目指南

MMTF-CPP 开源项目指南 项目介绍 MMTF-CPP 是一个纯 C++ 实现的 MMTF(Macromolecular Transmission Format)API,它提供了编解码器功能,专为处理生物大分子结构数据设计。该库基于 MIT 许可证发布,旨在为数据科学家提供高效、便捷的工具来解析和操作MMTF文件格式。MMTF是一种压缩的文件格式,用于存储蛋白质、DNA和RNA等的大分子结构数...

gitblog_00748的博客 420

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

MMTF-CPP:高效处理生物大分子结构的开源利器

MMTF-CPP:高效处理生物大分子结构的开源利器 项目介绍 MMTF-CPP 是一个用于处理生物大分子结构数据的C++库,基于 MacroMolecular Transmission Format (MMTF) 格式。MMTF是一种二进制编码格式,专为高效传输和存储生物大分子结构数据而设计。该项目提供了C++03兼容的API,支持MMTF格式的编码和解码,适用于需要高效处理生物大分子结构数据的科...

gitblog_00220的博客 660

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

AlphaFold 3测试数据集构建:从PDB到自定义案例

在计算生物学领域,测试数据集的质量直接影响模型验证的可靠性。AlphaFold 3作为蛋白质结构预测的革命性工具,其测试数据集的构建需要兼顾实验数据的真实性与算法验证的针对性。本文将系统介绍如何从PDB(蛋白质数据库)文件出发,构建符合AlphaFold 3推理 pipeline 要求的测试数据集,解决数据格式转换、特征工程和案例定制中的核心痛点。 ## 测试数据集的核心构成 AlphaFol

gitblog_00384的博客 1136
上一篇: If your Linux has some problem, this file could help you.
下一篇: 差分进化算法(Differential Evolution) JAVA代码样例
Jun-H
博客等级 码龄16年 123粉丝 61原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jun-H

你的鼓励是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值