Thursday, March 4, 2010

Python Programming

More on Function
ประพัฒน์ สุริยผล

ครั้งนี้ เราจะทำให้โปรแกรมที่เราเขียนขึ้นเอง อ่านง่าย กะทัดรัด และแก้ไขได้ง่ายขึ้นไปอีก

เมื่อครั้งก่อนเราใช้ฟังก์ชัน เพื่อช่วยแบ่ง code ที่อยู่ในกลุ่มเดียวกันออกไปอยู่เป็นฟังก์ชัน ทำให้เรามองเห็น structure และ flow การทำงานของโปรแกรมได้ดีขึ้น ถ้าหากเราไม่แบ่งฟังก์ชัน เงื่อนไขต่างๆ ของ if คงจะไม่ชัดเจนและอยู่ใกล้กันอย่างที่เรามีอยู่

ครั้งนี้ เราจะใช้ฟังก์ชันเข้ามาช่วยเราในอีกกรณีหนึ่ง ซึ่งมีความสำคัญมาก ควรที่จะเรียนรู้อย่างยิ่ง นั่นคือการใช้ฟังก์ชันเพื่อลด code redundancy หรือ code duplication ทุกครั้งที่เราเขียน code ที่ดูเหมือนจะซ้ำๆ กัน เมื่อเราต้องการแก้ไขโปรแกรม สิ่งที่มักจะเกิดขึ้นก็คือ เราจะได้เข้าไปแก้ไขที่ code เหล่านั้นทุกที่ บางครั้งการลืมแก้ไขในบางที่ ก็จะทำให้โปรแกรมทำงานผิดพลาด

ลองดูที่ code ข้างล่างนี้

def calculateRectangleArea():
____print "Program to calculate Area of Rectangle"
____base = raw_input("Please enter base -> ")
____height = raw_input("Please enter height -> ")
____base_int = int(base)
____height_int = int(height)
____print "Rectangle area of base", base, "and height", height,\
__________"is", base_int*height_int

def calculateTriangleArea():
____print "Program to calculate Area of Triangle"
____base = raw_input("Please enter base -> ")
____height = raw_input("Please enter height -> ")
____base_int = int(base)
____height_int = int(height)
____print "Triangle area of base", base, "and height", height, "is",\
__________base_int*height_int*0.5

def calculateCircleArea():
____print "Program to calculate Area of Circle"
____radious = raw_input("Please enter radious -> ")
____radious_int = int(radious)
____print "Circle area of radious", radious, "is", 3.14159*radious_int*radious_i

เราจะเห็น pattern ที่ซ้ำๆ กันอยู่ในฟังก์ชัน ประเด็นสำคัญคือเราจะสร้างฟังก์ชันใหม่อย่างไรให้เหมาะสม จุดนี้เป็นจุดสำคัญที่สามารถเรียนรู้ได้จากประสบการณ์และดู code ที่คนอื่นเขียน

เท่าที่มองดู ทุกๆ ฟังก์ชัน จะมีการพิมพ์ชื่อ title อ่านค่าจากผู้ใช้ แล้วแสดงผล จำนวนค่าที่ต้องการจากผู้ใช้ ไม่จำเป็นต้องเท่ากัน อย่างเช่นพื้นที่วงกลมต้องการแค่ค่าเดียว แต่สิ่งที่เหมือนกันในการอ่านค่าคือ เมื่ออ่านค่าเสร็จ ก็จะต้องแปลงค่าเป็น integer ตรง��ุดนี้เราอาจจะทำอะไรบางอย่างได้ เพื่อให้โปรแกรมของเราอ่านง่ายขึ้นดังตัวอย่างด้านล่าง

def calculateRectangleArea():
____print "Program to calculate Area of Rectangle"
____base = getUserInput("Please enter base -> ")
____height = getUserInput("Please enter height -> ")
____print "Rectangle area of base", base, "and height", height, "is", base*height

อันที่จริง สิ่งนี้เป็น code ที่เราต้องการเขียนตั้งแต่ต้น อ่านตรงไปตรงมา ไม่ต้องกังวลว่าค่าที่คืนมาต้องแปลงให้เป็น integer สิ่งที่เราต้องทำตอนนี้ก็คือ ฟังก์ชัน getUserInput ยังไม่มี ภาษา python ไม่มีฟังก์ชันนี้ และเป็นหน้าที่ของเราที่ต้องเขียนฟังก์ชันนี้ขึ้นมาใช้เอง

เราเริ่มต้นด้วยการ นิยามฟังก์ชัน

def getUserInput(text_to_display):

จะเห็นว่านิยามครั้งนี้ต่างจากครั้งแรกที่ในวงเล็บเราใส่ชื่อตัวแปรเอาไว้ ในที่นี้คือ text_to_display เราเรียกตัวแปรนี้ว่า พารามิเตอร์ (parameter) เพราะถ้าเราสังเกตคำสั่งที่ใช้เรียกฟังก์ชันนี้ จะมีการส่งค่าประโยคที่ต้องการถามผู้ใช้ไปให้ฟังก์ชัน เพราะฉะนั้น เราต้องเตรียมตัวแปรพารามิเตอร์เอาไว้เพื่อรองรับสิ่งที่ส่งมา

