Tuesday, November 30, 2010

ฉบับที่ี่ 15 (พฤศจิกายน 2010)

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


“...ผมไม่รอกำลังใจและแรงบันดาลใจจากคนอื่นครับ ถ้าเราท้อ เราหมดกำลังใจ หรือสูญเสียแรงบันดาลใจ ในนาทีแบบนี้ ผมไม่รอครับ ผมจะสร้างมันขึ้นมาด้วยตัวเอง...”


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

สำหรับ THAI BIOINFORMATICS ฉบับนี้ก็เต็มแน่นไปด้วยสาระมากมายทั้งเรื่องราวทางเลือกของเซลล์แบบสวิตช์ไฟ หรือจะเป็นการทำงานกับ file ด้วย Python และยังมีการติดตั้ง R ในระบบปฏิบัติการต่างๆ อีกด้วย


นอกจากนี้ เรายังมีความยินดีที่จะเปิดคอลัมน์ใหม่ครับ ชื่อว่า Linux Command Line ซึ่งจะนำเสนอเรื่องราวของการใช้ command line จากผู้ที่มีประสบการณ์ในการใช้งาน Linux มานานอย่าง ณฐพล หรือ บอล ครับ อันที่จริงบอลกับผมรู้จักกันมานานแล้วครับ และบอลก็เข้ามาเป็นทีมงาน THAI Bioinformatics Network ด้วย แต่เพิ่งจะได้มีโอกาสเปิดคอลัมน์เป็นของตัวเองครับ


สำหรับผู้ที่ยังไม่ได้สมัครสมาชิกกับเรา ก็เร่งหน่อยนะครับ เวลาใกล้หมดลงแล้วครับ และสำหรับผู้อ่านคนใดที่มีคำติชม ก็สามารถเขียน e-mail เข้ามาหาผมและทีมงานทุกคนได้ที่ thaibioinfo@gmail.com ครับ ผมและทีมงานทุกคนยินดีรับฟังกับทุกความคิดเห็นครับ


Highlight

เซลล์กับทางเลือกของเซลล์แบบสวิตช์ไฟ (Biological Switches)

ธีรพันธ์ เหล่าเมตตาจิตต์


บทความนี้เป็นตอนต่อจากบทความในหัวข้อ Modeling Regulatory Networks ที่นำเสนอไปในนิตยสาร THAI Bioinformatics ฉบับที่ 10 ประจำเดือนมิถุนายน 2553 ใครสนใจลองกลับไปหาอ่านได้นะครับ


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


พฤติกรรมหลายๆ อย่างของเซลล์ เกิดจากการตัดสินใจเลือกแสดงออกเพียงหนึ่งแบบ จากทางเลือกสองทาง โดยไม่มีทางเลือกอื่นๆ ที่อยู่ตรงกลางระหว่างทางเลือกทั้งสอง ตัวอย่างได้แก่ การตายของเซลล์ (apoptosis) และการแบ่งตัวของเซลล์ (cell proliferation)


(1) การตายของเซลล์ (apoptosis)


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



(2) การแบ่งตัวของเซลล์ (cell proliferation)


เซลล์ส่วนใหญ่ภายในร่างกายของเรานั้นอยู่ในสถานะที่เรียกว่า G0 phase หรือสถานะที่ไม่แบ่งเซลล์ แต่หากมีความจำเป็น เช่นเกิดบาดแผลขึ้น เซลล์บริเวณดังกล่าว ก็จะถูกกระตุ้นให้เข้าสู่กระบวนการแบ่งเซลล์ (cell cycle) เพื่อทดแทนเซลล์ที่หายไป ขั้นตอนสำคัญในการแบ่งเซลล์ คือการสร้าง DNA ขึ้นมาอีกชุดหนึ่ง เพื่อแบ่งไปยังเซลล์ใหม่ที่กำลังจะเกิดขึ้น ดังนั้น เซลล์จำเป็นจะต้องเลือกสถานะของตนเองว่า จะอยู่ในสถานะปกติ (G0) หรือจะเข้าสู่สถานะของการแบ่งเซลล์


อย่างที่กล่าวไปในบทความชิ้นก่อนว่า การตัดสินใจของเซลล์นั้น เกิดจากการรับข้อมูลจากภายนอกแล้วนำมาประมวลผลกับวงจรของปฏิสัมพันธ์ระหว่างสารชีวโมเลกุลภายในเซลล์ ก่อนที่จะตัดสินใจตอบสนองให้เหมาะสมกับสิ่งแวดล้อม โดยปกติแล้วข้อมูลที่เซลล์นำมาใช้ประกอบการตัดสินใจจะเป็นข้อมูลที่มีความต่อเนื่อง อาทิเช่น การตัดสินใจแบ่งตัวของเซลล์ขึ้นอยู่กับ ปริมาณความเข้มข้นของสารกระตุ้นการแบ่งเซลล์ที่เรียกว่า mitogen หรือการตัดสินใจเข้าสู่กระบวนการตายของเซลล์ขึ้นอยู่กับปริมาณความเสียหายของสารพันธุกรรมภายในเซลล์ว่ามากน้อยเพียงใด ดังนั้น เซลล์จำเป็นจะต้องมีวิธีการแปลงข้อมูลที่มีความต่อเนื่อง (มาก-น้อย) เพื่อนำไปสู่การตอบสนองแบบไม่ต่อเนื่อง (แบ่ง-ไม่แบ่งเซลล์ หรือ เป็น-ตาย)


