Hatena::Groupkdri

KazusaAPI開発日誌 このページをアンテナに追加 RSSフィード

2008-10-08

遺伝子の絵を描く

|  遺伝子の絵を描く - KazusaAPI開発日誌 を含むブックマーク はてなブックマーク -  遺伝子の絵を描く - KazusaAPI開発日誌  遺伝子の絵を描く - KazusaAPI開発日誌 のブックマークコメント

DAS サーバから Feature をとりだす(取り出すだけ) - KazusaAPI開発日誌 - KDRIグループ の続きです。取得したGFFXMLで遺伝子の絵を描いてみます。

f:id:nakao_mitsuteru:20081029140954j:image

データ

シアノバクテリア Synechocystis sp. PCC 6803 ゲノムの一部の遺伝子を表示します。遺伝子の向きごとに色をかえました。


操作方法

キーボード入力で操作できます。

これらの設定は keyPressed や key 変数を利用して簡単にかけます。

void update_by_key() {
  if (keyPressed) {
    if (key == '-') {
      maxw = maxw * 1.1;
    } else if (key == '=') {
      maxw = maxw_default;
    } else if (key == '+') {
      maxw = maxw / 1.1;      
    }
  }
}

int update_xp() {
  int dx;
  int x = xp;
  if (keyPressed) {
    if (keyCode == LEFT) {
      xp += 10;
    } else if (keyCode == RIGHT) {
      xp -= 10;
    } 
  }
  return(x);
}

ソースコード

import processing.xml.*;

/**
 * DAS Viewer
 **/
 
String data;
String url;
XMLElement gff;
float maxw_default = 50000.0;
float maxw = 100000.0;
int width = 1024;  
int height = 600;
int xp = 0;
int pxp = 0;
int offset = 50;

void setup() {
  size(width, height);
  background(50);
  fill(200); 
  stroke(255, 255, 255, 128);
  url = "http://g.kazusa.or.jp/cgi-bin/das/Synechocystis/features?segment=Chr:1,100000&type=CDS";
  gff = new XMLElement(this, url);
}

void draw() {
  int offsetc = 0;
  background(50);
  fill(200); 
  stroke(255);
  
  update_by_key();
  offsetc = update(mouseX);

  update_xp();
  translate(xp, 0);
  
  XMLElement[] features = gff.getChildren("GFF/SEGMENT/FEATURE");
  for (int i = 0; i < features.length; i++) {
    int start = int(features[i].getChild("START").getContent());
    int endp = int(features[i].getChild("END").getContent());  
    String o = features[i].getChild("ORIENTATION").getContent();
    int bgc;
    if (o.equals("+")) {
      bgc = #FF1111;
    } else {
      bgc = #11FF11;
    }    
    if (features[i].getChild("TYPE").getAttribute("CATEGORY") == "chromosome") {
      fill(20); 
      rect(start/maxw * width + offset, height/3-30, endp/maxw * width - start/maxw * width + offset, 100);
    } else if (features[i].getChild("TYPE").getAttribute("CATEGORY") == "Locus") {
      fill(bgc); 
      rect(start/maxw * width + offset, height/3, endp/maxw * width - start/maxw * width + offset, 20);
    } else {
      fill(bgc, 90);
      float spoint =  start/maxw * width + offset;
      float epoint =  endp/maxw * width + offset - spoint; 
      rect(spoint, height/3, epoint, 20);
    }
  }    
}

int update(int x) {
  return -x * 80;
}

void updateY(int y) {
  maxw = maxw_default * y / 100;
}

void update_by_key() {
  if (keyPressed) {
    if (key == '-') {
      maxw = maxw * 1.1;
    } else if (key == '=') {
      maxw = maxw_default;
    } else if (key == '+') {
      maxw = maxw / 1.1;      
    }
  }
}

int update_xp() {
  int dx;
  int x = xp;
  if (keyPressed) {
    if (keyCode == LEFT) {
      xp += 10;
    } else if (keyCode == RIGHT) {
      xp -= 10;
    } 
  }
  return(x);
}
トラックバック - http://kdri.g.hatena.ne.jp/nakao_mitsuteru/20081008