2015年12月24日 星期四

20151217 Java 程式課

上課講師:梁啟修 老師

今天是Java體驗課,需要的軟體就是Java的編輯器-Eclipse

在這之前,完全沒有接觸過Java,對於Java的程式語言完全不是很了解,但之前稍微學過一些很基本的python,所以在聽的過程中可以了解老師的邏輯。雖說如此,礙於不懂Java的編輯,在編輯上還是有許多困難,有點像“知道怎麼做,可是又做不出來”。


上圖是一個Eclipse操作界面。綠色框框是整個java的架構(包含了package、class等),看起來有階層關係;紅色框框是編輯模式、除錯模式及其執行按鈕;紫色框框是主要編輯區,上方有類似瀏覽器的分頁,其功能就是打開不同的class像分頁一樣瀏覽。紫色框框的下方有個叫console的分頁,那是結果輸出的區域。

在看這些程式碼的時候,讓我覺得困惑的是package & class之間所代表的立場是什麼?為什麼要這樣分?不同package之間的class是不能共用的嗎?

在創一個新的java時,需要先新增一個class。
當然一開始需要讓程式與使用者互動,最簡單的方式就是讓程式說點什麼!
開始 Java 的 Hello World 吧~
























輸出數字或文字的程式碼即是
【System.out.println(沒有“”代表程式內某變數的輸出,“引號內以純文字輸出”);】

---------------------------------------------------------------------------------------------------------

作業!

4. 寫一個 Java 程式進行 X-Y 平面的粒子運動並視覺化,這一題只要可以視覺化就好,沒有要求要做什麼樣的運動模型 (請將程式碼貼在自己的網頁上,完成這一題的同學90分)。


以下並不是利用Java語言編寫成的程式,而是利用 Python來編寫。

Python安裝檔 & Pygame模組:按此下載
作業檔案:按此下載

---------------------------------------------------------------------------------------------------------

import pygame
import random
import math

# Define some colors
BLACK    = (   0,   0,   0)
WHITE    = ( 255, 255, 255)
GREEN    = (   0, 255,   0)
RED      = ( 255,   0,   0)

pygame.init()

# Set the width and height of the screen [width, height]
width = 700
high = 500
size = (width, high)
screen = pygame.display.set_mode(size)

pygame.display.set_caption("Atom Movement")

# Loop until the user clicks the close button.
done = False

# Used to manage how fast the screen updates
clock = pygame.time.Clock()

# Parameters
atom_list = []
change_list = []
atom_size = 10
atom_num = 100
frame_speed = 20

# Generate atoms with random coordinate in the window
for i in range (atom_num):
    atom_x = random.randint(2 * atom_size, width - 2 * atom_size )
    atom_y = random.randint(2 * atom_size, high - 2 * atom_size)
    atom_list.append([atom_x, atom_y])
    for m in range(i):
        i_x = atom_list[i][0]
        i_y = atom_list[i][1]
        m_x = atom_list[m][0]
        m_y = atom_list[m][1]
        if math.sqrt((i_x-m_x)*(i_x-m_x)+(i_y-m_y)*(i_y-m_y)) <= 20 and math.sqrt((i_x-m_x)*(i_x-m_x)+(i_y-m_y)*(i_y-m_y)) != 0:
            atom_list.pop()
            atom_x = random.randint(2 * atom_size, width - 2 * atom_size)
            atom_y = random.randint(2 * atom_size, high - 2 * atom_size)
            atom_list.append([atom_x, atom_y])

# Generate different movement with different speed in XY direction
for l in range (atom_num):
    x_change = random.randint(-5,5)
    y_change = random.randint(-5,5)
    change_list.append([x_change, y_change])

# -------- Main Program Loop -----------
while not done:
    # --- Main event loop
    for event in pygame.event.get(): # User did something
        if event.type == pygame.QUIT: # If user clicked close
            done = True # Flag that we are done so we exit this loop

    screen.fill(BLACK)
    
# Draw atoms       
    for atom in atom_list:
        pygame.draw.circle(screen, GREEN, atom, atom_size)

# Change atom movement with adding different speed by another list
    for j in range(len(atom_list)):
        atom_list[j][0] += change_list[j][0]
        atom_list[j][1] += change_list[j][1]
        