พฤติกรรมของเซลล์กับพฤติกรรมของสวิตช์ไฟ


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


คุณสมบัติอีกประการของพฤติกรรมการตัดสินใจของเซลล์ที่ต้องการเปรียบเทียบกับสวิตช์ไฟ ก็คือ เวลาเราเปิดสวิตช์ไฟ เมื่อไฟเปิดแล้ว เราสามารถเอาแรงดันที่นิ้วของเราออกจากตัวสวิตช์ได้ โดยไฟไม่ปิด หากเราต้องการปิดสวิตช์คืน เราจำเป็นต้องใช้แรงดันอีกด้านหนึ่งของปุ่ม การตอบสนองของเซลล์ก็เช่นกัน เมื่อเซลล์ตัดสินใจเปลี่ยนจากสถานะหนึ่งไปยังอีกสถานะหนึ่งแล้ว เซลล์มักจะไม่เปลี่ยนกลับมายังสถานะเดิม ถึงแม้ว่าตัวกระตุ้นจะถูกดึงออกไป ภาพประกอบที่ 2A แสดงตัวอย่างของสวิตช์ที่ดี คือ เมื่อเซลล์ตัดสินใจเข้าสู่กระบวนการตายแล้ว (ลูกศรสีดำ) เซลล์จะไม่กลับมาสู่สถานะปกติ ถึงแม้ว่าปริมาณความเสียหายของสารพันธุกรรม (DNA damage) จะลดลงแล้วก็ตาม (ลูกศรสีแดง) หรือ เมื่อเซลล์ตัดสินใจเข้าสู่กระบวนการแบ่งเซลล์แล้ว เซลล์ก็จะไม่กลับไปสู่สถานะ G0 อีก ถึงแม้สารกระตุ้นการแบ่งเซลล์จะถูกดึงออกก็ตาม เซลล์จำเป็นต้องดำเนินการแบ่งเซลล์จนเสร็จสิ้นเสียก่อน จึงจะกลับไปสู่สถานะ G0 ได้


เปรียบเทียบกับภาพประกอบที่ 2B ซึ่งแสดงตัวอย่างของสวิตช์ที่ไม่ดี คือ สวิตช์เด้งกลับ เมื่อเราผ่อนแรงดัน หากพฤติกรรมการแสดงออกของเซลล์เป็นเหมือนสวิตช์ที่ไม่ดี จะเกิดผลเสียอย่างมาก ลองจินตนาการว่า หากเซลล์เริ่มกระบวนการตายไปแล้ว (ลูกศรสีดำ) เซลล์จะเริ่มการสลายโปรตีนและ DNA ภายในเซลล์ หากกระบวนการสลายดังกล่าวเริ่มไปบ้างแล้ว แล้วปริมาณของ DNA damage ลดลง แล้วเซลล์ตัดสินใจหยุดกระบวน apoptosis (ลูกศรสีแดง) เราก็จะได้เซลล์ในสถานะเป็น แต่อยู่ในสภาพที่ไม่สมบูรณ์ หรือหากเซลล์ที่ตัดสินใจเข้าสู่กระบวนการแบ่งเซลล์ และเริ่มสร้าง DNA เพิ่มไปได้อีกครึ่งชุดแล้ว ปรากฏว่าการลดลงของปริมาณสารกระตุ้นการแบ่งเซลล์ ทำให้เซลล์กลับไปอยู่ในสถานะ G0 เซลล์ก็จะมี DNA เกินไปครึ่งชุด


การเปลี่ยนสถานะของเซลล์ขึ้นอยู่กับการทำงานของสารชีวโมเลกุล


การที่เซลล์เปลี่ยนจากสถานะหนึ่ง ไปยังอีกสถานะหนึ่งได้นั้น จะต้องมีสารชีวโมเลกุลบางชนิดท่ีทำหน้าที่ดังกล่าว ซึ่งการทำหน้าที่ดังกล่าวขึ้นอยู่กับปริมาณหรือความสามารถในการทำงาน (activity) ของสารนั้นๆ ยกตัวอย่างเช่น การตายของเซลล์ ขึ้นอยู่กับการทำงานของโปรตีนที่ชื่อว่า Caspase 3 ซึ่งเป็นโปรตีนที่ทำลายโครงสร้างต่างๆ ของเซลล์ ซึ่งรวมไปถึงการย่อยสลาย DNA ดังนั้นในมุมมองของระบบสวิตช์ไฟ เซลล์ต้องการให้ความสามารถในการทำงาน ของ Caspase 3 มีเพียงสองสถานะ คือ มาก (apoptosis) หรือ น้อย (เซลล์ปกติ) เท่านั้น เช่นเดียวกัน ขั้นตอนหนึ่งของกระบวนการแบ่งเซลล์ของเซลล์มนุษย์ถูกกำหนดด้วยความสามารถในการทำงาน ของโปรตีน Cdk2 โปรตีนตัวนี้สามารถที่จะกระตุ้นให้เซลล์เริ่มการสร้าง DNA ขึ้นอีกชุดได้ ดังนั้นเราจะเห็นความสามารถในการทำงาน ของ Cdk2 อยู่เพียงสองสถานะเท่านั้น คือ มาก (แบ่งเซลล์) หรือ น้อย (G0 phase)