เมื่อฟังก์ชันถูกเรียกใช้ ตัวแปร text_to_display ก็จะมีค่าตามที่ถูกใช้ส่งมา สิ่งที่ต้องทำก็คือนำตัวแปรนี้ไปใช้ต่อ ดังด้านล่าง

def getUserInput(text_to_display):
____input = raw_input(text_to_display)
____return int(input)

สิ่งที่ฟังก์ชันนี้ทำ คือนำ text_to_display ไปใช้ต่อในคำสั่ง raw_input เพื่อรับค่าจากผู้ใช้ เสร็จแล้วจึงคืนค่าที่แปลงเป็น integer กลับไป ด้วยคำสั่ง return ถ้าหากฟังก์ชันไม่ต้องคืนค่าใดๆ เราก็ไม่ต้องใช้คำสั่ง return (เหมือนที่เราเรียกใช้ฟังก์ชัน calculateRectangleArea() หรือฟังก์ชันอื่นๆ ก่อนหน้านี้) ค่าที่คืนกลับไปจะเป็นตัวเลขเรียบร้อย ไม่จำเป็นต้องแปลงค่าต่อไปอีก

แบบฝึกหัด

ให้แปลงโปรแกรมที่เขียนขึ้น ให้เรียกใช้ getUserInput แล้วดูว่า โปรแกรมกะทัดรัดขึ้นหรือไม่ จำนวนบรรทัดลดลงไหม อ่านง่ายขึ้นหรือไม่

Good and Not So Good Programs

โปรแกรมที่ดีไม่จำเป็นต้องเป็นโปรแกรมที่สั้นที่สุด (จำนวนบรรทัดน้อยที่สุดเสมอไป) แต่ส่วนใหญ่โปรแกรมที่ดีมักจะสั้นกว่าโปรแกรมที่ไม่ค่อยดี เพราะโปรแกรมที่ดีจะไม่มี code ที่ซ้ำซ้อน ส่วนที่ซ้ำซ้อนจะถูกแยกออกมาเป็นฟังก์ชัน แต่สิ่งนี้ก็ไม่ใช่กฎตายตัว code ที่แยกฟังก์ชันยิบย่อยเกินไป หรือแยกฟังก์ชันในตำแหน่งที่ไม่ควรจะแยก จะทำให้โปรแกรมนั้นกลายเป็นโปรแกรมที่ไม่ดีได้

ลักษณะของโปรแกรมที่ดีคือ
1. ทำงานได้ถูกต้อง (สำคัญที่สุด ถูกไหม)
2. อ่านเข้าใจง่าย (ชื่อตัวแปรชัดเจน ชื่อฟังก์ชันชัดเจน การทำงานของโปรแกรมสามารถทำความเข้าใจได้ง่าย)
3. สามารถปรับเปลี่ยนเพิ่มเติมหรือแก้ไขได้ง่าย หากต้องการเพิ่มคุณสมบัติต่างๆ เข้าไป สามารถทำได้ โดยแทบจะไม่ต้องแก้ไขส่วนที่เขียนไว้อยู่แล้ว ที่เป็นเช่นนี้ เพราะถ้าหากเราต้องเข้าไปแก้ไขส่วนที่เขียนไว้อยู่แล้ว จะมีโอกาสสูงที่เราจะทำให้โปรแกรมทำงานผิดพลาดได้ โดยเฉพาะโปรแกรมที่เราต้องการแก้ไขเป็นโปรแกรมขนาดใหญ่หรือไม่ได้เขียนด้วย ตัวเราเอง
4. สั้น และกะทัดรัดที่สุด เท่าที่ไม่รบกวนกฎข้อที่ 1 และ 2

แบบฝึกหัด

ลองดูโปรแกรมแบบต่างๆ 6 แบบดังด้านล่าง แล้วให้คะแนนตั้งแต่ 1-3 (1 ต่ำสุด 3 สูงสุด) พร้อมเหตุผลประกอบ ในแต่ละหัวข้อดังต่อไปนี้

1. โปรแกรมทำงานถูกต้อง ตามที่ต้องการไหม (คะแนน 1-3)
2. โปรแกรมอ่านเข้าใจง่ายไหม (คะแนน 1-3)
3. ถ้าต้องการเพิ่มการคำนวณพื้นที่รูปร่างอื่นๆ เข้าไปอีก ทำได้ง่ายไหม (คะแนน 1-3)
4. ความสั้นและกะทัดรัด (คะแนน 1-3)

แบบที่ 1

def calculateRectangleArea():
____print "Program to calculate Area of Rectangle"
____base = getUserInput("Please enter base -> ")
____height = getUserInput("Please enter height -> ")
____print "Rectangle area of base", base, "and height", height, "is", base*height

def calculateTriangleArea():
____print "Program to calculate Area of Triangle\nTriangle area = 0.5*base*height"
____base = getUserInput("Please enter base -> ")
____height =getUserInput("Please enter height -> ")
____print "Triangle area of base", base, "and height", height, "is", 0.5*base*height

def calculateCircleArea():
____print "Program to calculate Area of Circle\nCircle area = 3.14159 * radius^2"
____radius = getUserInput("Please enter radius -> ")
____print "Circle area with radius", radius, "is", 3.14159 *radius**2

