static void gthinitfragments(GtFragment *fragments, GtUword *num_of_fragments, GthMatch *storematchtab, GtUword numofmatches, GtUword rare, double fragweightfactor) { GthMatch *mptr; GtFragment *fragmentptr; GtWord tmp, largestdim1 = 0, largestdim2 = 0; GtDiscDistri *startpointdistri = NULL; /* init number of fragments */ *num_of_fragments = 0; if (rare) startpointdistri = gt_disc_distri_new(); for (mptr = storematchtab; mptr < storematchtab + numofmatches; mptr++) { /* first dimension */ tmp = mptr->Storepositionreference + mptr->Storelengthreference - 1; if (largestdim1 < tmp) largestdim1 = tmp; /* second dimension */ tmp = mptr->Storepositiongenomic + mptr->Storelengthgenomic - 1; if (largestdim2 < tmp) largestdim2 = tmp; } for (mptr = storematchtab, fragmentptr = fragments; mptr < storematchtab + numofmatches; mptr++) { if (rare) gt_disc_distri_add(startpointdistri, mptr->Storepositionreference); if ((!rare || gt_disc_distri_get(startpointdistri, mptr->Storepositionreference) <= rare) && (mptr == storematchtab || /* is the first match */ !gth_matches_are_equal(mptr, mptr-1))) { /* or is different from last one */ fragmentptr->weight = (GtWord) (fragweightfactor * (double) abs(mptr->Storescore)); fragmentptr->startpos1 = mptr->Storepositionreference; fragmentptr->endpos1 = mptr->Storepositionreference + mptr->Storelengthreference - 1; fragmentptr->startpos2 = mptr->Storepositiongenomic; fragmentptr->endpos2 = mptr->Storepositiongenomic + mptr->Storelengthgenomic - 1; fragmentptr++; (*num_of_fragments)++; } } gt_disc_distri_delete(startpointdistri); gt_assert(*num_of_fragments <= numofmatches); }
int gt_disc_distri_unit_test(GtError *err) { GtDiscDistri *d; int had_err = 0; gt_error_check(err); d = gt_disc_distri_new(); ensure(had_err, gt_disc_distri_get(d, 0) == 0); ensure(had_err, gt_disc_distri_get(d, 100) == 0); if (!had_err) { gt_disc_distri_add(d, 0); gt_disc_distri_add_multi(d, 100, 256); } ensure(had_err, gt_disc_distri_get(d, 0) == 1); ensure(had_err, gt_disc_distri_get(d, 100) == 256); gt_disc_distri_delete(d); return had_err; }