Move residuetype handling to its own file.
[alexxy/gromacs.git] / src / gromacs / topology / index.cpp
index 31b2e663cc51562ede4000a36213478e763c71cc..d0afa4658f67603542ad3c573dd930523bf209df 100644 (file)
 #include "gromacs/topology/atoms.h"
 #include "gromacs/topology/block.h"
 #include "gromacs/topology/invblock.h"
+#include "gromacs/topology/residuetypes.h"
 #include "gromacs/utility/cstringutil.h"
 #include "gromacs/utility/fatalerror.h"
-#include "gromacs/utility/futil.h"
 #include "gromacs/utility/smalloc.h"
 
-const char gmx_residuetype_undefined[] = "Other";
-
-struct gmx_residuetype
-{
-    int      n;
-    char **  resname;
-    char **  restype;
-
-};
-
-
 static gmx_bool gmx_ask_yesno(gmx_bool bASK)
 {
     char c;
@@ -586,239 +575,6 @@ static void analyse_prot(const char ** restype, t_atoms *atoms,
 }
 
 
-
-
-/* Return 0 if the name was found, otherwise -1.
- * p_restype is set to a pointer to the type name, or 'Other' if we did not find it.
- */
-int
-gmx_residuetype_get_type(gmx_residuetype_t rt, const char * resname, const char ** p_restype)
-{
-    int    i, rc;
-
-    rc = -1;
-    for (i = 0; i < rt->n && rc; i++)
-    {
-        rc = gmx_strcasecmp(rt->resname[i], resname);
-    }
-
-    *p_restype = (rc == 0) ? rt->restype[i-1] : gmx_residuetype_undefined;
-
-    return rc;
-}
-
-int
-gmx_residuetype_add(gmx_residuetype_t rt, const char *newresname, const char *newrestype)
-{
-    int           found;
-    const char *  p_oldtype;
-
-    found = !gmx_residuetype_get_type(rt, newresname, &p_oldtype);
-
-    if (found && gmx_strcasecmp(p_oldtype, newrestype))
-    {
-        fprintf(stderr, "Warning: Residue '%s' already present with type '%s' in database, ignoring new type '%s'.",
-                newresname, p_oldtype, newrestype);
-    }
-
-    if (found == 0)
-    {
-        srenew(rt->resname, rt->n+1);
-        srenew(rt->restype, rt->n+1);
-        rt->resname[rt->n] = strdup(newresname);
-        rt->restype[rt->n] = strdup(newrestype);
-        rt->n++;
-    }
-
-    return 0;
-}
-
-
-int
-gmx_residuetype_init(gmx_residuetype_t *prt)
-{
-    FILE                 *  db;
-    char                    line[STRLEN];
-    char                    resname[STRLEN], restype[STRLEN], dum[STRLEN];
-    struct gmx_residuetype *rt;
-
-    snew(rt, 1);
-    *prt = rt;
-
-    rt->n        = 0;
-    rt->resname  = NULL;
-    rt->restype  = NULL;
-
-    db = libopen("residuetypes.dat");
-
-    while (get_a_line(db, line, STRLEN))
-    {
-        strip_comment(line);
-        trim(line);
-        if (line[0] != '\0')
-        {
-            if (sscanf(line, "%s %s %s", resname, restype, dum) != 2)
-            {
-                gmx_fatal(FARGS, "Incorrect number of columns (2 expected) for line in residuetypes.dat");
-            }
-            gmx_residuetype_add(rt, resname, restype);
-        }
-    }
-
-    fclose(db);
-
-    return 0;
-}
-
-
-
-int
-gmx_residuetype_destroy(gmx_residuetype_t rt)
-{
-    int i;
-
-    for (i = 0; i < rt->n; i++)
-    {
-        sfree(rt->resname[i]);
-        sfree(rt->restype[i]);
-    }
-    sfree(rt->resname);
-    sfree(rt->restype);
-    sfree(rt);
-
-    return 0;
-}
-
-int
-gmx_residuetype_get_alltypes(gmx_residuetype_t    rt,
-                             const char ***       p_typenames,
-                             int *                ntypes)
-{
-    int            i, n;
-    const char **  my_typename;
-
-    n           = 0;
-    my_typename = NULL;
-    for (i = 0; i < rt->n; i++)
-    {
-        const char *const p      = rt->restype[i];
-        bool              bFound = false;
-        for (int j = 0; j < n && !bFound; j++)
-        {
-            assert(my_typename != NULL);
-            bFound = !gmx_strcasecmp(p, my_typename[j]);
-        }
-        if (!bFound)
-        {
-            srenew(my_typename, n+1);
-            my_typename[n] = p;
-            n++;
-        }
-    }
-    *ntypes      = n;
-    *p_typenames = my_typename;
-
-    return 0;
-}
-
-
-
-gmx_bool
-gmx_residuetype_is_protein(gmx_residuetype_t rt, const char *resnm)
-{
-    gmx_bool    rc;
-    const char *p_type;
-
-    if (gmx_residuetype_get_type(rt, resnm, &p_type) == 0 &&
-        gmx_strcasecmp(p_type, "Protein") == 0)
-    {
-        rc = TRUE;
-    }
-    else
-    {
-        rc = FALSE;
-    }
-    return rc;
-}
-
-gmx_bool
-gmx_residuetype_is_dna(gmx_residuetype_t rt, const char *resnm)
-{
-    gmx_bool    rc;
-    const char *p_type;
-
-    if (gmx_residuetype_get_type(rt, resnm, &p_type) == 0 &&
-        gmx_strcasecmp(p_type, "DNA") == 0)
-    {
-        rc = TRUE;
-    }
-    else
-    {
-        rc = FALSE;
-    }
-    return rc;
-}
-
-gmx_bool
-gmx_residuetype_is_rna(gmx_residuetype_t rt, const char *resnm)
-{
-    gmx_bool    rc;
-    const char *p_type;
-
-    if (gmx_residuetype_get_type(rt, resnm, &p_type) == 0 &&
-        gmx_strcasecmp(p_type, "RNA") == 0)
-    {
-        rc = TRUE;
-    }
-    else
-    {
-        rc = FALSE;
-    }
-    return rc;
-}
-
-/* Return the size of the arrays */
-int
-gmx_residuetype_get_size(gmx_residuetype_t rt)
-{
-    return rt->n;
-}
-
-/* Search for a residuetype with name resnm within the
- * gmx_residuetype database. Return the index if found,
- * otherwise -1.
- */
-int
-gmx_residuetype_get_index(gmx_residuetype_t rt, const char *resnm)
-{
-    int i, rc;
-
-    rc = -1;
-    for (i = 0; i < rt->n && rc; i++)
-    {
-        rc = gmx_strcasecmp(rt->resname[i], resnm);
-    }
-
-    return (0 == rc) ? i-1 : -1;
-}
-
-/* Return the name of the residuetype with the given index, or
- * NULL if not found. */
-const char *
-gmx_residuetype_get_name(gmx_residuetype_t rt, int index)
-{
-    if (index >= 0 && index < rt->n)
-    {
-        return rt->resname[index];
-    }
-    else
-    {
-        return NULL;
-    }
-}
-
-
-
 void analyse(t_atoms *atoms, t_blocka *gb, char ***gn, gmx_bool bASK, gmx_bool bVerb)
 {
     gmx_residuetype_t rt = NULL;