def calculateTrapezoidsArea():
____print "Program to calculate Area of Trapezoids"
____# = 0.5 * (parallelbase1+parallelbase2)* height
____parallelbase1 = getUserInput("Please enter parallel base1 -> ")
____parallelbase2 = getUserInput("Please enter parallel base2 -> ")
____height = getUserInput("Please enter height -> ")
____print "Trapozoids area of parallel base1", parallelbase1, "parallel base2",\
__________parallelbase2, "and height", height, "is",\
__________0.5*(parallelbase1 + parallelbase2)*height

def getUserInput(text_to_display):
____input = raw_input(text_to_display)
____return int(input)

choice = raw_input("Which type of area you would like to calculate (R/T/C/Z)? -> ")
if choice == "R" or choice == "r":
____calculateRectangleArea()
elif choice == "T" or choice == "t":
____calculateTriangleArea()
elif choice == "C" or choice == "c":
____calculateCircleArea()
elif choice == "Z" or choice == "z":
____calculateTrapezoidsArea()
else:
____print "Please type R,T,C or Z to choose the type of area to calculate"

แบบที่ 2

def calculateArea(Area):
____print "Program to calculate Area of", Area
____base = getUserInput("Please enter base -> ")
____height = getUserInput("Please enter height -> ")
____if Area == "Rectangle":
________print "Rectangle area of base", base, "and height", height, "is", base*height
____elif Area == "Triangle":
________print "Triangle area of base", base, "and height", height, "is", 0.5*base*height

def calculateCircleAndTrapezoids(Value):
____if Value == "Circle":
________radius = getUserInput("Please enter radius -> ")
________result = 3.14159*(radius**2)
________print "Circle area of radius", radius, "is", result
____elif Value == "Trapezoids":
________height = getUserInput("Please enter height -> ")
________parallel_base_top = getUserInput("Please enter parallel_base_top -> ")
________parallel_base_bottom = getUserInput("Please enter parallel_base_bottom -> ")
________print "Trapezoids area of parallel base top and bottom", parallel_base_top, \
______________"and", parallel_base_bottom, "and height", height, "is", \
______________1.0/2.0*(parallel_base_top + parallel_base_bottom)*height

def getUserInput(text_to_display):
____input = raw_input(text_to_display)
____return int(input)

choice = raw_input("Which type of area you would like to calculate (R/T/C/Z)? -> ")
if choice == "R" or choice == "r":
____calculateArea("Rectangle")
elif choice == "T" or choice == "t":
____calculateArea("Triangle")
elif choice == "C" or choice == "c":
____calculateCircleAndTrapezoids("Circle")
elif choice == "Z" or choice == "z":
____calculateCircleAndTrapezoids("Trapezoids")
else:
____print "Please type R,T,C or Z to choose the type of area to calculate"

แบบที่ 3

def calculateArea(area,check):
____print "Program to calculate Area of ",area
____if check == "r" or check == "t":
________base = getUserInput("Please enter base -> ")
________height = getUserInput("Please enter height -> ")
________if check == "r" :
____________print "Rectangle area of base=", base, "and height=", height, "is", \
__________________base*height
________elif check == "t" :
____________print "Triangle area of base=", base, "and height=", height, "is", \
__________________0.5*base*height
____elif check == "c":
________radius = getUserInput("Please enter radius -> ")
________print "Circle area of radius=", radius, "is", 3.14159*(radius*radius)
____elif check == "z":
________parallel_base1 = getUserInput("Please enter parallel base 1-> ")
________parallel_base2 = getUserInput("Please enter parallel base 2-> ")
________height = getUserInput("Please enter height -> ")
________print "Trapezoids area of parallel base1=", parallel_base1, '\n'\
______________"parallel base2=", parallel_base2, '\n'"and height=", height,"is",\
______________0.5*(parallel_base1+parallel_base2)*height

def getUserInput(text_to_display):
____input = raw_input(text_to_display)
____return int(input)

choice = raw_input("Which type of area you would like to calculate (R/T/C/Z)? -> ")
if choice == "R" or choice == "r":
____calculateArea("Rectangle","r")
elif choice == "T" or choice == "t":
____calculateArea("Triangle","t")
elif choice == "C" or choice == "c":
____calculateArea("Circle","c")
elif choice == "Z" or choice == "z":
____calculateArea("Trapezoids","z")
else:
____print "Please type R,T,C,Z to choose the type of area to calculate "

แบบที่ 4

def getUserInput(text_to_display):
____input = raw_input(text_to_display)
____return int(input)

def calculateAREA(Area_of):
____print "Program to calculate Area of", Area_of
____if Area_of == "Circle":
________radious = getUserInput("Please enter radious -> ")
________result = 3.14159*radious*radious
____elif Area_of == "Trapezoid":
________parallel_line1 = getUserInput("Please enter length of 1st parallel line -> ")
________parallel_line2 = getUserInput("Please enter length of 2nd parallel line -> ")
________height = getUserInput("Please enter height -> ")
________result = (parallel_line1+parallel_line2)*height*0.5
____else:
________base = getUserInput("Please enter base -> ")
________height = getUserInput("Please enter height -> ")
________if Area_of == "Rectangle":
____________result = base*height
________else:
____________result = base*height*0.5
____print Area_of, "area is", result

