32
VISUALIZAÇÃO DE FICHEIROS PDB E GRAVAÇÃO DE FICHEIROS MON

VISUALIZAÇÃO DE FICHEIROS PDB E GRAVAÇÃO DE FICHEIROS …tavares/ensino/VISCI/Trabalhos/2003-2004... · A leitura do ficheiro pdb, representação gráfica da molécula que permite

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: VISUALIZAÇÃO DE FICHEIROS PDB E GRAVAÇÃO DE FICHEIROS …tavares/ensino/VISCI/Trabalhos/2003-2004... · A leitura do ficheiro pdb, representação gráfica da molécula que permite

VISUALIZAÇÃO DE FICHEIROS PDB

E

GRAVAÇÃO DE FICHEIROS MON

Page 2: VISUALIZAÇÃO DE FICHEIROS PDB E GRAVAÇÃO DE FICHEIROS …tavares/ensino/VISCI/Trabalhos/2003-2004... · A leitura do ficheiro pdb, representação gráfica da molécula que permite

UNIVERSIDADE DO PORTO FACULDADE DE ENGENHARIA

MESTRADO EM MÉTODOS COMPUTACIONAIS EM CIÊNCIA E ENGENHARIA

VISUALIZAÇÃO CIENTÍFICA

VISUALIZAÇÃO DE FICHEIROS PDB

E

GRAVAÇÃO DE FICHEIROS MON

ELABORADO POR: ALEXANDRE CARVALHO

PORTO ABRIL DE 2004

Page 3: VISUALIZAÇÃO DE FICHEIROS PDB E GRAVAÇÃO DE FICHEIROS …tavares/ensino/VISCI/Trabalhos/2003-2004... · A leitura do ficheiro pdb, representação gráfica da molécula que permite

René Magritte

Page 4: VISUALIZAÇÃO DE FICHEIROS PDB E GRAVAÇÃO DE FICHEIROS …tavares/ensino/VISCI/Trabalhos/2003-2004... · A leitura do ficheiro pdb, representação gráfica da molécula que permite

Aos professores João Tavares & Jorge Barbosa

A quem agradeço todo o tempo que dedicaram aos problemas que fui apresentando. Sempre disponíveis e com sugestões sempre pertinentes que me permitiram chegar a este trabalho final. Ao computador “Química 11” Que calculou sem reclamar tantas implementações quasi finais.

Page 5: VISUALIZAÇÃO DE FICHEIROS PDB E GRAVAÇÃO DE FICHEIROS …tavares/ensino/VISCI/Trabalhos/2003-2004... · A leitura do ficheiro pdb, representação gráfica da molécula que permite

ÍNDICE

Princípios Teóricos 6

Metodologia Utilizada 8

Resultados Obtidos 18

Conclusões 19

Bibliografia 20

Anexos 21

Ø Listagem do programa 22

Page 6: VISUALIZAÇÃO DE FICHEIROS PDB E GRAVAÇÃO DE FICHEIROS …tavares/ensino/VISCI/Trabalhos/2003-2004... · A leitura do ficheiro pdb, representação gráfica da molécula que permite

Alexandre Carvalho

Visualização Científica 6

VISUALIZAÇÃO DE FICHEIROS PDB

E

GRAVAÇÃO DE FICHEIROS MON

Programação em C/C++ usando a Biblioteca gráfica VTK

PRINCÍPIOS TEÓRICOS

A representação molecular é uma necessidade que resulta da complexidade da realidade química. Sem dúvida que os métodos computacionais que permitem a visualização de uma representação molecular, interactiva e com as três dimensões, facilitam a idealização de uma imagem mais próxima da realidade. Existem já muitos programas concebidos para esse efeito (Molden, WebLab ViewerLite, Cache). Novos problemas surgem quando os diferentes softwares guardam a informação da representação molecular em diferentes formatos. O formato da Protein Data Bank (PDB) pela sua popularidade, apesar da mesma extensão, apresenta estruturas de ficheiros ascii diferentes. O formato que vai ser usado neste trabalho é o do WebLab ViewerLite.

A química teórica quer por meio de mecânica clássica quer por meio de mecânica quântica estuda propriedades moleculares, entre elas energias potenciais, que permitem determinar distribuições das posições atómicas de menor energia, consideradas mais estáveis e por isso mais representativas da realidade.

A influência de um ou vários fragmentos da molécula sobre o fragmento restante da molécula (bulk) pode ser estudado computacionalmente, sendo para isso necessário identificar inequivocamente os fragmentos desejados. No programa MoPac está a ser implementado uma rotina que permite o cálculo das energias de interacção dos fragmentos a um nível quer quântico quer clássico, que necessita de ficheiros *.mon. A

Page 7: VISUALIZAÇÃO DE FICHEIROS PDB E GRAVAÇÃO DE FICHEIROS …tavares/ensino/VISCI/Trabalhos/2003-2004... · A leitura do ficheiro pdb, representação gráfica da molécula que permite

Alexandre Carvalho

Visualização Científica 7

designação mon vem da palavra monómeros que se enquadra na descrição anterior se a molécula for um polímero.

A estrutura do ficheiro mon deve então identificar inequivocamente os fragmentos seleccionados e o bulk. Para isso deve identificar quantos fragmentos foram seleccionados o número de átomos de cada fragmento e o número do respectivo átomo em cada fragmento.

A leitura do ficheiro pdb, representação gráfica da molécula que permite a selecção dos átomos em cada fragmento e a escrita do ficheiro mon com a estrutura correcta é o objectivo principal deste trabalho uma vez a idealização do ficheiro mon foi de RAMOS e MELO (1999) e não existe nenhum software que escreva o formato mon partir de uma interface gráfica o que permite desconhecer por completo a numeração da molécula.

