nurs::parse_tuple

昨日のParseFloatVec は、何も浮動小数点に限った話ではないので、parse_tupleに改名。float_typeはatom_typeに改名。さらに、remove_modifierを使用(091012)。

namespace nurs{
  template< class Func > 
  struct parse_tuple_t
  {
    typedef 
      typename nurs::remove_modifier
        < typename Func::argument_type >::base_type Vtype;
    parse_tuple_t( Func func, const int n ): _func(func), _n(n)
    { _cnt=-1;}
    void operator()( const typename Vtype::atom_type& t ) const
    {
      _tmpv[++_cnt] = t;
      if( _cnt==_n-1 ){
        _func( _tmpv ); _cnt=-1;
      }
    }
    mutable int _n;
    mutable int _cnt;
    Func _func;
    mutable Vtype _tmpv;
  };
  template< class Func >
  parse_tuple_t< Func > parse_tuple( Func func, const int n )
  {
    return parse_tuple_t< Func >( func, n );
  }
};

本日は、浮動小数点でない使用事例をメモ。

  // 塩基配列を発生
  vector< double > seq(122);
  {
    struct gen{ 
      char operator()( void ){ 
        static char atcg[]="ATCG";
        return atcg[ rand()%4 ];
      }
    };
    generate( seq.begin(), seq.end(), gen() );
  }

作成された塩基配列

TGTGGCGAGACTACTACGGCGCTAGGGCGGCTTATGTAGACTTGGTTCAGCCACACAACTCTCCCTTATGACAACAGAAGCGTCCCTTTGGCACTCTCTTAACTTTTACCTAGGGCGACCTA

これをparse_tupleを使ってコドン単位で解析する。

  // 塩基配列の、連続する3つを単位としてCodonに読み込み
  struct Codon
  {
    Codon( void ){}
    char& operator[]( const int i ){ return (&_a)[i]; }
    void Hi( void ) const { cout<< _a<<_b<<_c <<" "; }
    char _a, _b, _c;
    typedef char atom_type;
  };
  void HiCodon( Codon& t ){ t.Hi(); return; }
  // 
  for_each( seq.begin(), seq.end(), 
              /*★*/parse_tuple( ptr_fun( HiCodon ), 3 ) );
  cout<<endl;

勿論、HiCodonの中では対応するアミノ酸コドン表から調べ、そのままアミノ酸配列を作成するような機能を持たせてもよいわけだ。
for_eachの行の出力は以下に。

TGT GGC GAG ACT ACT ACG GCG CTA GGG CGG CTT ATG TAG ACT TGG TTC AGC CAC ACA ACT CTC CCT TAT GAC AAC AGA AGC GTC CCT TTG GCA CTC TCT TAA CTT TTA CCT AGG GCG ACC

ちゃんとスペースで区切られて出力されてますと。
コドンの読み枠を一つずらして擬似的にフレームシフト変異を加えるコードは以下のような感じに。

  vector< char >::iterator it = seq.begin();
  ++it;
  for_each( it, seq.end(), parse_tuple( ptr_fun( HiCodon ), 3 ) );
  cout<<endl;

結果は以下に。

GTG GCG AGA CTA CTA CGG CGC TAG GGC GGC TTA TGT AGA CTT GGT TCA GCC ACA CAA CTC TCC CTT ATG ACA ACA GAA GCG TCC CTT TGG CAC TCT CTT AAC TTT TAC CTA GGG CGA CCT