i = 0
while i == 0:
____choice = raw_input("Which type of area you would like to calculate\
_______________________(R,T,Z or C)? -> ")
____if choice == "R" or choice == "r":
________calculateAREA("Rectangle")
________i += 1
____elif choice == "T" or choice == "t":
________calculateAREA("Triangle")
________i += 1
____elif choice == "C" or choice == "c":
________calculateAREA("Circle")
________i += 1
____elif choice == "Z" or choice == "z":
________calculateAREA("Trapezoid")
________i += 1
____else:
________print "Please type R,T,Z or C to choose the type of area to calculate."

แบบที่ 5

def calculateCircleArea():
____print "Program to calculate Area of Circle"
____radius = getUserInput("Please enter radius -> ")
____print "Circle area of radius", radius ,"is",3.14159*(radius**2)

def calculateTrapezoidsArea():
____print "Program to calculate Area of Trapezoids"
____parallel_1 = getUserInput("Please enter parallel_base1 -> ")
____parallel_2 = getUserInput("Please enter parallel_base2 -> ")
____height = getUserInput("Please enter height -> ")
____print "Trapezoids area of parallel_base1", parallel_1,\
__________"\nTrapezoids area of parallel_base2", parallel_2,"\nand height", height,\
__________"\nis", 0.5*(parallel_1+parallel_2)*height

def getUserInput(text_to_display):
____input = raw_input(text_to_display)
____return int(input)

def baseadnheight(area):
____print "Program to calculate Area of ",area
____base = getUserInput("Please enter base -> ")
____height = getUserInput("Please enter height -> ")
____if(area=="Rectangle"):
________a = base*height
____else:
________a = base*height*0.5
____print area," area of base", base,"and height", height,"is", a

choice = raw_input("Which type of area you would like to calculate (R/T/C/Z)? -> ")
if choice == "R" or choice == "r":
____baseadnheight("Rectangle")
elif choice == "T" or choice == "t":
____baseadnheight("Triangle")
elif choice == "C" or choice == "c":
____calculateCircleArea()
elif choice == "Z" or choice == "z":
____calculateTrapezoidsArea()
else:
____print "Please type R, T, C or Z to choose the type of area to calculate"

แบบที่ 6

def getUserInput(text_to_display):
____input = raw_input(text_to_display)
____return int(input)

def calculateRectangle():
____print "Program to calculate Area of Rectangle"
____base = getUserInput("Please enter base -> ")
____height = getUserInput("Please enter height -> ")
____print "Rectangle area of base", base, "and height", height, "is", base*height

def calculateTriangle():
____print "Program to calculate Area of Triangle"
____base = getUserInput("Please enter base -> ")
____height = getUserInput("Please enter height -> ")
____print "Triangle area of base", base, "and height" , height , "is",\
__________0.5*base*height

def calculateCircle():
____print "Program to calculate Area of Circle"
____radius = getUserInput("Please enter radius -> ")
____print "Circle area of radius", radius , "is", 3.14159*(radius**2)

def calculateTrapezoids():
____print "Program to calcultae Area of Trapezoids"
____parallel_base1 = getUserInput("Please enter 1st parallel base -> ")
____parallel_base2 = getUserInput("Please enter 2nd parallel base -> ")
____height = getUserInput("Please enter height -> ")
____print "Trapezoids area of parallel base", parallel_base1, parallel_base2,\
__________"and height",height, "is", 0.5*((parallel_base1+parallel_base2)*height)

choice = raw_input("Which type of area you would like to calculate (R/T/C/Z)? -> ")
if choice == "R" or choice == 'r':
____calculateRectangle()
elif choice == "T" or choice == "t":
____calculateTriangle()
elif choice == "C" or choice == "c":
____calculateCircle()
elif choice == "Z" or choice == "z":
____calculateTrapezoids()
else:
____print "Please type R, T , C or Z to choose the type of area to calculate"

Talk to...

ดร.ทรงศักดิ์ ทองชูศักดิ์ จาก Siam Bioscience Co., Ltd.​
จิตสุพางค์ รอดบำเรอ



สวัสดีค่ะ เดือนที่ผ่านมาเพื่อนๆ ผู้อ่านชาว THAI BIOINFORMATICS ได้ไปฉลองตรุษจีนแห่งความรักกันสนุกไหมเอ่ย ก้อยว่าหลายคนคงจะรับอั่งเปากันเยอะละสิ พูดแล้วก็อิจฉานะคะ แต่อย่ามัวแต่ไป shopping กันเพลิน จนลืมอ่าน e-Magazine ของเรานะคะ

เอาละค่ะ ฉบับนี้ก้อยยังยึด concept เดิม คือ แขกที่จะมาคุยกับก้อย ต้องเป็น นักวิทยาศาสต์หนุ่ม รุ่นใหม่ ไฟแรง แล้วก้อยก็เลือกมาแล้วค่ะ ฉบับนี้ก้อยจะพาคุณผู้อ่านไป Talk to… กับ ดร. ทรงศักดิ์ ทองชูศักดิ์ ค่ะ เขาคนนี้เป็นนักวิจัยจากบริษัท Siam Bioscience จำกัด ค่ะ อยากรู้จักกับเขาแล้วใช่ไหมคะ เราไป Talk to… กับ ดร. ทรงศักดิ์ กันเลยดีกว่า

