static void sequenceobject_init(Sequenceobject *seq,
                                GtExtendCharAccess extend_char_access_mode,
                                const GtEncseq *encseq,
                                GtReadmode readmode,
                                GtUword startpos,
                                GtUword len,
                                GtEncseqReader *encseq_r,
                                GtAllocatedMemory *sequence_cache,
                                GtUword totallength
                                )
{
  gt_assert(seq != NULL);
  seq->encseq = NULL;
  seq->encseqreader = NULL;
  seq->twobitencoding = NULL;
  seq->cache_ptr = NULL;
  seq->sequence_cache = NULL;
  if (extend_char_access_mode == GT_EXTEND_CHAR_ACCESS_ANY &&
      gt_encseq_has_twobitencoding(encseq) && gt_encseq_wildcards(encseq) == 0)
  {
    seq->twobitencoding = gt_encseq_twobitencoding_export(encseq);
  }
  if (seq->twobitencoding == NULL &&
      (extend_char_access_mode == GT_EXTEND_CHAR_ACCESS_ANY ||
       extend_char_access_mode == GT_EXTEND_CHAR_ACCESS_ENCSEQ_READER))
  {
    gt_encseq_reader_reinit_with_readmode(encseq_r, encseq, readmode, startpos);
    seq->encseqreader = encseq_r;
    gt_assert(seq->encseqreader != NULL);
    seq->sequence_cache = sequence_cache;
    gt_assert(sequence_cache != NULL);
    seq->cache_ptr = sequence_cache->space;
    seq->min_access_pos = GT_UWORD_MAX;
    seq->cache_num_positions = 0;
    seq->cache_offset = 0;
  }
  if (seq->twobitencoding == NULL && seq->encseqreader == NULL &&
      (extend_char_access_mode == GT_EXTEND_CHAR_ACCESS_ANY ||
       extend_char_access_mode == GT_EXTEND_CHAR_ACCESS_ENCSEQ))
  {
    seq->encseq = encseq;
  }
  seq->substringlength = len;
  if (readmode == GT_READMODE_FORWARD)
  {
    seq->startpos = startpos;
    seq->forward = true;
  } else
  {
    gt_assert(readmode == GT_READMODE_REVERSE);
    gt_assert(gt_encseq_total_length(encseq) == totallength);
    gt_assert(startpos + 1 <= totallength);
    seq->startpos = totallength - 1 - startpos;
    seq->forward = false;
  }
  gt_assert(seq->twobitencoding != NULL || seq->encseqreader != NULL ||
            seq->encseq != NULL);
}
Ejemplo n.º 2
0
static void gt_readjoiner_assembly_pump_encseq_through_cache(
    const GtEncseq *encseq)
{
  const GtTwobitencoding *twobitencoding = gt_encseq_twobitencoding_export(
      encseq);
  uint64_t sum = 0; /* compute the sum, so that the compiler does no remove the
                       code accessing twobitencoding during optimization */
  GtUword idx, totallength = gt_encseq_total_length(encseq),
                numofunits = ! gt_encseq_is_mirrored(encseq)
                  ? gt_unitsoftwobitencoding(totallength)
                  : gt_unitsoftwobitencoding((totallength - 1)/2);
  for (idx = 0; idx < numofunits; idx++)
    sum += twobitencoding[idx];
  gt_assert(sum > 0);
#ifndef S_SPLINT_S
  gt_log_log("encseq codes-sum: %"PRIu64, sum);
#endif
}