ถึงจุดนี้ คำถามที่น่าสนใจก็คือ เซลล์ทำอย่างไร ถึงสามารถกำหนดให้ความสามารถในการทำงานหรือ activity ของโปรตีน ดังเช่น Caspase 3 หรือ Cdk2 มีเพียงสองสถานะ


พฤติกรรมแบบสวิตช์ไฟเกิดจากปฏิสัมพันธ์ระหว่างโปรตีนใน regulatory networks


เราจะมาเริ่มจากการศึกษาเชิงทฤษฎี โดยพิจารณาที่โครงสร้าง (topology) ของ regulatory network แบบง่ายๆ โดยไม่สนใจที่ตัวองค์ประกอบว่าเป็นโปรตีนชนิดใด ภาพประกอบที่ 3 แสดงถึง โครงสร้าง 2 แบบ แบบแรกมีชื่อว่า mutual activation ส่วนแบบที่สองมีชื่อว่า mutual inhibition ทั้งสองแบบแสดงความสัมพันธ์ของโปรตีนเพียงแค่สองชนิด คือ โปรตีน A และ B ส่วน S คือ ตัวสัญญาณที่เซลล์ใช้ในการตัดสินใจ (ตัวสัญญาณมีความต่อเนื่องจากน้อยไปมาก)


ในโครงสร้างแบบแรก (ภาพประกอบ 3A) ลูกศรหมายถึง โปรตีนทั้งสอง ต่างช่วยกันเพิ่มปริมาณหรือ activity ของโปรตีนอีกชนิดหนึ่ง ในกรณีนี้เราจะสมมุติว่า โปรตีนทั้งสอง เพิ่ม activity ของโปรตีนอีกตัวหนึ่ง ดังนั้นเราสามารถพิจารณาได้ว่า หาก A มี activity น้อย B ก็จะมี activity น้อยด้วย (พิจารณาลูกศรอันบน) เมื่อ activity ของ B ต่ำ ก็ไม่สามารถกระตุ้น activity ของ A ได้เช่นกัน (พิจารณาลูกศรอันล่าง) แต่หากเราเพิ่มความแรงของสัญญาณ S ขึ้นเรื่อยๆ จนถึงจุดหนึ่ง activity ของ A จะกระตุ้น activity ของ B และ activity ของ B ก็จะช่วยให้ activity ของ A สูงขึ้นไปอีกอย่างฉับพลัน เราจึงสรุปได้ว่า โครงสร้างดังกล่าวจะแสดงพฤติกรรมแบบสวิตช์ไฟหรือพฤติกรรมแบบสองสถานะ คือ สถานะที่ activity ของทั้ง A และ B ต่ำ หรือ สถานะที่ activity ของทั้ง A และ B สูง ขึ้นอยู่กับความแรงของสัญญาณ S


ในโครงสร้างแบบที่สอง (ภาพประกอบ 3B) เส้นปลายตัดแสดงว่า โปรตีนทั้งสองชนิด ต่างพยายามลดปริมาณหรือ activity ของฝั่งตรงข้าม หากโปรตีน A มี activity มาก จะส่งผลทำให้ activity ของโปรตีน B ลดลง (พิจารณาเส้นปลายตัดอันบน) และเมื่อ activity ของโปรตีน B ลดลง ก็ยิ่งเป็นการส่งเสริมให้ activity ของโปรตีน A เพิ่มขึ้นไปอีก (พิจารณาเส้นปลายตัดอันล่าง) ดังนั้นหาก activity ของ A มาก activity ของ B จะน้อย และเมื่อใช้เหตุผลเดียวกันในทางกลับกัน หาก activity ของ B มาก activity ของ A จะต่ำ เราจึงสรุปได้ว่าโครงสร้างแบบที่สอง แสดงพฤติกรรมแบบสวิตช์ไฟ คือ activity ของ A สูง หรือ activity ของ B สูง และหากเราเริ่มจาก สถานะที่ activity ของ B สูง เมื่อเราเพิ่มสัญญาณ S ให้แรงขึ้นเรื่อยๆ จะมีความแรงของ S จุดหนึ่ง ที่เราจะสามารถดันสวิตช์ไปสู่สถานะที่ activity ของ A สูงแทนได้


กลับมาที่ตัวอย่างการตายของเซลล์และการแบ่งเซลล์ ภาพประกอบที่ 4 แสดงความสัมพันธ์ของโปรตีนที่ควบคุมการตายของเซลล์ และการแบ่งเซลล์


ในระบบที่ควบคุมการตายของเซลล์ (ภาพประกอบ 4A) Pro-Caspase 3 และ Pro-Caspase 9 เป็นรูปของโปรตีนที่ไม่มี activity ส่วน Caspase 3 และ Caspase 9 เป็นรูปของโปรตีนที่สามารถทำงานได้ ซึ่งทั้งสองโปรตีนสามารถเปลี่ยนโปรตีนอีกชนิดจากรูปที่ไม่สามารถทำงานได้ ไปสู่รูปที่ทำงานได้ ระบบนี้จึงมีโครงสร้างแบบ mutual activation (ลองเปรียบเทียบโครงสร้างกับภาพประกอบ 3A)