เนื่องจากก้อยกับเอ็กซ์ เป็นเพื่อนรุ่นเดียวกันค่ะ เลยจะขอเรียกสั้นๆ เพื่อความเป็นกันเองว่า “เอ็กซ์” เลยแล้วกันนะคะ

เอ็กซ์เริ่มจับงานด้าน bioinformatics ตั้งแต่เมื่อไหร่

เริ่มจับงาน bioinformatics ตอนเรียนปริญญาเอกครับ bioinformatics ที่ทำตอน��รียนปริญญาเอก จะเป็นด้านที่เกี่ยวกับภูมิคุ้มกันด้วย เราเรียกว่า “immunoinformatics” ซึ่งเป็น computational immunology โดยไปทำที่ Institute for Infocomm research หรือ I2R ที่สิงคโปร์ เป็นของ A*STAR หน่วยที่ไปเนี่ยะ คือ หน่วย Venom Informatics ตอนนั้นก็ไปเรียน bioinformatics พื้นฐาน มีวิธีการสร้างฐานข้อมูลทุติยภูมิ (secondary database) ซึ่งเป็นฐานข้อมูลเฉพาะทางเกี่ยวกับพวกเชื้อต่างๆ แต่ที่เอามาใช้ในการทำวิทยานิพนธ์ก็คือ virulence factor ของเชื้อ Candida albicans ตอนนั้นเราได้ทำการสร้างฐานข้อมูลขึ้น แล้วก็ online เอาไว้แต่ตอนนี้ฐานข้อมูลนี้ถูกปิดไปแล้วจากคณะผู้บริหารชุดใหม่ของ I2R เนื่องจากนโยบายใหม่จะไปผลักดันงานวิจัยพวก microarray มากกว่า พอตีพิมพ์ผลงานไปตอนปี 2004 ก็มีคน e-mail มาขอข้อมูลแต่ไม่มีให้เขาใช้ เพราะว่าเราไม่มีข้อมูลที่สมบูรณ์อยู่ที่นี่

ตอนอยู่ที่โน่นก็สร้างฐานข้อมูลให้คนเข้าไปวิเคราะห์ virulence factor ของเชื้อ Candida sp. ได้ และสิ่งที่พิเศษก็คือ เราใส่โปรแกรมที่ใช้ในการทำนาย T-cell epitope ทั้ง peptide ที่จับกับ MHC class I และ class II ซึ่งของคนจะเรียกว่า HLA หรือ Human Leucocytic Antigen

ฉะนั้นถ้าใครศึกษาภูมิคุ้มกันต่อ Candida sp. ก็จะสามารถเข้าไปทำนาย T-cell epitope ของ virulence factor ของเชื้อได้ virulence factor นอกจากจะมีความสามารถในการก่อโรคแล้ว peptide บางตัวยังมีคุณสมบัติเป็น antigen ด้วย พอสร้างฐานข้อมูลเสร็จ ก็เลือก antigen มาตัวนึง อันนี้เป็นงานวิทยานิพนธ์ ก็เลือก secreted aspartyl proteinase 2 (SAP 2) แล้วเอามาทำนาย antigen โปรแกรมที่ใช้ทำนายเราก็ใส่ไว้ในฐานข้อมูล โดยเจ้านายที่สิงคโปร์ชื่อ Prof. Vladimir Brusic ได้พัฒนาโปรแกรมชื่อ Hotspot Hunter แล้วก็มีการทำนาย T-cell epitope แบบ promiscuous T-cell epitope prediction คือทำนายครั้งเดียว peptide จะสามารถจับ HLA ได้หลายแบบ เพื่อประโยชน์ในการนำไปพัฒนาเป็นวัคซีนได้ คือ peptide เส้นเดียวใช้ทำวัคซีนที่ใช้ในคนได้หลากหลาย HLA เนื่องจากโปรแกรมนี้ยังไม่มีการ validate ในทางการทดลอง แค่ validate ในการใช้ dataset ของคนอื่น เราก็เลยทำการทดลอง 2 ชุด ชุดแรกสังเคราะห์ peptide แบบ conventional อีกชุดก็สังเคราะห์ตามโปรแกรม แล้วก็ไปทดสอบว่าสามารถกระตุ้นเม็ดเลือดขาว แล้วมีการ proliferation หรือไม่ ปรากฏว่า peptide ที่ทำนายมาอยู่ในบริเวณเดียวกัน ก็คือใช้ได้ แล้วก็ label ใน 3D structure ว่า epitope มันซ่อนอยู่ตรงไหน หัน side chain เข้าไปตรงไหน อันนี้ก็เป็นงานตอนปริญญาเอก

ตอนนั้นทำไมถึงเลือกที่จะไปทำที่สิงคโปร์

อันนี้ก็เนื่องมาจากอาจารย์ที่ปรึกษา คือ ผศ. ดร. ศันสนีย์ ไชยโรจน์ ได้รู้จักกับ Prof. คนนี้ตั้้งแต่ตอนที่อาจารย์ทำ postdoctoral อยู่ที่ออสเตรเลีย แล้วช่วงนั้นเขามาอยู่ที่สิงคโปร์พอดี ซึ่งก็ใกล้และค่าใช้จ่ายต่างๆ ก็จะถูกลง แล้วเขาก็จ่ายทุนให้ด้วย ซึ่งเป็นทุนของ NIH ที่เขาได้มา

