/*! \brief * Initializes position calculation using the maximum possible input index. * * \param[in,out] pc Position calculation data structure. * \param[in] g Maximum index group for the calculation. * \param[in] bBase Whether \p pc will be used as a base or not. * * \p bBase affects on how the \p pc->gmax field is initialized. */ static void set_poscalc_maxindex(gmx_ana_poscalc_t *pc, gmx_ana_index_t *g, bool bBase) { e_index_t ptype; ptype = index_type_for_poscalc(pc->type); gmx_ana_index_make_block(&pc->b, pc->coll->top, g, ptype, pc->flags & POS_COMPLWHOLE); /* Set the type to POS_ATOM if the calculation in fact is such. */ if (pc->b.nr == pc->b.nra) { pc->type = POS_ATOM; pc->flags &= ~(POS_MASS | POS_COMPLMAX | POS_COMPLWHOLE); } /* Set the POS_COMPLWHOLE flag if the calculation in fact always uses * complete residues and molecules. */ if (!(pc->flags & POS_COMPLWHOLE) && (!(pc->flags & POS_DYNAMIC) || (pc->flags & POS_COMPLMAX)) && (pc->type == POS_RES || pc->type == POS_MOL) && gmx_ana_index_has_complete_elems(g, ptype, pc->coll->top)) { pc->flags &= ~POS_COMPLMAX; pc->flags |= POS_COMPLWHOLE; } /* Setup the gmax field */ if ((pc->flags & POS_COMPLWHOLE) && !bBase && pc->b.nra > g->isize) { gmx_ana_index_copy(&pc->gmax, g, TRUE); sfree(pc->gmax.name); pc->gmax.name = NULL; } else { gmx_ana_index_set(&pc->gmax, pc->b.nra, pc->b.a, NULL, 0); } }
/*! * \param[in] pc Position calculation data structure. * \param[out] p Output positions. * * Calls to gmx_ana_poscalc_update() using \p pc should use only positions * initialized with this function. * The \c p->g pointer is initialized to point to an internal group that * contains the maximum index group set with gmx_ana_poscalc_set_maxindex(). */ void gmx_ana_poscalc_init_pos(gmx_ana_poscalc_t *pc, gmx_ana_pos_t *p) { e_index_t ptype; ptype = index_type_for_poscalc(pc->type); gmx_ana_indexmap_init(&p->m, &pc->gmax, pc->coll->top, ptype); gmx_ana_pos_reserve(p, p->m.nr, 0); p->g = &pc->gmax; }
gmx_ana_poscalc_t * PositionCalculationCollection::Impl::createCalculation(e_poscalc_t type, int flags) { gmx_ana_poscalc_t *pc; snew(pc, 1); pc->type = type; pc->itype = index_type_for_poscalc(type); gmx_ana_poscalc_set_flags(pc, flags); pc->refcount = 1; pc->coll = this; insertCalculation(pc, NULL); return pc; }
void PositionCalculationCollection::printTree(FILE *fp) const { gmx_ana_poscalc_t *pc; int i, j; fprintf(fp, "Position calculations:\n"); i = 1; pc = impl_->first_; while (pc) { fprintf(fp, "%2d ", i); switch (pc->type) { case POS_ATOM: fprintf(fp, "ATOM"); break; case POS_RES: fprintf(fp, "RES"); break; case POS_MOL: fprintf(fp, "MOL"); break; case POS_ALL: fprintf(fp, "ALL"); break; case POS_ALL_PBC: fprintf(fp, "ALL_PBC"); break; } if (pc->itype != index_type_for_poscalc(pc->type)) { fprintf(fp, " ("); switch (pc->itype) { case INDEX_UNKNOWN: fprintf(fp, "???"); break; case INDEX_ATOM: fprintf(fp, "ATOM"); break; case INDEX_RES: fprintf(fp, "RES"); break; case INDEX_MOL: fprintf(fp, "MOL"); break; case INDEX_ALL: fprintf(fp, "ALL"); break; } fprintf(fp, ")"); } fprintf(fp, " flg="); if (pc->flags & POS_MASS) { fprintf(fp, "M"); } if (pc->flags & POS_DYNAMIC) { fprintf(fp, "D"); } if (pc->flags & POS_MASKONLY) { fprintf(fp, "A"); } if (pc->flags & POS_COMPLMAX) { fprintf(fp, "Cm"); } if (pc->flags & POS_COMPLWHOLE) { fprintf(fp, "Cw"); } if (!pc->flags) { fprintf(fp, "0"); } fprintf(fp, " nr=%d nra=%d", pc->b.nr, pc->b.nra); fprintf(fp, " refc=%d", pc->refcount); fprintf(fp, "\n"); if (pc->gmax.nalloc_index > 0) { fprintf(fp, " Group: "); if (pc->gmax.isize > 20) { fprintf(fp, " %d atoms", pc->gmax.isize); } else { for (j = 0; j < pc->gmax.isize; ++j) { fprintf(fp, " %d", pc->gmax.index[j] + 1); } } fprintf(fp, "\n"); } if (pc->b.nalloc_a > 0) { fprintf(fp, " Atoms: "); if (pc->b.nra > 20) { fprintf(fp, " %d atoms", pc->b.nra); } else { for (j = 0; j < pc->b.nra; ++j) { fprintf(fp, " %d", pc->b.a[j] + 1); } } fprintf(fp, "\n"); } if (pc->b.nalloc_index > 0) { fprintf(fp, " Blocks:"); if (pc->b.nr > 20) { fprintf(fp, " %d pcs", pc->b.nr); } else { for (j = 0; j <= pc->b.nr; ++j) { fprintf(fp, " %d", pc->b.index[j]); } } fprintf(fp, "\n"); } if (pc->sbase) { gmx_ana_poscalc_t *base; fprintf(fp, " Base: "); j = 1; base = impl_->first_; while (base && base != pc->sbase) { ++j; base = base->next; } fprintf(fp, "%d", j); if (pc->baseid && pc->b.nr <= 20) { fprintf(fp, " id:"); for (j = 0; j < pc->b.nr; ++j) { fprintf(fp, " %d", pc->baseid[j]+1); } } fprintf(fp, "\n"); } ++i; pc = pc->next; } }