# Create a condition for simple bounce on wall  
        if atom_list[j][0] > (width - atom_size) or atom_list[j][0] < atom_size:
            change_list[j][0] *= -1
        if atom_list[j][1] > (high - atom_size) or atom_list[j][1] < atom_size:
            change_list[j][1] *= -1
        
# Create a simple bounce on atom      
        for k in range(len(atom_list)):

            j_x = atom_list[j][0]
            j_y = atom_list[j][1]
            k_x = atom_list[k][0]
            k_y = atom_list[k][1]
            if math.sqrt((j_x-k_x)*(j_x-k_x)+(j_y-k_y)*(j_y-k_y)) < (2 * atom_size) and math.sqrt((j_x-k_x)*(j_x-k_x)+(j_y-k_y)*(j_y-k_y)) != 0:
                change_list[j][0] *= -1
                change_list[j][1] *= -1
        
        
    # --- Go ahead and update the screen with what we've drawn.
    pygame.display.flip()

    # --- Limit to 60 frames per second
    clock.tick(frame_speed)

pygame.quit()
---------------------------------------------------------------------------------------------------------


影片為程式的輸出結果

程式中有幾點Bug:
1. 各個原子的運動為隨機,原子間的碰撞以半徑小於 2r 為基準,當判斷為碰撞時,只以反方向反彈,並不會有加速的現象。所以當兩原子出現的位置重疊,則會無限反彈。
2. 兩個原子同時撞擊另一原子時,也會出現第1點的狀況,也會出現跑到視窗外的現象,而且一樣以無限反彈的形式移動。脫離視窗後,便不會再返回視窗。




2015年11月25日 星期三

20151119 PyMol

上課講師:王淑鶯老師

續上周的PyMol課程後,接下來是更進階的PyMol課程。
之前有提到如何將序列裡面的金屬原子呈現。同理,醣類也可以用這個方式呈現,但是醣類或其他有機物不會無緣無故地出現在protein上,通常都會有一些氨基酸與其有鍵結,可以通過show side chain的方式將其呈現出來。

















如上圖(4KC3),顯示蛋白質的圖形的時候,只會出現紫色及藍色的protein structure。Protein的上方的黃色部分是不會自動呈現的。
做法如下:
show>organic
select>organic on sequence
color>by element
完成後有機物會顯示出來,但是卻沒有與protein本身有鏈接,主要是因為cartoon的特性是不會把side chain顯現出來,需要自己到細部選取特定氨基酸讓其顯示 side chain即可。

另外也可以在指令欄位打上以下指令,便可完成特定角度的轉動。
command:
rotate x, 90
rotate y, 90
rotate z, 90




跟之前一樣可以放大到細部並呈現幾個重要的氨基酸,可以讓讀者了解到它們之間的關係。

上圖(4KC3)是沒有標上residue的,其中幾條虛線是用距離measurement畫出來並hide label。

有時候因為protein 3D structure 的關係,總會有一些氨基酸阻擋在視野前方,可以用手動的方式選取並用hide>cartoon的方式讓其不顯示在視野中,以方便讀者看到實際的內部構造。

上圖(4KC3)是用label>residue的方式將各個目標氨基酸呈現出來,可以清楚地表達出是哪個氨基酸比較有影響力。由於程式內部label的種類有限,可以輸出過後再用其他繪圖軟體將residue label上去。

PyMol還可以將兩個蛋白質align在一起,如上圖(3QYC-綠 & 1IGM-藍)。
將兩種蛋白匯入程式後,在任一蛋白的物件中選取 action>align>to molecule>3QYC or 1IGM
由於這兩種蛋白質基本上很相似,所以align後整體重疊性高。

但是只有部分重疊的蛋白就不能這樣做,程式不會自動選擇重疊的部分,而是整條sequence拿去align。
以另一個蛋白為例,1OL0與3QYC只有部分的structure或是sub-chain有重疊的現象(下圖),則必須手動選擇想要align的sequence然後再align。
做法如下:
1. 在選一個protein,並在protein sequence 選擇想要align的部分,選擇的物件會在<sele>物件中,可以用"set_name sele, new-name"的指令更改名字,建議更改名字比較好,因為<sele>容易被改變。
2. 選擇後在沒有進行選擇的protein物件中執行align的動作,action>align>to selection>new-name