ส่วนในระบบที่ควบคุมการแบ่งเซลล์ (ภาพประกอบ 4B) CKI เป็นโปรตีนที่จับกับ Cdk2 แล้วเกิดเป็นกลุ่มก้อนโปรตีน Cdk2:CKI ที่ไม่สามารถทำงานได้ Cdk2 จะสามารถทำงานได้ก็ต่อเมื่ออยู่เดี่ยวๆ และ Cdk2 สามารถเร่งการสลายตัวของโปรตีน CKI ระบบการแบ่งเซลล์จึงมีโครงสร้างแบบ mutual inhibition (ลองเปรียบเทียบโครงสร้างกับภาพประกอบ 3B)


พิจารณาจากโครงสร้างข้างต้น จะพบว่า เมื่อเราค่อยๆ เพิ่มปริมาณความเสียหายของสารพันธุกรรม (DNA damage) หรือ ค่อยๆ เพิ่มปริมาณของสารกระตุ้นการแบ่งเซลล์ (mitogen) จะมีปริมาณความเสียหายของสารพันธุกรรม และปริมาณของสารกระตุ้นที่ค่าหนึ่ง ที่ทำให้ความสามารถในการทำงานของ Caspase 3 และ Cdk2 เพิ่มขึ้นอย่างฉับพลัน และเปลี่ยนสถานะของเซลล์จากสถานะหนึ่งไปยังอีกสถานะหนึ่ง


การศึกษาพฤติกรรมของเซลล์ด้วยแบบจำลองทางคณิตศาสตร์


จากที่กล่าวมาตั้งแต่ต้น เราใช้เพียงความเข้าใจภายในหัวของเรา เพื่อเชื่อมโยงโครงสร้างของ regulatory networks แบบง่ายๆ เข้ากับพฤติกรรมในระดับเซลล์ เราทราบว่าโครงสร้างทั้งสองแบบในภาพประกอบที่ 3 มีความเป็นไปได้ที่จะทำให้ระบบเกิดการตอบสนองแบบสวิตช์ แต่เราอาจสงสัยต่อไปว่า ทุกระบบที่มีโครงสร้างข้างต้น จะมีพฤติกรรมแบบสวิตช์เสมอไปหรือไม่ หากไม่ สภาวะหรือเงื่อนไขแบบใดที่จะทำให้โครงสร้างดังกล่าวเป็นสวิตช์ได้ และสภาวะแบบใดที่จะทำให้เกิดสวิตช์ที่ดี หรือสวิตช์ที่ไม่ดี ความแรงในการกระตุ้นหรือยับยั้ง activity ของ B โดย A และ A โดย B ต้องเท่ากันหรือไม่ หรือมีความสัมพันธ์กันอย่างไร โครงสร้างทั้งสองแบบซึ่งต่างแสดงพฤติกรรมแบบสวิตช์มีความเกี่ยวข้องกันหรือไม่ หรือมีโครงสร้างแบบอื่นอีกหรือไม่ ที่มีพฤติกรรมแบบสวิตช์ คำถามเหล่านี้ล้วนเป็นคำถามที่ซับซ้อนเกินกว่าที่เราจะทำความเข้าใจภายในหัวได้ เราจึงจำเป็นต้องอาศัยเครื่องมืออย่างแบบจำลองทางคณิตศาสตร์มาช่วยในการศึกษาพฤติกรรมของโครงสร้างเหล่านี้ และเพื่อช่วยตอบคำถามข้างต้น เนื่องจากจุดประสงค์ของบทความนี้ เป็นการแนะนำผู้อ่านให้รู้จักกับการศึกษา regulatory networks ในเชิงทฤษฎีเบื้องต้น รายละเอียดทางคณิตศาสตร์จึงขอละไว้


Regulatory networks กับ systems biology


การศึกษาสวิตช์ในระบบ regulatory networks เป็นตัวอย่างหนึ่งของการศึกษาชีววิทยาในเชิงระบบ (Systems biology) เราจะเห็นว่าพฤติกรรมในระดับเซลล์ (เช่น การตายหรือการแบ่งเซลล์) ไม่สามารถอธิบายได้โดยการเอาคุณสมบัติของแต่ละองค์ประกอบของระบบ (เช่น โปรตีน Cdk2 CKI และ Caspase) มาบวกกันโดยตรง เราจำเป็นต้องศึกษาปฏิสัมพันธ์ระหว่างองค์ประกอบในระบบ ซึ่งในที่นี้ ก่อให้เกิดคุณสมบัติใหม่ๆ ในระดับระบบ หรือที่เรียกว่า emergent property อันได้แก่ พฤติกรรมแบบสวิตช์ เราจะสังเกตได้จากภาพประกอบที่ 3 ว่า ปัจจัยสำคัญที่ทำให้เกิดพฤติกรรมแบบสวิตช์ไฟ มาจากปฏิสัมพันธ์ระหว่างองค์ประกอบ มิได้มาจากตัวชนิดของโปรตีน โปรตีนชนิดใดๆ ก็ตามที่มีรูปแบบปฏิสัมพันธ์แบบภาพประกอบที่ 3 ล้วนแต่มีความเป็นไปได้ที่จะมีพฤติกรรมแบบสวิตช์ ตัวปฏิสัมพันธ์นี้เอง ที่ทำให้การบวกกันของคุณสมบัติขององค์ประกอบ ไม่เท่ากับคุณสมบัติของระบบ เพราะการบวกกันของคุณสมบัติขององค์ประกอบมักอยู่ในรูปแบบที่ไม่เป็นเส้นตรง (nonlinearity) การศึกษาพฤติกรรมในระดับระบบจึงยากที่จะสรุปหรือทำความเข้าใจภายในหัว การใช้แบบจำลองในการศึกษาจึงมีประโยชน์ และสามารถช่วยให้นักวิจัยทดสอบสมมุติฐานที่ตั้งขึ้นได้ นอกจากตัวแบบจำลองแล้ว ศาสตร์อีกศาสตร์ที่มีความสำคัญในการทดสอบความเข้าใจในตัวระบบที่เราศึกษา คือ Synthetic biology อย่างที่ได้กล่าวไปว่า การเกิดพฤติกรรมแบบสวิตช์ขึ้นอยู่กับตัวโครงสร้างหรือปฏิสัมพันธ์ขององค์ประกอบของระบบ ดังนั้น หากเราตัดต่อ ดัดแปลงระบบ ให้องค์ประกอบของระบบมีโครงสร้างเหมือนภาพประกอบที่ 3 เราจะสามารถสร้างสวิตช์ขึ้นมาได้หรือไม่