แสดงว่าทุน คปก. ก็ไม่ได้ใช้ในส่วนนี้

ไม่ได้ใช้เลย คืนทุนไปหนึ่งล้านบาท เนื่องจากเราเขียนขอทุนสำหรับโครงการนี้จาก สวทช. แล้วสามล้านบาท

พอจบปริญญาเอกแล้วเอ็กซ์ไปทำวิจัยหลังปริญญาเอกเลยหรือเปล่า

ก็ไปทำกับคนเดิมนี่แหละ พอดีเค้าย้ายไปอยู่ที่มหาวิทยาลัย Harvard เนื่องจากความสามารถในการทำ molecular database ทางด้าน immuno-informatics ของเขา และเขาก็เป็นผู้ก่อตั้งสมาคม ที่ชื่อว่า The International Immunomics Society (IIMMS) ซึ่งเราก็เป็นสมาชิกอยู่ อันที่จริง สมาคมนี้เป็นของยุโรป แต่ Prof. คนนี้เขาดูแลอยู่ ก็เลยเอาเวปไซต์มาที่ Harvard เป็นของ Dana-Farber Cancer Institute

อยู่ที่โน่น ก็ทำงานในหน่วย cancer vaccine center ของสถาบันมะเร็ง Dana-Farber Cancer Institute อยู่ในหน่วยที่ตั้งขึ้นมาใหม่เพราะว่า Prof. คนนี้ไปอยู่ ก็คือ bioinformatics core ซึ่งจะทำงานหลักๆ อยู่ 3 ส่วน คือ ทุกคนจะต้องมีงานวิจัยเป็นของตัวเอง แล้วก็จะต้องมีงานบริการ และก็จะต้องมีงานด้าน infrastructure คือ ดูแลพวกระบบคอมพิวเตอร์ ซึ่งเรามี biology background ก็จะดูอยู่ 2 ส่วน คือทำงานวิจัยของตัวเองกับงานบริการ หน้าที่หลักๆ ก็ทำเกี่ยวกับ molecular database เป็นส่วนใหญ่ แล้วก็ทำ antigenic prediction บ้าง

เหมือนกับว่าเขารู้มือเราอยู่แล้ว

ใช่ เขาก็เลยเอาไปทำ เพราะเขาต้องการคนที่ทำเป็นอยู่แล้ว เนื่องจากเขาเพิ่งไปอยู่ที่ Harvard ใหม่ๆ แล้วเขาก็ต้องการผลงานที่ออกมาเร็ว ก็ 2 ปี ทำไป 4 ฐานข้อมูล เป็น antigen ของมะเร็งอันนึง อีก 3 อันเป็นของไวรัส ซึ่งจะทำงานร่วมกับหมอที่โรงพยาบาลที่โน่น คือ Epstein-barr virus กับหมออีกคนทำ human papilloma virus ทั้งหมดนี้ทำเพื่อประโยชน์ในการทำนาย T-cell epitope ทำ novel epitope finding คือทำจากการรวบรวม known sequences แล้วก็มีการ screen แล้วก็ใส่เข้าไปในฐานข้อมูล ซึ่งสามารถเข้าไปหาได้ในเวบไซต์ อันนี้จะเป็น immuno ล้วนๆ เลย เนื่องจากอยู่ในหน่วยที่เป็น cancer vaccine เพราะฉะนั้น เราจะ service ให้เขาในการหา epitope target เอาไปทำ vaccine research

ตอนปีแรก ก็จะเป็นงาน bioinformatics มากกว่า ก็จะทำงานร่วมกับ computer engineering ซึ่งเรามี biology background เลยเขียนโปรแกรมไม่ได้ พอเราได้ project มา เราอยากได้แบบนี้ เราก็ออกแบบเอง แล้วก็ไปคุยกับนักคอมพิวเตอร์ นักคอมพิวเตอร์จะเขียนตามที่เราบอก หรือถ้าเขามี idea ไหน เขาก็จะปรับให้เหมาะสมกับแนวทางของเขา พอเราทำฐานข้อมูลได้หนึ่งอันแล้วก็จะมี 1 platform เพราะฉะนั้นเราก็เปลี่ยนข้อมูลต่อไปได้

พอปีที่ 2 ก็เริ่มขอเจ้านาย ว่า 30% ของเว��าทำงานไปทำ wet lab ประมาณวันครึ่ง ก็ไปทำวิจัยร่วมเกี่ยวกับ tumor vaccine ในหนู กับหน่วย cancer vaccine ซี่งก่อนหน้านี้หน่วยที่เราอยู่ก็ทำนาย antigen แล้วก็ส่งไปให้หน่วยนี้อยู่แล้ว เจ้านายก็เลยเอาไปฝากไว้กับหน่วยนี้ว่าอยากฝึกฝีมือ แล้วเขาก็ formulate เป็น nano particle vaccine ไว้แล้ว ก็ไปฉีดหนู ทำ immuno คล้ายๆ ที่ทำวิทยานิพนธ์ ก็จะมีบางเทคนิคที่ไม่เคยทำ พอทำไปได้พักนึง ก็เขียน paper จะตีพิมพ์ ปรากฏว่าทีมที่แคนนาดาเขาตีพิมพ์ออกมาก่อน จริงๆ แล้วต้องตีพิมพ์ทั้งหมด 6 ฉบับ แต่ตอนนี้ออกมาแค่ 2 ฉบับ เป็น co-author ส่วนที่เหลือที่เป็น first author แต่รอเจ้านายดูให้อยู่

