#ifndef SAM_VIEW_H
#define SAM_VIEW_H


static int g_min_mapQ = 0, g_flag_on = 0, g_flag_off = 0;
static char *g_library, *g_rg;
static int g_sol2sanger_tbl[128];

static void sol2sanger ( bam1_t *b )
{
  int l;
  uint8_t *qual = bam1_qual ( b );

  if ( g_sol2sanger_tbl[30] == 0 )
    {
      for ( l = 0; l != 128; ++l )
        {
          g_sol2sanger_tbl[l] = ( int ) ( 10.0 * log ( 1.0 + pow ( 10.0, ( l - 64 + 33 ) / 10.0 ) ) / log ( 10.0 ) + .499 );

          if ( g_sol2sanger_tbl[l] >= 93 )
            {
              g_sol2sanger_tbl[l] = 93;
            }
        }
    }

  for ( l = 0; l < b->core.l_qseq; ++l )
    {
      int q = qual[l];

      if ( q > 127 )
        {
          q = 127;
        }

      qual[l] = g_sol2sanger_tbl[q];
    }
}

static inline int __g_skip_aln ( const bam_header_t *h, const bam1_t *b )
{
  if ( b->core.qual < g_min_mapQ || ( ( b->core.flag & g_flag_on ) != g_flag_on ) || ( b->core.flag & g_flag_off ) )
    {
      return 1;
    }

  if ( g_rg )
    {
      uint8_t *s = bam_aux_get ( b, "RG" );

      if ( s && strcmp ( g_rg, ( char * ) ( s + 1 ) ) == 0 )
        {
          return 0;
        }
    }

  if ( g_library )
    {
      const char *p = bam_get_library ( ( bam_header_t * ) h, b );
      return ( p && strcmp ( p, g_library ) == 0 ) ? 0 : 1;
    }

  return 0;
}


#endif