As bibliotecas gráficas VTK permitem de forma expedita a representação tridimensional de esferas, e não só, mas esse é o objectivo acima descrito, interpretando cada esfera como um átomo. A programação em C é mais eficiente do que em C++ mas o tempo de implementação em C++ é muito inferior ao do C e quando a eficiência não é o objectivo principal é a melhor escolha. Assim a implementação de um código em C/C++ usando as bibliotecas VTK resulta no programa MakeMon que pode ser consultado no anexo deste relatório.

Page 8: VISUALIZAÇÃO DE FICHEIROS PDB E GRAVAÇÃO DE FICHEIROS …tavares/ensino/VISCI/Trabalhos/2003-2004... · A leitura do ficheiro pdb, representação gráfica da molécula que permite

Alexandre Carvalho

Visualização Científica 8

METODOLOGIA UTILIZADA

O VTK apresenta na Internet uma vasta gama de exemplos entre os quais um programa que lê ficheiros pdb no formato pretendido. Infelizmente esse programa usa vtkGlyph3D.h, vtkLookupTable.h e vtkPointData.h o que gera muitos problemas para usar com sucesso o vtkPropPicker.h que usa o vtkActorCollection.h como demonstrado nas aulas.

O exemplo ModeloGrafico_Exer4 das aulas apresenta o uso do vtkPropPicker.h mas para LeftButtonPressEvent e não do CharEvent.

Desta base de trabalho surgiram ideias para o programa realizado.

Em primeiro lugar o programa tem de ficar com a informação do nome do ficheiro a abrir:

int main() { char ficheiro[50]; FILE *pf; fff: nAtoms=0; cout << "Qual o nome do ficheiro pdb ?" << endl ; cin >> m_strNome; strcpy(ficheiro,m_strNome); strcat(ficheiro,".pdb"); pf = fopen(ficheiro,"r"); if (pf == NULL) { cout << "\n"; cout << "Ficheiro "<< ficheiro <<" nao encontrado\n\n"; goto fff; }

depois vai ter de memorizar linha a linha os caracteres de cada linha:

char lbuf[80]; int h=0,c=0,n=0,o=0,s=0; int nchars; while (feof( pf ) == 0 ) { ll: nchars = getLine(pf,lbuf,80); if (nchars == 0) { goto ll;

Page 9: VISUALIZAÇÃO DE FICHEIROS PDB E GRAVAÇÃO DE FICHEIROS …tavares/ensino/VISCI/Trabalhos/2003-2004... · A leitura do ficheiro pdb, representação gráfica da molécula que permite

Alexandre Carvalho

Visualização Científica 9

} para isso chama a classe getline:

int getLine(FILE *pf, char *s, int lim) { int c, i; c=fgetc(pf); for (i=0; (i < lim) && (feof(pf)==0) ; i++) { s[i]=char(c); c=fgetc(pf); } s[i]='\0'; return(i); } agora para cada linha vai memorizar os caracteres desejados:

//definição do vector atomIdNum int atomIdNum[MAXATOM]; char aux_AtomIdNum[3]; aux_AtomIdNum[0]=lbuf[8]; aux_AtomIdNum[1]=lbuf[9]; aux_AtomIdNum[2]=lbuf[10]; sscanf(aux_AtomIdNum,"%i",&atomIdNum[nAtoms]); atomVal[nAtoms]=atomIdNum[nAtoms]; //definição do atomId - identificação do atomo atomId[nAtoms]=lbuf[13]; if (atomId[nAtoms]==((char)'H')){h=h+1;} if (atomId[nAtoms]==((char)'C')){c=c+1;} if (atomId[nAtoms]==((char)'N')){n=n+1;} if (atomId[nAtoms]==((char)'O')){o=o+1;} if (atomId[nAtoms]==((char)'S')){s=s+1;} //definição do xyz dos atomos float xval,yval,zval; char aux_Atomx[6]; aux_Atomx[0]=lbuf[32]; aux_Atomx[1]=lbuf[33]; aux_Atomx[2]=lbuf[34]; aux_Atomx[3]=lbuf[35]; aux_Atomx[4]=lbuf[36]; aux_Atomx[5]=lbuf[37];

Page 10: VISUALIZAÇÃO DE FICHEIROS PDB E GRAVAÇÃO DE FICHEIROS …tavares/ensino/VISCI/Trabalhos/2003-2004... · A leitura do ficheiro pdb, representação gráfica da molécula que permite

Alexandre Carvalho

Visualização Científica 10

sscanf(aux_Atomx,"%f",&xval); atomPos[nAtoms][0] = xval; char aux_Atomy[6]; aux_Atomy[0]=lbuf[40]; aux_Atomy[1]=lbuf[41]; aux_Atomy[2]=lbuf[42]; aux_Atomy[3]=lbuf[43]; aux_Atomy[4]=lbuf[44]; aux_Atomy[5]=lbuf[45]; sscanf(aux_Atomy,"%f",&yval); atomPos[nAtoms][1] = yval; char aux_Atomz[6]; aux_Atomz[0]=lbuf[48]; aux_Atomz[1]=lbuf[49]; aux_Atomz[2]=lbuf[50]; aux_Atomz[3]=lbuf[51]; aux_Atomz[4]=lbuf[52]; aux_Atomz[5]=lbuf[53]; sscanf(aux_Atomz,"%f",&zval); atomPos[nAtoms][2] = zval; nAtoms++; if (!(nAtoms%500)) {printf("nAtoms= %d\n",nAtoms);} if (nAtoms > MAXATOM) { printf("\n\n Oops - you need to increase MAXATOM and recompile...\n\n"); exit(-1); } encerra o ficheiro lido e imprime a fórmula empírica:

fclose(pf); // escreve a fórmula empírica sn: cout << "Tem a certeza que quer visualizar o ficheiro "<< m_strNome<<".pdb "<<endl; cout << "com formula empirica "; cout<<"C"<<c<<" H"<<h<<" O"<<o<<" S"<<s<<" s/n\n"; char pause; cin >> pause; if (pause == 'n'){goto fff;} else if (pause == 's') {} else goto sn;

Page 11: VISUALIZAÇÃO DE FICHEIROS PDB E GRAVAÇÃO DE FICHEIROS …tavares/ensino/VISCI/Trabalhos/2003-2004... · A leitura do ficheiro pdb, representação gráfica da molécula que permite

Alexandre Carvalho

Visualização Científica 11

agora tem de representar a informação graficamente para isso defenimos um renderer e uma renderwindow à qual adicionamos o renderer:

ren1 = vtkRenderer::New(); vtkRenderWindow *renWin = vtkRenderWindow::New(); renWin->AddRenderer( ren1 ); defenimos as características das esferas:

//definição das esferas vtkSphereSource *sphere500 = vtkSphereSource::New(); sphere500->SetThetaResolution(8); sphere500->SetPhiResolution(8); sphere500->SetRadius(0.5); vtkPolyDataMapper *sphereMapper = vtkPolyDataMapper::New(); sphereMapper->SetInput(sphere500->GetOutput()); e adicionamos a um colector de actores, uma esfera é considerada com um actor para o VTK:

// coleccao de actores na cena actcol = vtkActorCollection::New(); for (int i=0; i<nAtoms; i++) { vtkActor *sphere = vtkActor::New(); actcol->AddItem(sphere); para cada actor vamos atribuir os valores memorizados na leitura do ficheiro pdb:

A cor:

int j=5; if (atomId[i]==((char)'H')){j=0;} if (atomId[i]==((char)'C')){j=1;} if (atomId[i]==((char)'N')){j=2;} if (atomId[i]==((char)'O')){j=3;} if (atomId[i]==((char)'S')){j=4;} int colorMap[6][3]; colorMap[0][0]=1; colorMap[0][1]=1; colorMap[0][2]=1; colorMap[1][0]=3; colorMap[1][1]=1; colorMap[1][2]=0;

Page 12: VISUALIZAÇÃO DE FICHEIROS PDB E GRAVAÇÃO DE FICHEIROS …tavares/ensino/VISCI/Trabalhos/2003-2004... · A leitura do ficheiro pdb, representação gráfica da molécula que permite

Alexandre Carvalho

Visualização Científica 12

colorMap[2][0]=0; colorMap[2][1]=0; colorMap[2][2]=1; colorMap[3][0]=1; colorMap[3][1]=0; colorMap[3][2]=0; colorMap[4][0]=1; colorMap[4][1]=1; colorMap[4][2]=0; colorMap[5][0]=0; colorMap[5][1]=1; colorMap[5][2]=0; sphere->GetProperty()->SetColor((colorMap[j][0]),( colorMap[j][1]),( colorMap[j][2])); /* sphere->GetProperty()->SetAmbient(0.3); sphere->GetProperty()->SetDiffuse(0.0); sphere->GetProperty()->SetSpecular(1.0); sphere->GetProperty()->SetSpecularPower(5.0); sphere->GetProperty()->BackfaceCullingOn();*/ a posição: sphere->AddPosition(atomPos[i][0],atomPos[i][1],atomPos[i][2]); sphere->SetMapper(sphereMapper); ren1->AddActor(sphere); } Para podermos seleccionar os actores definidos anteriormente necessitamos do:

vtkPropPicker *picker = vtkPropPicker::New(); vtkMyCallback *mo1 = vtkMyCallback::New(); vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New(); iren->SetRenderWindow(renWin); iren->AddObserver(vtkCommand::LeftButtonPressEvent, mo1, 2.0); iren->AddObserver(vtkCommand::CharEvent, mo1, 2.0); Os argumentos do vtkCommand são: 1- Acontecimento do vtkCommand 2- indica qual o callback a ser adicionado 3-prioridade

Page 13: VISUALIZAÇÃO DE FICHEIROS PDB E GRAVAÇÃO DE FICHEIROS …tavares/ensino/VISCI/Trabalhos/2003-2004... · A leitura do ficheiro pdb, representação gráfica da molécula que permite

Alexandre Carvalho

Visualização Científica 13

O MyCallback necessita ser definido: class vtkMyCallback : public vtkCommand { public: static vtkMyCallback *New() { return new vtkMyCallback; } E é definida como: virtual void Execute(vtkObject *caller, unsigned long, void*) { int x,y,i=0; vtkActor *Actor; vtkRenderWindowInteractor *ri = reinterpret_cast<vtkRenderWindowInteractor*>(caller); ri->GetEventPosition(x,y); Se encontrar o acontecimento, tecla a: if ((char) (ri->GetKeyCode()) == 'a') { ren1->SetBackground(0.1,0.2,0.3); (ren1->GetRenderWindow())->Render(); cout <<"esta em modo seleccao"<<endl; if ( ((vtkPropPicker *)(ri->GetPicker()))->Pick(x,y,0,ren1) > 0) { vtkActor *act = ((vtkPropPicker *)(ri->GetPicker()))->GetActor(); if (act != NULL) { // procura actor actcol->InitTraversal(); while (Actor = actcol->GetNextActor()) { if (Actor == act){ Actor->PickableOff(); Actor->GetProperty()->SetOpacity(0.2); Actor->GetProperty()->SetColor(0,0,0); monomero[mon][at]=i+1; cout << "Seleccionou o atomo "<<monomero[mon][at]<<" do fragmento "<<mon<<endl; cout << "este atomo esta protegido contra seleccoes indesejadas"<<endl; bulkAt[i+1]=false; at++; (ren1->GetRenderWindow())->Render();} i++; } } } }

Page 14: VISUALIZAÇÃO DE FICHEIROS PDB E GRAVAÇÃO DE FICHEIROS …tavares/ensino/VISCI/Trabalhos/2003-2004... · A leitura do ficheiro pdb, representação gráfica da molécula que permite

Alexandre Carvalho

Visualização Científica 14

Se encontrar o acontecimento, tecla o: if ((char) (ri->GetKeyCode()) == 'o') { ren1->SetBackground(0.1,0.2,0.3); (ren1->GetRenderWindow())->Render(); if ( ((vtkPropPicker *)(ri->GetPicker()))->Pick(x,y,0,ren1) > 0) { vtkActor *act = ((vtkPropPicker *)(ri->GetPicker()))->GetActor(); if (act != NULL) { // procura actor actcol->InitTraversal(); while (Actor = actcol->GetNextActor()) { if (Actor == act){ Actor->GetProperty()->SetOpacity(0.2); Actor->GetProperty()->SetColor(255,255,255); monomero[mon][at]=i+1; cout << "Seleccionou o atomo "<<monomero[mon][at]<<" do fragmento "<<mon<<endl; cout << "este atomo ainda pode ser seleccionado noutro fragmento"<<endl; bulkAt[i+1]=false; at++; (ren1->GetRenderWindow())->Render();} i++; } } } } Se encontrar o acontecimento, tecla c: if ((char) (ri->GetKeyCode()) == 'c') {ren1->SetBackground(0,0,0);(ren1->GetRenderWindow())->Render(); cout << "Modo Interactivo Ligado"<<endl; } Se encontrar o acontecimento, tecla m: if ((char) (ri->GetKeyCode()) == 'm') { monat[mon]=at-1; mon++; at=1; cout << "Preparado para definir o fragmento "<<mon<<endl; } Se encontrar o acontecimento, tecla n: if ((char) (ri->GetKeyCode()) == 'n') { if (at!=1) { monat[mon]=at-1; bulk=1; mon++; } aux_bulk=mon; mon++;

Page 15: VISUALIZAÇÃO DE FICHEIROS PDB E GRAVAÇÃO DE FICHEIROS …tavares/ensino/VISCI/Trabalhos/2003-2004... · A leitura do ficheiro pdb, representação gráfica da molécula que permite

Alexandre Carvalho

Visualização Científica 15

at=1; cout << "foi reservado o fragmento numero "<<aux_bulk<<" para o bulk"<<endl; } Se encontrar o acontecimento, tecla f: if ((char) (ri->GetKeyCode()) == 'f') //vai escrever o ficheiro mon { if (mon == aux_bulk+1 && at == 1)//para corrigir se o bulk for o último monómero. mon--;//corecção anterior monat[mon]=at-1;//fixa o nº de átomos do último monómero if (bulk==1)//verifica se foi usado o bulk { int numAt=1;//inicializa o nº de átomos do bulk for (int h=1;h<=nAtoms;h++) { if (bulkAt[h])//o bulkAt é uma variável bool para saber se já foi selecionado ou não { monomero[aux_bulk][numAt]=h;//fixa o nº do átomo que pertence ao bulk numAt++; } } monat[aux_bulk]=numAt-1;//fixa o nº de átomos do bulk } FILE *pf1; char fileMon[50]; strcpy(fileMon,m_strNome); strcat(fileMon,".mon"); pf1 = fopen(fileMon,"w"); fprintf(pf1,"%4i\n",mon); int v; for (v=1; v <= mon ; v++) {fprintf(pf1,"%4i",monat[v]);} fprintf(pf1,"\n"); for (int y=1;y<=mon; y++) { for (int g=1; g <= monat[y] ; g++) { fprintf(pf1,"%4i",monomero[y][g]); } fprintf(pf1,"\n"); } fclose(pf1); cout << "O ficheiro "<<fileMon<<" foi gravado"<<endl; }

Page 16: VISUALIZAÇÃO DE FICHEIROS PDB E GRAVAÇÃO DE FICHEIROS …tavares/ensino/VISCI/Trabalhos/2003-2004... · A leitura do ficheiro pdb, representação gráfica da molécula que permite

Alexandre Carvalho

Visualização Científica 16

Se encontrar o acontecimento, tecla j: if ((char) (ri->GetKeyCode()) == 'j') { vtkRendererSource *rs = vtkRendererSource::New(); rs->SetInput(ren1); rs->WholeWindowOn(); vtkJPEGWriter *w = vtkJPEGWriter::New(); w->SetInput(rs->GetOutput()); strstream tmp; tmp<<m_strNome<<jpgNum<<".jpg"; jpgNum++; char jpgfile[50]; tmp>>jpgfile; w->SetFileName(jpgfile); w->Write(); cout << "O ficheiro "<<jpgfile<<" foi gravado"<<endl; rs->Delete(); w->Delete(); } } }; Como os utilizadores não têm de saber a que teclas é que foram atribuídas funções apartir de uma imagem bmp é lida e adicionada a um novo renderer que vai ser renderizado na mesma janela: // read bmp image vtkBMPReader *imgReader = vtkBMPReader::New(); imgReader->SetFileName("help.bmp"); // build input image actor vtkImageActor *imgActor = vtkImageActor::New(); imgActor->SetInput(imgReader->GetOutput()); vtkRenderer *ren2; ren2 = vtkRenderer::New(); ren2->AddActor(imgActor); ren2->SetViewport(0.5, 0, 1, 1); ren2->GetActiveCamera()->Zoom(2); renWin->AddRenderer( ren2 ); renWin->SetSize( 800, 400 ); // Falta adicionar o primeiro renderer: iren->SetRenderWindow(renWin); iren->AddObserver(vtkCommand::LeftButtonPressEvent, mo1, 2.0); iren->AddObserver(vtkCommand::CharEvent, mo1, 2.0); ren1->SetBackground(0, 0, 0); ren1->GetActiveCamera()->ParallelProjectionOn(); ren1->GetActiveCamera()->Zoom(1.5); ren1->SetViewport(0.0, 0.0, 0.5, 1.0);

Page 17: VISUALIZAÇÃO DE FICHEIROS PDB E GRAVAÇÃO DE FICHEIROS …tavares/ensino/VISCI/Trabalhos/2003-2004... · A leitura do ficheiro pdb, representação gráfica da molécula que permite

Alexandre Carvalho

Visualização Científica 17

Os argumentos da função SetViewport para que os dois renderer’s se coloquem na mesma RenderWindow são: 1-x mínimo, [0 1] 2-y mínimo, [0 1] 3-x máximo, [0 1] 4-y máximo, [0 1] E finalmente renderizar interactivamente: renWin->Render(); iren->Start();

Page 18: VISUALIZAÇÃO DE FICHEIROS PDB E GRAVAÇÃO DE FICHEIROS …tavares/ensino/VISCI/Trabalhos/2003-2004... · A leitura do ficheiro pdb, representação gráfica da molécula que permite

Alexandre Carvalho

Visualização Científica 18

RESULTADOS OBTIDOS

O programa funciona como desejado lê os ficheiros pretendidos e representa a molécula:

Permite seleccionar os átomos e escrever correctamente o ficheiro mon:

Output encontrado no ficheiro mol.mon: 2 11 12 2 14 4 3 15 13 12 10 9 1 11 5 6 7 8 16 17 18 19 20 21 22 23 Apesar da estrutura do ficheiro mon ser muito simples é de facto muito vantajoso seleccionar tudo graficamente. Como é visível escreve correctamente os ficheiros jpg.

Page 19: VISUALIZAÇÃO DE FICHEIROS PDB E GRAVAÇÃO DE FICHEIROS …tavares/ensino/VISCI/Trabalhos/2003-2004... · A leitura do ficheiro pdb, representação gráfica da molécula que permite

Alexandre Carvalho

Visualização Científica 19

Conclusões

Os objectivos a que nos tínhamos proposto inicialmente foram atingidos.

É de salientar, que no início das aulas da disciplina de Visualização Científica não apresentava conhecimentos de C/C++ nem de VTK. E que agora são seguramente uma ferramenta expedita que poderá ser utilizada sempre que necessário.

As potencialidades quer do C/C++ quer do VTK são gigantescas e a utilização de exemplos é essencial para a execução rápida dos programas. O help do VTK é muito completo e vem acompanhado com exemplos.

A programação orientada por objectos torna fácil a execução de tarefas complexas perdendo na eficiência, mas quando esta não é essencial é uma excelente opção.

Page 20: VISUALIZAÇÃO DE FICHEIROS PDB E GRAVAÇÃO DE FICHEIROS …tavares/ensino/VISCI/Trabalhos/2003-2004... · A leitura do ficheiro pdb, representação gráfica da molécula que permite

Alexandre Carvalho

Visualização Científica 20

Bibliografia

Melo A. and Ramos M.J., (1999) ,” A New Partitioning Scheme for Molecular Interacting Systems Within a Multiconfigurational or Monoconfigurational Hartree]Fock Formalism ”, Int. J. Quantum Chem. 72, 157-176.

Ken Martin and Bill Hoffman , “Mastering CMake”, Kitware, Inc. publishers.

Will Schroeder, Ken Martin, Bill Lorensen, “The Visualization Toolkit An Object-Oriented Approach To 3D Graphics”, 3rd Edition, Kitware, Inc. publishers

“The Visualization Toolkit User's Guide Kitware”, Inc publishers.

Page 21: VISUALIZAÇÃO DE FICHEIROS PDB E GRAVAÇÃO DE FICHEIROS …tavares/ensino/VISCI/Trabalhos/2003-2004... · A leitura do ficheiro pdb, representação gráfica da molécula que permite

Alexandre Carvalho

Visualização Científica 21

ANEXOS

Page 22: VISUALIZAÇÃO DE FICHEIROS PDB E GRAVAÇÃO DE FICHEIROS …tavares/ensino/VISCI/Trabalhos/2003-2004... · A leitura do ficheiro pdb, representação gráfica da molécula que permite

Alexandre Carvalho

Visualização Científica 22

/*========================================================================= Program: MakeMon Language: C++ Date: 24/04/2004 Version: 1.0 Autor: Alexandre Carvalho Mestrado em Métodos Computacionais em Ciência e Engenharia Visualização científica =========================================================================*/ #include <strstrea.h> #include <fstream.h> #include <iostream.h> #include <stdio.h> #include <stdlib.h> #include <string.h> //#include "vtkCylinderSource.h" #include "vtkPolyDataMapper.h" #include "vtkVectorText.h" #include "vtkActor.h" #include "vtkRenderer.h" #include "vtkRenderWindow.h" #include "vtkRenderWindowInteractor.h" #include "vtkProperty.h" #include "vtkCamera.h" #include "vtkCommand.h" #include "vtkPropPicker.h" //#include "vtkRendererCollection.h" #include "vtkActorCollection.h" #include "vtkPolyData.h" //#include "vtkFloatArray.h" #include "vtkSphereSource.h" #include "vtkRendererSource.h" #include "vtkJPEGWriter.h" #include "vtkBMPReader.h" #include "vtkImageActor.h" //#include "vtkLineSource.h" //#include "vtkGlyph3D.h" //#include "vtkTubeFilter.h" //#include "vtkLookupTable.h" //#include "vtkPointData.h" // definição de variáveis globais para facilitar a programação #define MAXATOM 500 char m_strNome[50];

Page 23: VISUALIZAÇÃO DE FICHEIROS PDB E GRAVAÇÃO DE FICHEIROS …tavares/ensino/VISCI/Trabalhos/2003-2004... · A leitura do ficheiro pdb, representação gráfica da molécula que permite

Alexandre Carvalho

Visualização Científica 23

int jpgNum=1; int mon=1; int at=1; int nAtoms = 0; int bulk=0; int monomero[MAXATOM][MAXATOM]; int monat[MAXATOM]; bool bulkAt[MAXATOM]; int aux_bulk; static float atomPos[MAXATOM][3]; static float atomVal[MAXATOM]; char atomId[MAXATOM]; int getLine(FILE *pf, char *s, int lim) { int c, i; c=fgetc(pf); for (i=0; (i < lim) && (feof(pf)==0) ; i++) { s[i]=char(c); c=fgetc(pf); } s[i]='\0'; return(i); } // apontadores declarados globais por serem usados no Mycallback vtkRenderer *ren1; vtkActorCollection *actcol; // MyCallback para interagir como desejado class vtkMyCallback : public vtkCommand { public: static vtkMyCallback *New() { return new vtkMyCallback; } virtual void Execute(vtkObject *caller, unsigned long, void*) { int x,y,i=0; vtkActor *Actor; vtkRenderWindowInteractor *ri = reinterpret_cast<vtkRenderWindowInteractor*>(caller); ri->GetEventPosition(x,y); if ((char) (ri->GetKeyCode()) == 'a') { ren1->SetBackground(0.1,0.2,0.3); (ren1->GetRenderWindow())->Render(); cout <<"esta em modo seleccao"<<endl; if ( ((vtkPropPicker *)(ri->GetPicker()))->Pick(x,y,0,ren1) > 0) {

Page 24: VISUALIZAÇÃO DE FICHEIROS PDB E GRAVAÇÃO DE FICHEIROS …tavares/ensino/VISCI/Trabalhos/2003-2004... · A leitura do ficheiro pdb, representação gráfica da molécula que permite

Alexandre Carvalho

Visualização Científica 24

vtkActor *act = ((vtkPropPicker *)(ri->GetPicker()))->GetActor(); if (act != NULL) { // procura actor actcol->InitTraversal(); while (Actor = actcol->GetNextActor()) { if (Actor == act){ Actor->PickableOff(); Actor->GetProperty()->SetOpacity(0.2); Actor->GetProperty()->SetColor(0,0,0); monomero[mon][at]=i+1; cout << "Seleccionou o atomo "<<monomero[mon][at]<<" do fragmento "<<mon<<endl; cout << "este atomo esta protegido contra seleccoes indesejadas"<<endl; bulkAt[i+1]=false; at++; (ren1->GetRenderWindow())->Render();} i++; } } } } if ((char) (ri->GetKeyCode()) == 'o') { ren1->SetBackground(0.1,0.2,0.3); (ren1->GetRenderWindow())->Render(); if ( ((vtkPropPicker *)(ri->GetPicker()))->Pick(x,y,0,ren1) > 0) { vtkActor *act = ((vtkPropPicker *)(ri->GetPicker()))->GetActor(); if (act != NULL) { // procura actor actcol->InitTraversal(); while (Actor = actcol->GetNextActor()) { if (Actor == act){ Actor->GetProperty()->SetOpacity(0.2); Actor->GetProperty()->SetColor(255,255,255); monomero[mon][at]=i+1; cout << "Seleccionou o atomo "<<monomero[mon][at]<<" do fragmento "<<mon<<endl; cout << "este atomo ainda pode ser seleccionado noutro fragmento"<<endl; bulkAt[i+1]=false; at++; (ren1->GetRenderWindow())->Render();} i++; } } } }

Page 25: VISUALIZAÇÃO DE FICHEIROS PDB E GRAVAÇÃO DE FICHEIROS …tavares/ensino/VISCI/Trabalhos/2003-2004... · A leitura do ficheiro pdb, representação gráfica da molécula que permite

Alexandre Carvalho

Visualização Científica 25

if ((char) (ri->GetKeyCode()) == 'c') {ren1->SetBackground(0,0,0);(ren1->GetRenderWindow())->Render(); cout << "Modo Interactivo Ligado"<<endl; } if ((char) (ri->GetKeyCode()) == 'm') { monat[mon]=at-1; mon++; at=1; cout << "Preparado para definir o fragmento "<<mon<<endl; } if ((char) (ri->GetKeyCode()) == 'n') { if (at!=1) { monat[mon]=at-1; bulk=1; mon++; } aux_bulk=mon; mon++; at=1; cout << "foi reservado o fragmento numero "<<aux_bulk<<" para o bulk"<<endl; } if ((char) (ri->GetKeyCode()) == 'f') //vai escrever o ficheiro mon { if (mon == aux_bulk+1 && at == 1)//para corrigir se o bulk for o último monómero. mon--;//corecção anterior monat[mon]=at-1;//fixa o nº de átomos do último monómero if (bulk==1)//verifica se foi usado o bulk { int numAt=1;//inicializa o nº de átomos do bulk for (int h=1;h<=nAtoms;h++) { if (bulkAt[h])//o bulkAt é uma variável bool para saber se já foi selecionado ou não { monomero[aux_bulk][numAt]=h;//fixa o nº do átomo que pertence ao bulk numAt++; } } monat[aux_bulk]=numAt-1;//fixa o nº de átomos do bulk } FILE *pf1; char fileMon[50];

Page 26: VISUALIZAÇÃO DE FICHEIROS PDB E GRAVAÇÃO DE FICHEIROS …tavares/ensino/VISCI/Trabalhos/2003-2004... · A leitura do ficheiro pdb, representação gráfica da molécula que permite

Alexandre Carvalho

Visualização Científica 26

strcpy(fileMon,m_strNome); strcat(fileMon,".mon"); pf1 = fopen(fileMon,"w"); fprintf(pf1,"%4i\n",mon); int v; for (v=1; v <= mon ; v++) {fprintf(pf1,"%4i",monat[v]);} fprintf(pf1,"\n"); for (int y=1;y<=mon; y++) { for (int g=1; g <= monat[y] ; g++) { fprintf(pf1,"%4i",monomero[y][g]); } fprintf(pf1,"\n"); } fclose(pf1); cout << "O ficheiro "<<fileMon<<" foi gravado"<<endl; } if ((char) (ri->GetKeyCode()) == 'j') { vtkRendererSource *rs = vtkRendererSource::New(); rs->SetInput(ren1); rs->WholeWindowOn(); vtkJPEGWriter *w = vtkJPEGWriter::New(); w->SetInput(rs->GetOutput()); strstream tmp; tmp<<m_strNome<<jpgNum<<".jpg"; jpgNum++; char jpgfile[50]; tmp>>jpgfile; w->SetFileName(jpgfile); w->Write(); cout << "O ficheiro "<<jpgfile<<" foi gravado"<<endl; rs->Delete(); w->Delete(); } } }; int main() { char ficheiro[50]; FILE *pf; fff: nAtoms=0; cout << "Qual o nome do ficheiro pdb ?" << endl ; cin >> m_strNome; strcpy(ficheiro,m_strNome);

Page 27: VISUALIZAÇÃO DE FICHEIROS PDB E GRAVAÇÃO DE FICHEIROS …tavares/ensino/VISCI/Trabalhos/2003-2004... · A leitura do ficheiro pdb, representação gráfica da molécula que permite

Alexandre Carvalho

Visualização Científica 27

strcat(ficheiro,".pdb"); pf = fopen(ficheiro,"r"); if (pf == NULL) { cout << "\n"; cout << "Ficheiro "<< ficheiro <<" nao encontrado\n\n"; goto fff; } char lbuf[80]; int h=0,c=0,n=0,o=0,s=0; int nchars; /*FILE *pf2; ofstream fileTest; fileTest.open("teste.txt",ios::out);*/ while (feof( pf ) == 0 ) { ll: nchars = getLine(pf,lbuf,80); if (nchars == 0) { goto ll; } /* int j=0; while(j<57){ fileTest <<lbuf[j]; j++;} fileTest <<endl;*/ //definição do vector atomIdNum int atomIdNum[MAXATOM]; char aux_AtomIdNum[3]; aux_AtomIdNum[0]=lbuf[8]; aux_AtomIdNum[1]=lbuf[9]; aux_AtomIdNum[2]=lbuf[10]; sscanf(aux_AtomIdNum,"%i",&atomIdNum[nAtoms]); atomVal[nAtoms]=atomIdNum[nAtoms]; //definição do atomId - identificação do atomo atomId[nAtoms]=lbuf[13];

Page 28: VISUALIZAÇÃO DE FICHEIROS PDB E GRAVAÇÃO DE FICHEIROS …tavares/ensino/VISCI/Trabalhos/2003-2004... · A leitura do ficheiro pdb, representação gráfica da molécula que permite

Alexandre Carvalho

Visualização Científica 28

if (atomId[nAtoms]==((char)'H')){h=h+1;} if (atomId[nAtoms]==((char)'C')){c=c+1;} if (atomId[nAtoms]==((char)'N')){n=n+1;} if (atomId[nAtoms]==((char)'O')){o=o+1;} if (atomId[nAtoms]==((char)'S')){s=s+1;} //definição do xyz dos atomos float xval,yval,zval; char aux_Atomx[6]; aux_Atomx[0]=lbuf[32]; aux_Atomx[1]=lbuf[33]; aux_Atomx[2]=lbuf[34]; aux_Atomx[3]=lbuf[35]; aux_Atomx[4]=lbuf[36]; aux_Atomx[5]=lbuf[37]; sscanf(aux_Atomx,"%f",&xval); atomPos[nAtoms][0] = xval; char aux_Atomy[6]; aux_Atomy[0]=lbuf[40]; aux_Atomy[1]=lbuf[41]; aux_Atomy[2]=lbuf[42]; aux_Atomy[3]=lbuf[43]; aux_Atomy[4]=lbuf[44]; aux_Atomy[5]=lbuf[45]; sscanf(aux_Atomy,"%f",&yval); atomPos[nAtoms][1] = yval; char aux_Atomz[6]; aux_Atomz[0]=lbuf[48]; aux_Atomz[1]=lbuf[49]; aux_Atomz[2]=lbuf[50]; aux_Atomz[3]=lbuf[51]; aux_Atomz[4]=lbuf[52]; aux_Atomz[5]=lbuf[53]; sscanf(aux_Atomz,"%f",&zval); atomPos[nAtoms][2] = zval; nAtoms++; if (!(nAtoms%500)) {printf("nAtoms= %d\n",nAtoms);} if (nAtoms > MAXATOM)

Page 29: VISUALIZAÇÃO DE FICHEIROS PDB E GRAVAÇÃO DE FICHEIROS …tavares/ensino/VISCI/Trabalhos/2003-2004... · A leitura do ficheiro pdb, representação gráfica da molécula que permite

Alexandre Carvalho

Visualização Científica 29

{ printf("\n\n Oops - you need to increase MAXATOM and recompile...\n\n"); exit(-1); } } fclose(pf); // escreve a fórmula empírica sn: cout << "Tem a certeza que quer visualizar o ficheiro "<< m_strNome<<".pdb "<<endl; cout << "com formula empirica "; cout<<"C"<<c<<" H"<<h<<" O"<<o<<" S"<<s<<" s/n\n"; char pause; cin >> pause; if (pause == 'n'){goto fff;} else if (pause == 's') {} else goto sn; for (int v=1;v<=nAtoms;v++){bulkAt[v]=true;} //=== VTK ======================================================= ren1 = vtkRenderer::New(); vtkRenderWindow *renWin = vtkRenderWindow::New(); renWin->AddRenderer( ren1 ); //definição das esferas vtkSphereSource *sphere500 = vtkSphereSource::New(); sphere500->SetThetaResolution(8); sphere500->SetPhiResolution(8); sphere500->SetRadius(0.5); vtkPolyDataMapper *sphereMapper = vtkPolyDataMapper::New(); sphereMapper->SetInput(sphere500->GetOutput()); // coleccao de actores na cena actcol = vtkActorCollection::New(); for (int i=0; i<nAtoms; i++) { vtkActor *sphere = vtkActor::New(); actcol->AddItem(sphere);

Page 30: VISUALIZAÇÃO DE FICHEIROS PDB E GRAVAÇÃO DE FICHEIROS …tavares/ensino/VISCI/Trabalhos/2003-2004... · A leitura do ficheiro pdb, representação gráfica da molécula que permite

Alexandre Carvalho

Visualização Científica 30

int j=5; if (atomId[i]==((char)'H')){j=0;} if (atomId[i]==((char)'C')){j=1;} if (atomId[i]==((char)'N')){j=2;} if (atomId[i]==((char)'O')){j=3;} if (atomId[i]==((char)'S')){j=4;} int colorMap[6][3]; colorMap[0][0]=1; colorMap[0][1]=1; colorMap[0][2]=1; colorMap[1][0]=3; colorMap[1][1]=1; colorMap[1][2]=0; colorMap[2][0]=0; colorMap[2][1]=0; colorMap[2][2]=1; colorMap[3][0]=1; colorMap[3][1]=0; colorMap[3][2]=0; colorMap[4][0]=1; colorMap[4][1]=1; colorMap[4][2]=0; colorMap[5][0]=0; colorMap[5][1]=1; colorMap[5][2]=0; sphere->GetProperty()->SetColor((colorMap[j][0]),( colorMap[j][1]),( colorMap[j][2])); /* sphere->GetProperty()->SetAmbient(0.3); sphere->GetProperty()->SetDiffuse(0.0); sphere->GetProperty()->SetSpecular(1.0); sphere->GetProperty()->SetSpecularPower(5.0); sphere->GetProperty()->BackfaceCullingOn();*/ sphere->AddPosition(atomPos[i][0],atomPos[i][1],atomPos[i][2]); sphere->SetMapper(sphereMapper); ren1->AddActor(sphere); } vtkPropPicker *picker = vtkPropPicker::New(); vtkMyCallback *mo1 = vtkMyCallback::New();

Page 31: VISUALIZAÇÃO DE FICHEIROS PDB E GRAVAÇÃO DE FICHEIROS …tavares/ensino/VISCI/Trabalhos/2003-2004... · A leitura do ficheiro pdb, representação gráfica da molécula que permite

Alexandre Carvalho

Visualização Científica 31

vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New(); // read bmp image vtkBMPReader *imgReader = vtkBMPReader::New(); imgReader->SetFileName("help.bmp"); // build input image actor vtkImageActor *imgActor = vtkImageActor::New(); imgActor->SetInput(imgReader->GetOutput()); vtkRenderer *ren2; ren2 = vtkRenderer::New(); ren2->AddActor(imgActor); ren2->SetViewport(0.5, 0, 1, 1); ren2->GetActiveCamera()->Zoom(2); renWin->AddRenderer( ren2 ); renWin->SetSize( 800, 400 ); // iren->SetRenderWindow(renWin); iren->AddObserver(vtkCommand::LeftButtonPressEvent, mo1, 2.0); iren->AddObserver(vtkCommand::CharEvent, mo1, 2.0); ren1->SetBackground(0, 0, 0); ren1->GetActiveCamera()->ParallelProjectionOn(); ren1->GetActiveCamera()->Zoom(1.5); ren1->SetViewport(0.0, 0.0, 0.5, 1.0); renWin->Render(); // This starts the event loop and as a side effect causes an initial render. iren->Start(); // Exiting from here, we have to delete all the instances that // have been created. delete [] m_strNome; delete [] monomero; delete [] monat; delete [] atomPos; delete [] atomVal; delete [] atomId; actcol->Delete(); picker->Delete(); sphere500->Delete(); sphereMapper->Delete(); // sphere->Delete(); imgReader->Delete(); imgActor->Delete; ren1->Delete(); ren2->Delete();

Page 32: VISUALIZAÇÃO DE FICHEIROS PDB E GRAVAÇÃO DE FICHEIROS …tavares/ensino/VISCI/Trabalhos/2003-2004... · A leitura do ficheiro pdb, representação gráfica da molécula que permite

Alexandre Carvalho

Visualização Científica 32

renWin->Delete(); iren->Delete(); return 0; }