ความรู้สึกที่ไปทำงานที่สิงคโปร์กับที่อเมริกาต่างกันยังไง

ต่างกัน ตอนที่อยู่ที่สิงคโปร์เขาจะ treat เราเป็นนักเรียน แต่ที่อเมริกาเขาจะ treat เราเป็น postdoc

ที่ Harvard นี่โหดมาก ให้เงินน้อย ใช้งานเยอะ แล้วก็ไล่กลับบ้านเร็ว (ใช่ ฝรั่งเขาไม่ค่อยให้อยู่ดึก เราเคยโดนไล่ให้กลับบ้านเหมือนกัน) ใช่ เขาบอกว่า don’t work hard ให้ work smart ซึ่งในทางปฏิบัติแล้วมันทำไม่ได้ ต้องหอบกลับมาทำต่อที่บ้าน ข้อสังเกตอีกอย่างก็คือ เวลาเป็น postdoc แล้วจะไม่มีการมาอ่าน paper ในห้องแลป ต้องอ่านมาจากบ้าน แล้วมาทำงานเลย postdoc คือคนทำงาน จะมาอ่าน paper ที่ทำงานไม่ได้ มันเสียเวลา

เหมือนกับว่าเราต้องเตรียมตัวมาให้พร้อม

ใช่ แล้ว lab meeting เนี่ยะมี 4 วันต่อสัปดาห์ เนื่องจากมันเป็นหน่วยที่อยู่ในหน่วยใหญ่ หลายหน่วยซ้อนกัน

ก็เหมือนกับว่าเป็น lab meeting ของแต่ละหน่วย

ใช่ แต่เจ้านายต้องการ ไปเผยแพร่เกี่ยวกับ bioinformatics และก็ไปดูว่าเขาวางแผนจะทำวิจัยอะไร ยังไง แล้ว bioinformatics จะเข้าไปช่วยตรงส่วนไหน ช่วยส่งเสริมงานกัน

อย่างนี้พอเราทำนายอะไรออกไป ก็จะต้องมีการทำ wet lab อีก

bioinformatics ในงานนี้เหมือนเป็นการ pre-screen สมมติว่าเราต้องการหา T-cell epitope จากโปรตีนแล้วใช้วิธีการแบบ conventional คือการ scan เราต้องสังเคราะห์กรดอะมิโน 15 ตัว ไปเรื่อยๆ ถ้าโปรตีนเล็กๆ ก็ไม่เป็นไร ถ้าโปรตีนใหญ่ก็คงหมดหลายล้าน คราวที่แล้วสังเคราะห์ไปประมาณ 40 เส้น ก็หมดไปประมาณล้านนึง ฉะนั้น ถ้า antigen ตัวเดียว เสียค่าสังเคราะห์ล้านกว่าก็ไม่ได้ ดังนั้นข้อดีของ bioinformatics คือ ช่วยในการทำนาย โดยมี concept ว่า faster, better and cheaper

เราจะต้องลงทุนโปรแกรมอะไรมากไหม

ไม่ต้องลงทุน ตอนที่ไปทำมาเนี่ยะ เขาจะแนะนำให้ใช้โปรแกรมออนไลน์ เนื่องจากเขาจะ update data set อยู่ตลอดเวลา ถ้าใช้โปรแกรมที่ต้องซื้อมา มันจะต้องเสียเงิน เสียเวลาไปซื้ออีกเวอร์ชั่นนึง

อันนี้ก็เป็นการแนะนำคนอื่นต่อไปด้วยว่าลองมาใช้พวก freeware หรือพวกออนไลน์ ก็ได้นะ เพราะเราเห็นก็มีบางคนชอบโปรแกรมสำเร็จรูปที่ขายอยู่

มันไม่ค่อยดี เสียเงินด้วย ใช้ออนไลน์จะดี แต่โปรแกรมที่ใช้ในการทำนายก็มีอยู่ 30-40 โปรแกรมที่ออนไลน์อยู่ ก็จะมีปัญหาในการ���ลือกใช้ ว่าตัวไหนเหมาะกับการทำนายแบบไหน อันไหนดีไม่ดี เราก็ได้ตีพิมพ์ paper มา 2 ฉบับ หลักในการทำนาย peptide ที่จับกับ MHC class I และ class II ของ มนุษย์ เพื่อนำไปใช้ในการหา vaccine target ซึ่ง paper ที่เราตีพิมพ์จะแนะนำว่า ถ้าเราจะทำนาย HLA นี้ จะต้องเลือกเวบไซต์ไหน เลือกโปรแกรมของ server ไหน ถึงจะแม่นยำ มีการทดสอบทางสถิติด้วย ก็จะมีหลักการในการทำนายอีก ไปหาอ่านได้