การสร้างสวิตช์ด้วย synthetic biology


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


ประโยชน์ของการศึกษาสวิตช์


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


อ้างอิง


Gardner TS, Cantor CR, Collins JJ. (2000) Construction of a genetic toggle switch in Escherichia coli. Nature 403: 339-342.

Python Programing

ทำงานกับไฟล์ด้วย Python

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


หลังจากที่เราผ่านการเขียนโปรแกรมกันมาเป็นปีแล้ว ผมเชื่อว่าผู้อ่านทุกท่านมีพื้นฐานการเขียนโปรแกรมที่แน่นแล้ว ถ้าเราย้อนกลับไปดูจะเห็นว่า โปรแกรมทั่วไปมีลักษณะการทำงานหลักอยู่ไม่กี่อย่าง ได้แก่ ทำตามลำดับ ทำตามเงื่อนไข และวนลูป เท่านั้นเองครับ โปรแกรมจะทำงานตามที่เราต้องการได้หรือไม่ ก็ขึ้นอยู่กับเราที่จะจัดการกับลำดับเหล่านั้นให้ถูก และเพื่อให้การทำงานของเราง่ายขึ้น เราสามารถแบ่งภาระงานของโปรแกรมออกมาเป็นส่วนย่อยๆ ที่เราได้ลองเล่นกันมาแล้วในเรื่องของ subroutine คงพอจะจำได้นะครับ


สิ่งสำคัญอีกประการหนึ่งที่จะช่วยให้เราเขียน Python ได้อย่างมีประสิทธิภาพมากขึ้น ก็คือการที่เรารู้จัก library หรือ tools ที่ Python ให้เราเรียกใช้ได้ คงพอจะจำเรื่อง reverse complement สาย DNA ที่เราเพิ่งเขียนกันมาได้ไหมครับ ตอนแรกสุด เราเขียนทุกอย่างเองหมดเลย ซึ่งก็ทำงานได้ แต่ว่าต้องเขียนกันยืดยาว แต่ถ้าหากเรารู้ว่า Python มีอะไรไว้ให้เราแล้ว เราก็สามารถเขียนได้สั้นลงมาก ดังเช่นที่เราทำกันในตอนสุดท้าย


ยังมี feature หลักอีกอย่างหนึ่งของ Python ที่ผมยังขออนุญาตค้างไว้ก่อน คือเรื่อง Object-oriented Programming (OOP) ในช่วงนี้ ผมคิดว่า ผมจะเริ่มพูดถึง feature หรือ module ต่างๆ ของ Python ที่จะทำให้เราทำงานต่างๆ ได้สะดวกขึ้นครับ


ครั้งนี้ เราจะพูดถึงการทำงานกับไฟล์ด้วย Python กัน ที่ผ่านมา เรารับค่า input ต่างๆ จากผู้ใช้ทางคีย์บอร์ด แต่การทำงาน bioinformatics ส่วนใหญ่แล้ว เรามักจะทำงานกับไฟล์ทั้งเล็กและใหญ่ และอาจจะมีจำนวนมาก ความรู้ในการทำงานกับไฟล์ด้วย Python จึงเป็นความรู้ส่วนต้นๆ ที่เราควรจะได้เรียนรู้กันครับ


Open file


เราสามารถเปิดไฟล์ขึ้นมาเพื่อเขียนหรืออ่านได้ด้วยคำสั่ง open โดยมีลักษณะการใช้งานคือ

open(filename, mode)

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


mode ที่เป็นไปได้


mode คำอธิบาย

r อ่านไฟล์

w เขียนไฟล์ (ถ้าไฟล์เดิมมีอยู่ ให้ลบข้อมูลเดิมแล้วเขียนใหม่)

a เขียนไฟล์แบบต่อท้าย (ถ้ามีไฟล์เดิมอยู่ก่อนแล้วจะไม่ลบข้อมูลเดิม แต่เขียนต่อท้ายไฟล์เดิม)

r+ อ่านและเขียนไฟล์