完成後即可獲得下圖!


老師再用另外一個蛋白讓我們做之前練習過的上色及呈現金屬原子。(4LMY)
做法就不在細說了,反正就是在用 "color red, chain A",選擇Zn並更名,然後讓Zn呈現sphere,更改sphere大小及顏色 "set sphere_scale=0.5"

細部構造也是一樣的做法。不了解的話請到上週的文章看看 =D



接下來就是顯示氨基酸的正負點位,先讓蛋白質用"surface"表現,然後在改蛋白質的物件中選擇"action>generate>vacuum electrostatics>protein contact potantial(local)"
就可以看到下圖的樣子。

當然可以使用 rotate的方式讓它轉到想要觀察的角度。"rotate x, 90" (下圖)

除了sub-chain以外,也有可能是只有部分sequence有重疊,所以可以在protein sequence上先選擇高度重疊的序列後,再一起做align。
以下是4LMY及4I7H兩個protein的align結果,我取4I7H中間alpha helix部分的序列作為<sele> 然後與 4LMY 做align。

部分sequence重疊的另一個例子:3F8N-綠 & 4LMY-紅(以cartoon表示)

我想嘗試用 PyMOL 來製作影片
我選用的圖是上週最後一題的結果,讓其旋轉360度,並在過程中拍下120張圖片(每張圖片都有經過ray的處理)
最後在利用影片製作軟體將這些圖片組合成影片。

選好圖片後,在程式欄位輸入幾行指令:
----------------------------------------------------------------------------------------------
mset 1, 120                        #define movie frames
util.mroll, 1, 120, 1           #command for 120 frames in 360 degree rotate
set ray_trace_frames, 1     #ray process for every frames
mpng mov                        #start export png pictures
----------------------------------------------------------------------------------------------

輸出結束後,將會得到120張經過清晰化的圖片檔,接著再用影片製作軟體將這些圖片轉換成影片。


----------------------------------------------------------------------------------------------

以下是Homework!
1. Create a fasta sequence file of a molecule of your interest.
2. Use ExPasy to characterize the protein (such as MW, PI, secondary structure, domain…..)
3. Find the structure (or homologous structure of your molecule) in protein data bank
4. Use Pymol to generate the figure of your molecule, functional domain and important atomic interactions
5. Align the structure with a homologous structure and explain why structural alignment can help you design your experiments

1. 基於接下來的題目跟domain有關,我原本有想選擇Dengue NS1 protein當作這次的作業的蛋白,但是發現PDB與NCBI之間的蛋白並不統一以及domain的predict時,並沒有發現明顯的domain。
最後我改用NF-kB當做我本次作業的protein。

NF-kB activating protein 1
FASTA format:
>gi|57472138|gb|AAW51146.1| NFkB interacting protein 1 [Homo sapiens]
MDSEAFQSARDFLDMNFQSLAMKHMDLKQMELDTAAAKVDELTKQLESLWSDSPAPPGPQAGPPSRPPRY
SSSSIPEPFGSRGSPRKAATDGADTPFGRSESAPTLHPYSPLSPKGRPSSPRTPLYLQPDAYGSLDRATS
PRPRAFDGAGSSLGRAPSPRPGPGPLRQQGPPTPFDFLGRAGSPRGSPLAEGPQAFFPERGPSPRPPATA
YDAPASAFGSSLIGSGGSAFAPPLRAQDDLTLRRRPPKAWNESDLDVAYEKKPSQTASYERLDVFARPAS
PSLQLLPWRESSLDGLGGTGKDNLTSATLPRNYKVSPLASDRRSDAGSYRRSLGSAGPSGTLPRSWQPVS
RIPMPPSSPQPRGAPRQRSIPSMIFKLQNAFWEHGASRAMLPGSPLFTRAPPPKLQPQPQPQPQPQSQPQ
PQLPPQPQTQPQTPTPAPQHPQQTWPPVNEGPPKPPTELEPEPEIEGLLTPVLEAGDVDEGPVARPLSPT
RLQPALPPEAQSVPELEEVARVLAEIPRPLKRRGSMEQAPAVALPPTHKKQYQQIISRLFHRHGGPGPGG
PEPELSPITEGSEARAGPPAPAPPAPIPPPAPSQSSPPEQPQSMEMRSVLRKAGSPRKARRARLNPLVLL
LDAALTGELEVVQQAVKEMNDPSQPNEEGITALHNAICGANYSIVDFLITAGANVNSPDSHGWTPLHCAA
SCNDTVICMALVQHGAAIFATTLSDGATAFEKCDPYREGYADCATSLADVEQSMGLMNSGAVYALWDYSA
EFGDELSFREGESVTVLRRDGPEETDWWWAALHGQEGYVPRNYFGLFPRVKPQRSKV