ช่วยกรุณา cite ตัว paper ให้ด้วยใช่ไหม

ใช่ ช่วยกรุณา cite ด้วย เพื่อประโยชน์ในการศึกษาวิจัยต่อไป

ทำไมเอ็กซ์ถึงกลับมาเมืองไทย

ตัดสินใจช้า ว่าจะเปลื่ยนไปทำที่อื่นบ้าง แล้วทำสัญญาใหม่คงไม่ทัน ก็เลยกลับเมืองไทยดีกว่า กลับมาตอนแรกไปทำงานเป็นอาจารย์ที่ภาควิชาจุลชีววิทยา คณะแพทย์ศาสตร์ จุฬาฯ อยู่ประมาณ 4-5 เดือน แต่เขาไม่สามารถหาตำแหน่งให้ได้ จะเขียนขอทุนก็ไม่ได้ เพราะไม่ใช่อาจารย์ เหมือนเป็นอาจารย์พิเศษ พอดีอาจารย์ศันสนีย์ โทรไปตามตัวให้มาทำที่บริษัท Siam Bioscience ในส่วนของงานตรงนี้ไม่สามารถบอกรายละเอียดได้นะ (เข้าใจว่าเป็นความลับบริษัท) เอาเป็นว่า เป็นบริษัทผลิตวัตถุชีวภัณฑ์ (biopharmaceutical) เพื่อใช้สำหรับรักษาโรค ขายในเมืองไทย ทำให้ได้ยาราคาถูก และเราก็อยู่ในส่วน R&D ของบริษัท

สุดท้ายแล้ว อยากให้ฝากคำแนะนำสำหรับคนที่เริ่มจับงาน bioinformatics ว่าควรเตรียมตัวอะไรบ้าง

ขอให้มีใจรักก่อนเป็นอันดับแรก มีความสนใจ อยากที่จะเรียนรู้งานด้าน bioinfor-matics แต่โดยส่วนตัวเนี่ยะ ก็จะประเมินตัวเองว่าความรู้ทางด้านคอมพิวเตอร์ของเราไม่มี ดังนั้นเราสามารถเรียนรู้ bioinformatics ในด้านของ user ให้เรียนรู้หลักและวิธีการใช้ที่ถูกต้อง ก็น่าจะเป็น bioinfor-matics ที่เหมาะสมสำหรับนักชีววิทยา ส่วนคนที่อยากจะเป็นนักพัฒนา ก็ต้องเปิดใจที่จะเรียนรู้ คณิต-ศาสตร์ สถิติเกี่ยวกับการนำไปใช้พัฒนาโปรแกรม หรือว่าพัฒนาระบบการวิเคราะห์ข้อมูลทางชีววิทยาได้ อยากให้คนรุ่นใหม่มาสนใจ bioinformatics ให้มากขึ้น

ก่อนอื่นเลย เราต้องมีความเชื่อเสียก่อนว่า bioinformatics ช่วยเราได้ เนื่องจากประสบการณ์ คนที่ทำ conventional experiment มักจะไม่เชื่อการทำนายโดย bioinformatics เพราะเขาคิดว่าเป็นการทำนาย ไม่ใช่ของจริง ในระบบชีววิทยามันซับซ้อนกว่านั้น อย่างที่ได้บอกไปแล้วว่า Faster, Better, & Cheaper อย่างน้อยเรามีการ pre-screen อีกอย่างประเทศเราเงินที่ใช้ในการวิจัยก็ไม่เยอะ ดังนั้นอะไรที่มันประหยัดได้ แล้วค่อยเอาเงินไปเสริมตรงส่วนที่ควรจะจ่ายน่าจะดีกว่า

ถ้าเราใช้ computational immunology ในด้าน epitope mapping ถ้าเราใช้โปรแกรมทำนายก่อนเอาไปทำแลป จะสามารถลดต้นทุนในการทำแลปลงไปได้ถึง 90% จากที่เราจ่ายหนึ่งล้าน ก็จะจ่ายหนึ่งแสน แล้วเราก็จะได้ positive result ซึ่งตอนนี้การันตีได้เลยว่ายังไงก็จะได้ผลบวก แต่ว่าต้องมีการทำนายอย่างถูกวิธีด้วย บางครั้งโปรแกรม alignment ก็ไม่สามารถให้ผลที่เราพอใจได้ จากที่ประสบการณ์ที่ทำกับไวรัสเนี่ยะ จะไม่มีโปรแกรมไหนที่จัดการได้ ก็ต้องทำเอง ตอนนี้ก็กำลังเขียนหนังสือ bioinformatics เพื่องานวิจัยวัคซีน (โปรโมตไปก่อนล่วงหน้าเลยนะ) ฝากด้วยนะครับ

เป็นยังไงกันบ้างคะ Talk to… กับ ดร. เอ็กซ์ ในฉบับนี้ เต็มเปี่ยมไปด้วยเนื้อหา สาระ ความรู้ และมุมมองมากมายกับงาน immuno-informatics สำหรับฉบับนี้ ก้อยคงต้องลาไปก่อนค่ะ แล้วพบกันใหม่ฉบับหน้าค่ะ