โดยทั่วไป mode เหล่านี้คือ mode ที่เราจะใช้งานกัน เพราะไฟล์ส่วนใหญ่ที่เราใช้งานกันทาง bioinformatics มักจะเป็น text file หรือไฟล์ตัวหนังสือ และในระบบ linux การทำงานกับไฟล์ที่ไม่ใช่ตัวหนังสือ ก็สามารถใช้ mode เหล่านี้ได้เช่นกัน


แต่หากเราทำงานบนระบบ Windows จะมี mode เพิ่มขึ้นมาอีกอย่างหนึ่งคือ binary สำหรับเปิดไฟล์ที่ไม่ใช่ไฟล์ตัวหนังสือ Python ต้องการ mode นี้เพิ่มพิเศษ เพราะว่าต้องมีการจัดการกับการขึ้นบรรทัดใหม่ของตัวอักษรบนระบบ Windows เพราะฉะนั้น ถ้าหากเราต้องการอ่านหรือเขียนไฟล์ที่ไม่ใช่ text file เช่นไฟล์รูปภาฟ ให้เราใช้ mode เหล่านี้


mode คำอธิบาย

rb อ่านไฟล์ binary

wb เขียนไฟล์ binary (ถ้าไฟล์เดิมมีอยู่ ให้ลบข้อมูลเดิม แล้วเขียนใหม่)

ab เขียนไฟล์ binary แบบต่อท้าย

r+b อ่านและเขียนไฟล์ binary


อันที่จริง เราสามารถใช้ mode rb ในระบบ linux ได้ โดยที่ python บน linux ก็จะไม่สนใจตัว b และทำงานเหมือน mode r ปกติ


ผมจึงมีข้อแนะนำว่า ถ้าหากต้องการให้ code python ของเราทำงานได้ทั้งบน windows และ linux เมื่อเราต้องการทำงานกับ binary file ให้เราใช้ mode ที่มีตัว b อยู่ได้เลย โปรแกรมนั้นจะทำงานได้บนทุก platform


ตัวอย่างคำสั่งในการเปิดไฟล์

>>> f = open('/tmp/testfile.txt')

เปิดไฟล์ /tmp/testfile.txt เพื่ออ่าน

>>> f = open('/tmp/testfile.txt','w')

เปิดไฟล์ /tmp/testfile.txt เพื่อเขียน ถ้ามีไฟล์นี้อยู่ ให้ลบข้อมูลเก่าทิ้ง ถ้าไม่มี ให้สร้างใหม่

>>> f = open('/tmp/testfile.txt','a')

เปิดไฟล์ /tmp/testfile.txt เพื่อเขียน ถ้ามีไฟล์นี้อยู่ ให้เขียนต่อไปเลย ถ้าไม่มี ให้สร้างใหม่


Close file


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


ถ้าหากเราต้องการปิดไฟล์ เราสามารถใช้ method close ของ file object ที่เราได้มาจากการ open ได้ ดังตัวอย่าง


>>> f = open('/tmp/testfile.txt','w')

>>> f.close()

คุยกันเล็กน้อยเรื่อง object


รายละเอียดเรื่อง object-oriented programming จะมีเยอะครับ ผมขอยกยอดไปดังที่ได้กล่าวมาแล้ว แต่เมื่อเราใช้คำสั่ง open ผมหลีกเลี่ยงไม่พูดถึง object เลย ก็คงไม่ได้ เพราะคำสั่ง open จะคืนตัวแทนไฟล์ หรือ file object กลับมาให้เรา file object ก็จะเป็นตัวแทนของไฟล์นั้น ที่เราสามารถสั่งให้ทำอะไรก็ได้ตามที่เราต้องการ คำสั่งที่เราสามารถสั่งให้ object ทำงานนั้น เรียกว่า method

โดยปกติ ถ้าเราต้องการปิดไฟล์ ถ้าหากเราเรียกใช้งานแบบ function จะได้เป็น

>>> close(f)


ถ้าหากเราเขียนแบบนี้ แสดงว่า close เป็นฟังก์ชันทั่วไป ที่ต้องการพารามิเตอร์คือ file object เพื่อใช้ปิดไฟล์ แต่ python ไม่มีฟังก์ชันนี้ครับ มีแต่ฟังก์ชัน open


หลังจากที่เราใช้ฟังก์ชัน open แล้ว เราจะได้ file object ออกมา และเป็นหน้าที่ของเราที่จะใช้ method ของ file object เพื่อให้ทำงานตามที่เราต้องการ


เพราะฉะนั้น ถ้าหากเราต้องการปิดไฟล์ เราจะใช้เป็น


>>> f.close()


ขอให้สังเกตความแตกต่างในการเรียกครับ เราจะเรียก method ของ object ตัวไหน ก็เริ่มต้นด้วย ตัวแปร object ตามด้วยจุดและชื่อของ method ครับ และในกรณีนี้ เราไม่ได้ส่งค่าพารามิเตอร์อะไรไปให้ method close เลย เพราะว่าเราเจาะจงเรียก method close ของ file object 'f' อยู่แล้ว ซึ่ง Python แปลความหมายได้ชัดเจนว่า เราต้องการปิดไฟล์ f


ดูตัวอย่างกันอีกสักนิดครับ เพื่อให้คุ้นเคย

>>> f1 = open('/tmp/testfile.txt','w')