2. Characteristic of NF-kB
Protein length: 827 a.a
Molecular Weight: 89 kDa
PI: pH 6.37
from: http://web.expasy.org/compute_pi/

Secondary Structure:
from: http://cho-fas.sourceforge.net

Domain: 


from:http://prosite.expasy.org
從網站中預測出NF-kB中含有SH3 domain

3. 從PDB (Protein Data Bank)中搜尋 NF-kB activating protein 1可以找到 2VGE 這個檔案,並在PyMOL中利用內建的下載器將這個蛋白下載。
在網頁的其他分頁中(紅框)找到相似的蛋白 3EHR,一樣利用PyMOL內建的下載器下載並與 2VGE 進行alignment。


4. 利用 Pymol 對 2VGE 標記先前找到的 domain 並利用顏色進行區分。
紫色+黃色:2VGE
黃色:SH3 domain


另外,取其中的一個氧原子當做interaction的中心,顯示原子附近氨基酸的side chain 並對其計算距離。

5. 在PyMOL中用先前找到的 3EHR 來作為其align的對象,得出下圖且可以了解到重疊的部分是 SH3 domain。
通過alignment可以了解到某些相似的結構具有特定的功能









未完待續...

2015年11月23日 星期一

20151112 ExPASy & PyMOL

上課講師:王淑鶯老師

蛋白質性質分析平台:ExPASy





















ExPASy 不僅僅可以分析蛋白質,這個平台可以分析大部分的物質,有些是分析工具是直接連接到外部網站的分析工具,是個非常好用的分析平台。

以蛋白質分析為例,網頁的左方有個proteomics的區塊,點選後就可以看到許多跟蛋白質分析相關的分析工具,若想做蛋白質的BLAST,可以試試看 UniProtKB, 這個分析方式就不僅可完成BLAST,還可以完成許多事情。
























進入BLAST頁面時,就可以直接把有興趣的蛋白質序列直接貼上FASTA format的蛋白質序列,然後就執行BLAST



執行後,需等待一段時間..







BLAST完成後就會告訴使用者結果,將會看到以下的頁面。




















另外還可以做一些基本的蛋白質性質的計算,如pI等。
在ExPASy選擇proteomics 後,下方會出現幾個子選項,其中一個是"protein characterisation and functions",接下來的分頁就會變得更精確。




















選擇"Compute pI/MW",進入工具頁面。






















一樣使用FASTA format的蛋白質序列即可進行分析的動作。這樣就可以得到 protein pI/MW。

若想知道protein的二級結構,可以使用“APSSP - Advanced Protein Secondary Structure Prediction Server”
















除了“APSSP”外,還有"Jmol"跟"Jpred"可以協助完成二級結構的prediction。












找到二級結構後,出現protein function的問題,到底這個protein有哪些domain?執行什麼功能?可以使用"PROSITE"來完成。









把FASTA format的protein sequence貼到正確的位置進行分析。
















完成分析過後,分析工具就會將可能的domain告訴使用者,並將domain的位置告訴使用者。

























最後介紹一下,Protein Database Bank - PDB
 這裡面收錄了許多蛋白質的資訊,可以從這裡取用想要的蛋白質。
點選任一蛋白後,會在頁面中看到這些分頁,使用者就可以更容易從中取得所需的資訊。



















分析工具介紹到這邊。

接下來就是簡單操作 PyMOL,就是將蛋白質的呈現處理成論文中常看到的那種模式。
打開PyMOL程式時,可以看到兩個分開的視窗,上方是指令視窗,下方則是圖形顯示視窗。
指令視窗跟python有點雷同,可能是用python的語法編寫而成的。
操作就從如何匯入文件開始,在PyMOL有兩種方式匯入檔案,一種是直接把protein sequence的FASTA檔案匯入,另一種是透過程式內建的Loader, 輸入已知的protein名稱,直接讓程式搜尋。



















以 2AVU 為例,匯入后即可看到許多的線條,這就是 2AVU 蛋白本身的構造。視窗的左邊有許多的指令可以使用,點擊即可使用。
比如說:A代表動作、S代表顯示(想要顯示的方式)、H代表隱藏(有些東西可能需要隱藏)、L代表標記(將一些文字標記在特定的位子)& C代表顏色(將特定的區域或特性上色)

下圖顯示的是使用了 H (Everything/Line) 和 S (Cartoon)後,在經過一些旋轉所顯示的圖形。
























由於過後需要將這些彩帶上色,所以改變了一下背景的顏色,做法如下圖,可以看到還有許多顏色可以更改。
























在又下方也有幾個按鈕可以使用,大部分跟動畫有關係,只有"S" 和 "F"是比較 特別的。
S: Sequence(可以將下圖紅色框框的protein sequence叫出來)
F: Full Screen























舊版的PyMOL可以 Ray(在指令視窗),輸出的畫質會好很多。
下圖為Ray完過後的輸出圖
這些彩帶由六個chain組成,可以將同一chain的彩帶都染成同一種顏色,只需將幾個指令輸入即可。
command:
color red, chain F
color purple, chain E
color cyan, chain B
color blue, chain A
color green, chain D
color yellow, chain C

當輸入指令 "color red, chain F"時,chain F的所有組成隨即染成紅色(如下圖)。

當以上指令都執行過後,將會得到顏色鮮明的protein structure。
這個protein structure內含有兩個Zn原子,通過在 protein sequence的選擇過後,便可以修改他們的呈現方式。先將它們都選出來,然後幫這個選擇組合 "sele" 更改成 "Zn" 以利修改( "set_name sele, Zn"),在 Zn 的工具區域選擇其顯示的圖形(本次操作show>spheres,並設定顏色 color>grays)。p.s: Sphere的大小可以修改
完成以上的作業後,即將進入到一個更小的區域去做設定了。一開始操作的時候陷入困難,原因是找不到與老師預設的顏色,但最終完成了。
做法如下:
1. 將視野放大到左邊的橘色框框中
2. 把視野角度調整到下圖的位置
3. 通過滾動滾輪較後面的彩帶隱藏,然後通過調整透明度將"cartoon"設定成較為透明的狀態
4. 選擇目標氨基酸作為後續的處理,可以直接透過下圖點選位置,也可以在protein sequence中選取想要改變的氨基酸
5. 將所選取的氨基酸更名,指令欄中輸入"set_name sele, Cys",方便作業
6. 在Cys的欄位中選取 "show>side chain","color>by element","label>residue"
7. 在指令欄中輸入 "set sphere_scale=0.4","set label_color, black","set label_size, -0.5"

完成~~

接下來便是如何將下圖中的距離標示出來。
做法:
1. "Wizard > measurement"
2. 自動跳出測量距離的工具,點選兩個元素讓程式自動測量距離。
3. 完成後稍微在右方的工具列中調顏色。
4. 成果與下圖的畫質差很多,做完記得 ray 就可以得到下圖。
更改sele的一些設定是可以直接在原來的protein structure中做一些修改,但是沒有辦法快速做到下圖的那種圖形。可以讓程式生成特定的物件但是不與原本的protein同步。
做法:
1. 在指令欄中輸入"create red, chain F",先前將chain F 設定紅色的彩帶,這個指令就是將 chain F 生成一個叫 "red" 的物件,跟顏色本身無關。右邊的欄位中就會出現 "red" 物件,可以調整其顏色、外觀。
2. "Hide>Everything", "show>ribbon"
3. 利用以下指令重複1~2做法,但更改 "show" 的呈現圖形
create purple, chain E
create cyan, chain B
create blue, chain A
create green, chain D
create yellow, chain C
4. 在"2AVU"的物件中將所有東西隱藏 "Hide> everything"
完成下圖~~

這是本週的進度,下週待續~~~~