>>> f2 = open('/tmp/testfile2.txt','w')

>>> f1.close()

>>> f2.close()

ตัวอย่างนี้ เราเปิดไฟล์ 2 ไฟล์ ได้ file object มา 2 อัน อยู่ใน f1 และ f2 จากนั้น เราสามารถสั่งปิดไฟล์แต่ละไฟล์ได้ตามต้องการ ดังตัวอย่าง


เขียนไฟล์


เมื่อเราเข้าใจเรื่อง method แล้ว file object มี method สำหรับการเขียนไฟล์ ชื่อ write เพราะฉะนั้น เราสามารถเขียนไฟล์ได้ ดังตัวอย่าง


>>> f = open('/tmp/testfile.txt','w')

>>> f.write('hello world\n')

>>> f.close()

จะเห็นว่าเราเรียก method write ของ f และส่งข้อความ 'hello world\n' เป็นพารามิเตอร์ไป เราไม่ต้องบอกว่า เราต้องการเขียนไปที่ไฟล์ไหน ในพารามิเตอร์ เพราะว่าเราเรียก method ของ file object อยู่แล้ว ข้อความดังกล่าวจะถูกเขียนไปที่ไฟล์ /tmp/testfile.txt นั่นเอง


Method write ไม่ได้เติมตัวขึ้นบรรทัดใหม่เมื่อสิ้นสุดข้อความให้เราโดยอัตโนมัติ เพราะบางครั้งเราอาจจะไม่ต้องการก็ได้ เราจึงต้องใส่ตัวขึ้นบรรทัดใหม่เอง โดยใช้ escape character เพราะเราไม่สามารถพิมพ์ตัวขึ้นบรรทัดใหม่ลงไปได้โดยตรง (\n => new line character)


มี method สำหรับการเขียนไฟล์อีกหนึ่ง method คือ writelines ใช้สำหรับเขียนข้อมูลจาก sequence เช่น list ลงไปในไฟล์ทีเดียว เช่น

>>> data = ['1. once upon a time\n', '2. there was a lion living in a forest\n', '3. the end.\n']

>>> f = open('/tmp/testfile.txt','w')

>>> f.writelines(data)

>>> f.close()

ไฟล์ที่เขียนขึ้น สามารถเปิดอ่านได้ด้วย โปรแกรม text editor อะไรก็ได้ครับ ครั้งนี้ผมขออนุญาตหยุดไว้ที่การเขียนไฟล์นะครับ เพราะการอ่านไฟล์จะมีรายละเอียดพอสมควร


หากเขียนในครั้งนี้ จะทำให้บทความยาวเกินไป แล้วพบกันเรื่องการเขียนไฟล์ฉบับหน้าครับ

Linux Command Line

Linux command line ไม่ยากอย่างที่คิด

ณฐพล พรพุทธพงศ์


การทำงานวิจัยทางด้าน bioinformatics และต้องจัดการข้อมูลเยอะๆ โดยใช้ระบบปฏิบัติการ linux หลายคนคงเลี่ยงไม่พ้นที่จะต้องทำงานกับระบบคำสั่งแบบบรรทัดหรือที่ภาษาอังกฤษเขาเรียกกันว่า command line (CLI-Command Line Interface) ที่ฝังอยู่กับระบบปฏิบัติการนั่นเอง หลายคนพอได้ยินก็คงร้องยี้... แต่ถ้าเราสามารถใช้ command line ได้อย่างคล่องแคล่วแล้วจะเห็นว่ามันใช้ทำงานหลายอย่างได้อย่างง่ายดาย ยืดหยุ่น และ รวดเร็วทีเดียว


Command line ใน linux นั้น ถ้าจะพูดอย่างง่ายก็คือโปรแกรมหนึ่งที่ทำหน้าที่ติดต่อกับผู้ใช้งานอย่างเราๆ นั่นเอง ซึ่งมีชื่อว่าเชลล์ (Shell) ใน linux เองมีเชลล์อยู่หลายชนิด ถึงแม้ว่าเชลล์แต่ละชนิดจะมีการทำงานแตกต่างกันไปบ้าง แต่ก็เพียงแค่เล็กน้อยเท่านั้น เมื่อเราสั่งงาน linux โดยพิมพ์คำสั่งลงไป ตัวเชลล์จะแปลคำสั่งแล้วไปเรียกโปรแกรมนั้นขึ้นมาทำงาน แล้วจึงส่งผลลัพธ์กลับมาให้ผู้ใช้ โดยทั่วไปแล้วในเชลล์จะมีโปรแกรมฝังมาด้วยมากพอสมควร ซี่งเป็นโปรแกรมอรรถประโยชน์พื้นฐานที่ใช้ในการจัดการไฟล์ และระบบต่างๆ ภายในเครื่องนั่นเอง


ในคอลัมน์นี้ ผมจะพูดถึงการใช้งานคำสั่งเหล่านั้นในการจัดการข้อมูล และจัดการไฟล์ในเครื่องของเราครับ โดยผมจะพยายามเริ่มต้นตั้งแต่ระดับของผู้ใช้ที่ไม่เคยใช้งาน linux command line มาก่อนเลย ไปจนกระทั้งถึงขั้นการนำไปใช้ในงานวิจัยทาง bioinformatics ให้มากที่สุดเท่าที่จะทำได้ครับ สำหรับในครั้งแรกนี้คงจะแนะนำพื้นฐานเกี่ยวกับระบบไฟล์ของระบบ linux ก่อนครับ

Linux เป็นระบบปฏิบัติการที่ถูกพัฒนาขึ้นจากระบบยูนิกซ์ (UNIX) โดยนาย Linus Torvalds ซึ่งขณะนั้นยังเป็นนักศึกษาของมหาวิทยาลัยเฮลซิงกิ (University of Helsinki) ในประเทศฟินแลนด์ โดยออกเวอร์ชั่น 1.0 ในปี ค.ศ. 1994 ซึ่งถูกนำมาใช้พัฒนาต่อยอดมาจนถึงปัจจุบัน ส่วนรายละเอียดนั้นคงมีโอกาสได้นำมาเล่าให้ฟังต่อไปครับ


ระบบ linux นั้นมีพื้นฐานการจัดการระบบคล้ายกับระบบ UNIX มาก โดยผู้ใช้งานแต่ละคนจะต้องเข้าไปใช้งานผ่านชื่อ user และ password ของตนเอง ดั้งนั้นระบบจัดการไฟล์จึงอ้างอิงกับผู้ใช้แต่ละคนด้วย โดยทั่วไปแล้วจะไม่มีสิทธิ์ที่จะเข้าไปดูไฟล์ของคนอื่นได้เลย


โครงสร้างของไฟล์ในระบบนั้นจะเริ่มต้นที่ root ซึ่งมีสัญลักษณ์เป็นตัว slash (/) ซึ่งเป็นระบบจำลอง ไม่ได้อ้างอิงกับฮาร์ดดิสเหมือนกับไมโครซอฟท์วินโดว์ ภายได้ root ก็จะมี directory ต่างๆ มากมาย ซึ่งเราจะเข้าไปสำรวจกันต่อไป


โดยทั่วไปเมื่อเราใช้งานลินุกซ์เราจะเข้าไปในส่วนที่เป็นกราฟฟิค (GUI – Graphic User Interface)ซึ่งถูกสร้างขึ้นครอบระบบลินุกซ์อีกที่ ดั้งนั้นถ้าเราจะใช้งานระบบคำสั่งแบบบรรทัดนั้นเราต้องใช้โปรแกรมที่ชื่อว่า Terminal ซึ่งใช้สร้างหน้าจอจำลองภายใต้สภาวะกราฟฟิคขึ้นมาให้เราป้อนคำสั่งแบบบรรทัด หรือ ถ้าใครอยากลองใช้หน้าจอจริงๆก็ลองกด Ctrl+Alt+F1 – 7 ดู ซึ่งหน้าจอเหล่านี้เป็น terminal จริงๆของระบบ โดยมีชื่อเรียงกันตั้งแต่ tty1 – 7 (tty – terminal type) โดยที่ระบบกราฟฟิคจะอยู่ที่ Ctrl+Alt+F7


เราลองเปิด terminal กันเลยดีกว่า โดยเริ่มที่คลิกตรงเมนู ซึ่งส่วนใหญ่จะอยู่ตรงมุมซ้ายบนนะครับ (ถ้าเราใช้ระบบจัดการแบบกราฟฟิคที่ชื่อว่า Gnome-โนม เรื่องนี้คงต้องนำเสนอกันคราวหลัง) แล้วหาโปรแกรม ที่ชื่อว่า Terminal ตามรูปที่ 3 เมื่อกดแล้วจะมีหน้าต่างขึ้นมาตามรูปที่ 4 นะครับ บางคนอาจจะได้จอดำๆขึ้นมาแทน ไม่ต้องตกใจครับ การให้สีพื้นจะขึ้นอยู่กับค่าที่ตั้งไว้ครับ อาจจะต่างกันในลินุกซ์แต่ละยี่ห้อครับ


เมื่อมองเข้าไปในหน้าต่างดูจะเห็น cursor กระพริบอยู่หนังตัวหนังสือแถวสั้นๆหนึ่งแถวซึ่งเราเรียกว่าเครื่องหมาย prompt โดยทั่วไปถ้าเป็น Bash shell (คำแปลกๆอีกแล้ว คงต้องขอรวบยอดเป็นคราวถัดๆไปครับ แต่คำสั่งที่เราจะนำเสนอทั้งหมดจะอ้างอิงตาม shell ชนิดนี้) จะเป็นสัญลักษณ์ $ ซึ่งหมายถึง ให้เราสามารถป้อนคำสั่งได้ส่วนข้างหน้าเครื่องหมายจะแล้วแต่การตั้งค่าไว้ส่วนในตัวอย่างจะหมายถึง ผู้ใช้ชื่อ natapol เข้าใช้ที่เครื่องชื่อ(@) chibi-banana ตำแหน่งที่อยู่ปัจจุบันคือ ~ ซึ่งเป็นสัญลักษณ์หมายถึงhome folder ของผู้ใช้นั่นเอง


เอาละครับในที่สุดเราก็ได้เปิดประตูสู่โลกแห่ง CLI กันแล้ว ในฉบับหน้าเรามาสำรวจโลกแห่ง CLI กันนะครับ

R programing

ติดตั้ง R ง่ายๆ แค่ปลายนิ้วคลิก

อภิชาต ศุรธณี


--- coming soon ---