struct atomgrp *copy_atomgrp(const struct atomgrp *srcag)
{
	int atomn;
	struct atomgrp *destag =
	    (struct atomgrp *)_mol_calloc(1, sizeof(struct atomgrp));
	destag->natoms = srcag->natoms;
	destag->atoms =
	    (struct atom *)_mol_calloc(destag->natoms, sizeof(struct atom));
	for (atomn = 0; atomn < destag->natoms; atomn++) {
		copy_atom(&(srcag->atoms[atomn]), &(destag->atoms[atomn]));
	}
	return destag;
}
struct atomgrp* join_atomgrps (struct atomgrp** ags)
{
	struct atomgrp* ag = (struct atomgrp*) _mol_calloc (1, sizeof (struct atomgrp));
	ag->natoms = 100; // just a guess, realloc as necessary
	ag->atoms = (struct atom*) _mol_malloc (sizeof (struct atom) * ag->natoms);

	int agai = 0; // ag atom index
	int agi = 0; // index into ags
	while (ags[agi] != NULL)
	{
		int agsai; // ags atom index
		for (agsai = 0; agsai < ags[agi]->natoms; agsai++, agai++)
		{
			if (agai+1 > ag->natoms)
			{
				ag->natoms *= 2;
				ag->atoms = (struct atom*) _mol_realloc (ag->atoms, sizeof (struct atom) * ag->natoms);
			}

			copy_atom (&ags[agi]->atoms[agsai], &ag->atoms[agai]);
		}

		agi++;
	}


	// final realloc of the arrays to make them tight
	ag->natoms = agai;
	ag->atoms = (struct atom*) _mol_realloc (ag->atoms, sizeof (struct atom) * ag->natoms);

	return ag;
}
struct atomgrp* copy_atomgrp (struct atomgrp* srcag)
{
        struct atomgrp* destag = (struct atomgrp*) _mol_calloc (1, sizeof (struct atomgrp));
        destag->natoms = srcag->natoms;
        destag->atoms = (struct atom*) _mol_malloc (sizeof (struct atom) * destag->natoms);
        int atomn;
        for (atomn = 0; atomn < destag->natoms; atomn++)
        {
                copy_atom (&srcag->atoms[atomn], &destag->atoms[atomn]);
        }
        return destag;
}
struct atomgrp *around(int nlist, int *list, struct atomgrp* ag, double distup)
{
        int i, j;
        int natoms=ag->natoms;
        double x1,y1,z1,x2,y2,z2,d2;
        double du2=distup*distup;
        int *tmplist;
	int nout;
        struct atomgrp *destag;
        if(natoms==0)
        {
           fprintf (stderr,
                "around> ERROR: no atoms initially");
                exit (EXIT_FAILURE); 
        }
        tmplist=_mol_malloc(natoms*sizeof(int));

        for(i=0; i<natoms; i++)tmplist[i]=1;
        for(i=0; i<nlist; i++)tmplist[list[i]]=0;

        nout=0;
        for(i=0; i<nlist; i++)
        {
           x1=ag->atoms[list[i]].X;
           y1=ag->atoms[list[i]].Y;
           z1=ag->atoms[list[i]].Z;
           for(j=0; j<natoms; j++)
           {
              if(tmplist[j]!=1)continue;
              x2=ag->atoms[j].X-x1;
              y2=ag->atoms[j].Y-y1;
              z2=ag->atoms[j].Z-z1;
              d2=x2*x2+y2*y2+z2*z2;
              if(d2<=du2)
              {
                   tmplist[j]=2;
                   nout++;
              }
           }
        }
        destag = (struct atomgrp*) _mol_calloc (1, sizeof (struct atomgrp));
        destag->natoms = nout;
        destag->atoms = (struct atom*) _mol_malloc (sizeof (struct atom) * destag->natoms);
        j=0;
        for (i = 0; i < natoms; i++)
        {
                if(tmplist[i]==2)copy_atom (&ag->atoms[i], &destag->atoms[j++]);
        }
        free(tmplist);
        return destag;
}
struct atomgrp* exrm_type (struct atomgrp* ag, const char* type, struct prm* prm, int direction)
{
	int atomn; // loop var
	int natoms; // type atom number

	struct atomgrp* exag = (struct atomgrp*) _mol_calloc (1, sizeof (struct atomgrp)); // resultant extracted atomgrp
	exag->atoms = (struct atom*) _mol_malloc (sizeof (struct atom) * ag->natoms); // allocate memory for the array of atoms, realloc later to make it tight

	natoms = 0;
	for (atomn = 0; atomn < ag->natoms; atomn++)
	{
		if (
				(direction == 0 && strcmp (type, prm->atoms[ag->atoms[atomn].atom_typen].typemin) == 0) // extract type
				||
				(direction == 1 && ! (strcmp (type, prm->atoms[ag->atoms[atomn].atom_typen].typemin) == 0)) // rm type
		   )
		{
			exag->atoms[natoms].atom_typen = ag->atoms[atomn].atom_typen;
			exag->atoms[natoms].sa = ag->atoms[atomn].sa;
			exag->atoms[natoms].X = ag->atoms[atomn].X;
			exag->atoms[natoms].Y = ag->atoms[atomn].Y;
			exag->atoms[natoms].Z = ag->atoms[atomn].Z;
			/*
			exag->atoms[natoms].bonds[0] = ag->atoms[atomn].bonds[0];
			exag->atoms[natoms].bonds[1] = ag->atoms[atomn].bonds[1];
			exag->atoms[natoms].bonds[2] = ag->atoms[atomn].bonds[2];
			exag->atoms[natoms].bonds[3] = ag->atoms[atomn].bonds[3];
			*/
			natoms++;
		}
	}

	if (natoms == 0)
	{
		if (direction == 0)
		{
			fprintf (stderr, "there are no atoms of type %s to extract\n", type);
		}
		if (direction == 1)
		{
			fprintf (stderr, "removing atoms of type %s leaves no remaining atoms\n", type);
		}
		exit (EXIT_FAILURE);
	}

	exag->atoms = (struct atom*) _mol_realloc (exag->atoms, sizeof (struct atom) * natoms); // realloc exag->atoms to make it tight
	exag->natoms = natoms; // attach number of atoms

	return exag;
}
예제 #6
0
void read_ff_json(const char *json_file, struct atomgrp *ag)
{
	json_error_t json_file_error;
	json_t *base = json_load_file(json_file, 0, &json_file_error);

	if (!base) {
		fprintf(stderr,
			"error reading json file %s on line %d column %d: %s\n",
			json_file, json_file_error.line, json_file_error.column,
			json_file_error.text);
	}

	if (!json_is_object(base)) {
		fprintf(stderr, "json file not an object %s\n", json_file);
	}

	json_t *atoms, *bonds, *angles, *torsions, *impropers;
	atoms = json_object_get(base, "atoms");
	if (!json_is_array(atoms)) {
		fprintf(stderr, "json atoms are not an array %s\n", json_file);
	}
	size_t natoms = json_array_size(atoms);
	if (natoms != (size_t) ag->natoms) {
		fprintf(stderr,
			"json file has a different number of atoms %zd vs. %d : %s\n",
			natoms, ag->natoms, json_file);
	}

	ag->num_atom_types = 0;
	for (size_t i = 0; i < natoms; i++) {
		json_t *atom = json_array_get(atoms, i);
		if (!json_is_object(atom)) {
			fprintf(stderr,
				"Atom %zd not an object in json file %s\n", i,
				json_file);
		}
		json_t *ace_volume, *ftype_index, *ftype_name, *eps03;
		json_t *name, *radius03, *eps;
		json_t *charge, *radius, *element;

		ace_volume = json_object_get(atom, "ace_volume");
		if (!json_is_real(ace_volume)) {
			fprintf(stderr,
				"json ace volume is not floating point for atom %zd in json_file %s\n",
				i, json_file);
		}
		ag->atoms[i].acevolume = json_real_value(ace_volume);

		ftype_index = json_object_get(atom, "ftype_index");
		if (!json_is_integer(ftype_index)) {
			fprintf(stderr,
				"json ftype index is not integer for atom %zd in json_file %s\n",
				i, json_file);
		}
		ag->atoms[i].atom_ftypen = json_integer_value(ftype_index);
		if (ag->atoms[i].atom_ftypen > ag->num_atom_types) {
			ag->num_atom_types = ag->atoms[i].atom_ftypen;
		}

		ftype_name = json_object_get(atom, "ftype_name");
		if (!json_is_string(ftype_name)) {
			fprintf(stderr,
				"json ftype name is not string for atom %zd in json_file %s\n",
				i, json_file);
		}
		ag->atoms[i].ftype_name = strdup(json_string_value(ftype_name));

		element = json_object_get(atom, "element");
		if (!json_is_string(element)) {
			fprintf(stderr,
				"json element name is not string for atom %zd in json_file %s\n",
				i, json_file);
		}
		ag->atoms[i].element = strdup(json_string_value(element));

		eps = json_object_get(atom, "eps");
		if (!json_is_real(eps)) {
			fprintf(stderr,
				"json eps is not floating point for atom %zd in json_file %s\n",
				i, json_file);
		}
		ag->atoms[i].eps = sqrt(-json_real_value(eps));

		eps03 = json_object_get(atom, "eps03");
		if (!json_is_real(eps03)) {
			fprintf(stderr,
				"json eps03 is not floating point for atom %zd in json_file %s\n",
				i, json_file);
		}
		ag->atoms[i].eps03 = sqrt(-json_real_value(eps03));

		radius = json_object_get(atom, "radius");
		if (!json_is_real(radius)) {
			fprintf(stderr,
				"json radius is not floating point for atom %zd in json_file %s\n",
				i, json_file);
		}
		ag->atoms[i].rminh = json_real_value(radius);

		radius03 = json_object_get(atom, "radius03");
		if (!json_is_real(radius03)) {
			fprintf(stderr,
				"json radius03 is not floating point for atom %zd in json_file %s\n",
				i, json_file);
		}
		ag->atoms[i].rminh03 = json_real_value(radius03);

		charge = json_object_get(atom, "charge");
		if (!json_is_real(radius03)) {
			fprintf(stderr,
				"json charge is not floating point for atom %zd in json_file %s\n",
				i, json_file);
		}
		ag->atoms[i].chrg = json_real_value(charge);

		name = json_object_get(atom, "name");
		if (!json_is_string(name)) {
			fprintf(stderr,
				"json name is not string for atom %zd in json_file %s\n",
				i, json_file);
		}
		ag->atoms[i].name = strdup(json_string_value(name));

		ag->atoms[i].nbonds = 0;
		ag->atoms[i].nangs = 0;
		ag->atoms[i].ntors = 0;
		ag->atoms[i].nimps = 0;
		ag->atoms[i].fixed = 0;
	}

	bonds = json_object_get(base, "bonds");
	if (!json_is_array(bonds)) {
		fprintf(stderr, "json bonds are not an array %s\n", json_file);
	}
	size_t nbonds = json_array_size(bonds);
	ag->nbonds = nbonds;
	ag->bonds = _mol_calloc(nbonds, sizeof(struct atombond));
	for (size_t i = 0; i < nbonds; i++) {
		json_t *bond = json_array_get(bonds, i);
		if (!json_is_object(bond)) {
			fprintf(stderr,
				"Bond %zd not an object in json file %s\n", i,
				json_file);
		}
		json_t *length, *atom1, *atom2, *spring_constant, *sdf_type;

		atom1 = json_object_get(bond, "atom1");
		if (!json_is_integer(atom1)) {
			fprintf(stderr,
				"json atom1 is not integer for bond %zd in json_file %s\n",
				i, json_file);
		}
		int i1 = json_integer_value(atom1) - 1;
		ag->bonds[i].a0 = &(ag->atoms[i1]);
		(ag->atoms[i1].nbonds)++;

		atom2 = json_object_get(bond, "atom2");
		if (!json_is_integer(atom2)) {
			fprintf(stderr,
				"json atom2 is not integer for bond %zd in json_file %s\n",
				i, json_file);
		}
		int i2 = json_integer_value(atom2) - 1;
		ag->bonds[i].a1 = &(ag->atoms[i2]);
		(ag->atoms[i2].nbonds)++;

		length = json_object_get(bond, "length");
		if (!json_is_real(length)) {
			fprintf(stderr,
				"json length is not floating point for bond %zd in json_file %s\n",
				i, json_file);
		}
		ag->bonds[i].l0 = json_real_value(length);

		spring_constant = json_object_get(bond, "spring_constant");
		if (!json_is_real(spring_constant)) {
			fprintf(stderr,
				"json spring_constant is not floating point for bond %zd in json_file %s\n",
				i, json_file);
		}
		ag->bonds[i].k = json_real_value(spring_constant);

		sdf_type = json_object_get(bond, "sdf_type");
		if (!json_is_integer(sdf_type)) {
			fprintf(stderr,
				"json sdf_type is not integer for bond %zd in json_file %s\n",
				i, json_file);
		}
		ag->bonds[i].sdf_type = json_integer_value(sdf_type);
	}

	angles = json_object_get(base, "angles");
	if (!json_is_array(angles)) {
		fprintf(stderr, "json angles are not an array %s\n", json_file);
	}
	size_t nangles = json_array_size(angles);
	ag->nangs = nangles;
	ag->angs = _mol_calloc(nangles, sizeof(struct atomangle));
	for (size_t i = 0; i < nangles; i++) {
		json_t *angle = json_array_get(angles, i);
		if (!json_is_object(angle)) {
			fprintf(stderr,
				"Angle %zd not an object in json file %s\n", i,
				json_file);
		}
		json_t *theta, *atom1, *atom2, *atom3, *spring_constant;

		atom1 = json_object_get(angle, "atom1");
		if (!json_is_integer(atom1)) {
			fprintf(stderr,
				"json atom1 is not integer for angle %zd in json_file %s\n",
				i, json_file);
		}
		int i1 = json_integer_value(atom1) - 1;
		ag->angs[i].a0 = &(ag->atoms[i1]);
		(ag->atoms[i1].nangs)++;

		atom2 = json_object_get(angle, "atom2");
		if (!json_is_integer(atom2)) {
			fprintf(stderr,
				"json atom2 is not integer for angle %zd in json_file %s\n",
				i, json_file);
		}
		int i2 = json_integer_value(atom2) - 1;
		ag->angs[i].a1 = &(ag->atoms[i2]);
		(ag->atoms[i2].nangs)++;

		atom3 = json_object_get(angle, "atom3");
		if (!json_is_integer(atom3)) {
			fprintf(stderr,
				"json atom3 is not integer for angle %zd in json_file %s\n",
				i, json_file);
		}
		int i3 = json_integer_value(atom3) - 1;
		ag->angs[i].a2 = &(ag->atoms[i3]);
		(ag->atoms[i3].nangs)++;

		theta = json_object_get(angle, "theta");
		if (!json_is_real(theta)) {
			fprintf(stderr,
				"json theta is not floating point for angle %zd in json_file %s\n",
				i, json_file);
		}
		ag->angs[i].th0 = json_real_value(theta);

		spring_constant = json_object_get(angle, "spring_constant");
		if (!json_is_real(spring_constant)) {
			fprintf(stderr,
				"json spring_constant is not floating point for angle %zd in json_file %s\n",
				i, json_file);
		}
		ag->angs[i].k = json_real_value(spring_constant);
	}

	torsions = json_object_get(base, "torsions");
	if (!json_is_array(torsions)) {
		fprintf(stderr, "json torsions are not an array %s\n",
			json_file);
	}
	size_t ntorsions = json_array_size(torsions);
	ag->ntors = ntorsions;
	ag->tors = _mol_calloc(ntorsions, sizeof(struct atomtorsion));
	for (size_t i = 0; i < ntorsions; i++) {
		json_t *torsion = json_array_get(torsions, i);
		if (!json_is_object(torsion)) {
			fprintf(stderr,
				"Torsion %zd not an object in json file %s\n",
				i, json_file);
		}
		json_t *atom1, *atom2, *atom3, *atom4, *minima, *delta_constant,
		    *spring_constant;

		atom1 = json_object_get(torsion, "atom1");
		if (!json_is_integer(atom1)) {
			fprintf(stderr,
				"json atom1 is not integer for torsion %zd in json_file %s\n",
				i, json_file);
		}
		int i1 = json_integer_value(atom1) - 1;
		ag->tors[i].a0 = &(ag->atoms[i1]);
		(ag->atoms[i1].ntors)++;

		atom2 = json_object_get(torsion, "atom2");
		if (!json_is_integer(atom2)) {
			fprintf(stderr,
				"json atom2 is not integer for torsion %zd in json_file %s\n",
				i, json_file);
		}
		int i2 = json_integer_value(atom2) - 1;
		ag->tors[i].a1 = &(ag->atoms[i2]);
		(ag->atoms[i2].ntors)++;

		atom3 = json_object_get(torsion, "atom3");
		if (!json_is_integer(atom3)) {
			fprintf(stderr,
				"json atom3 is not integer for torsion %zd in json_file %s\n",
				i, json_file);
		}
		int i3 = json_integer_value(atom3) - 1;
		ag->tors[i].a2 = &(ag->atoms[i3]);
		(ag->atoms[i3].ntors)++;

		atom4 = json_object_get(torsion, "atom4");
		if (!json_is_integer(atom4)) {
			fprintf(stderr,
				"json atom4 is not integer for torsion %zd in json_file %s\n",
				i, json_file);
		}
		int i4 = json_integer_value(atom4) - 1;
		ag->tors[i].a3 = &(ag->atoms[i4]);
		(ag->atoms[i4].ntors)++;

		minima = json_object_get(torsion, "minima");
		if (!json_is_integer(minima)) {
			fprintf(stderr,
				"json minima is not integer for torsion %zd in json_file %s\n",
				i, json_file);
		}
		ag->tors[i].n = json_integer_value(minima);

		delta_constant = json_object_get(torsion, "delta_constant");
		if (!json_is_real(delta_constant)) {
			fprintf(stderr,
				"json delta_constant is not floating point for torsion %zd in json_file %s\n",
				i, json_file);
		}
		ag->tors[i].d = json_real_value(delta_constant);

		spring_constant = json_object_get(torsion, "spring_constant");
		if (!json_is_real(spring_constant)) {
			fprintf(stderr,
				"json spring_constant is not floating point for torsion %zd in json_file %s\n",
				i, json_file);
		}
		ag->tors[i].k = json_real_value(spring_constant);
	}

	impropers = json_object_get(base, "impropers");
	if (!json_is_array(impropers)) {
		fprintf(stderr, "json impropers are not an array %s\n",
			json_file);
	}
	size_t nimpropers = json_array_size(impropers);
	ag->nimps = nimpropers;
	ag->imps = _mol_calloc(nimpropers, sizeof(struct atomimproper));
	for (size_t i = 0; i < nimpropers; i++) {
		json_t *improper = json_array_get(impropers, i);
		if (!json_is_object(improper)) {
			fprintf(stderr,
				"Improper %zd not an object in json file %s\n",
				i, json_file);
		}
		json_t *atom1, *atom2, *atom3, *atom4, *phi, *spring_constant;

		atom1 = json_object_get(improper, "atom1");
		if (!json_is_integer(atom1)) {
			fprintf(stderr,
				"json atom1 is not integer for improper %zd in json_file %s\n",
				i, json_file);
		}
		int i1 = json_integer_value(atom1) - 1;
		ag->imps[i].a0 = &(ag->atoms[i1]);
		(ag->atoms[i1].nimps)++;

		atom2 = json_object_get(improper, "atom2");
		if (!json_is_integer(atom2)) {
			fprintf(stderr,
				"json atom2 is not integer for improper %zd in json_file %s\n",
				i, json_file);
		}
		int i2 = json_integer_value(atom2) - 1;
		ag->imps[i].a1 = &(ag->atoms[i2]);
		(ag->atoms[i2].nimps)++;

		atom3 = json_object_get(improper, "atom3");
		if (!json_is_integer(atom3)) {
			fprintf(stderr,
				"json atom3 is not integer for improper %zd in json_file %s\n",
				i, json_file);
		}
		int i3 = json_integer_value(atom3) - 1;
		ag->imps[i].a2 = &(ag->atoms[i3]);
		(ag->atoms[i3].nimps)++;

		atom4 = json_object_get(improper, "atom4");
		if (!json_is_integer(atom4)) {
			fprintf(stderr,
				"json atom4 is not integer for improper %zd in json_file %s\n",
				i, json_file);
		}
		int i4 = json_integer_value(atom4) - 1;
		ag->imps[i].a3 = &(ag->atoms[i4]);
		(ag->atoms[i4].nimps)++;

		phi = json_object_get(improper, "phi");
		if (!json_is_real(phi)) {
			fprintf(stderr,
				"json phi is not floating point for improper %zd in json_file %s\n",
				i, json_file);
		}
		ag->imps[i].psi0 = json_real_value(phi);

		spring_constant = json_object_get(improper, "spring_constant");
		if (!json_is_real(spring_constant)) {
			fprintf(stderr,
				"json spring_constant is not floating point for improper %zd in json_file %s\n",
				i, json_file);
		}
		ag->imps[i].k = json_real_value(spring_constant);
	}

	json_decref(base);

//allocate atom arrays of pointers to parameters
	for (size_t i = 0; i < natoms; i++) {
		int i1 = ag->atoms[i].nbonds;
		ag->atoms[i].bonds = _mol_calloc(i1, sizeof(struct atombond *));
		ag->atoms[i].nbonds = 0;
		i1 = ag->atoms[i].nangs;
		ag->atoms[i].angs = _mol_calloc(i1, sizeof(struct atomangle *));
		ag->atoms[i].nangs = 0;
		i1 = ag->atoms[i].ntors;
		ag->atoms[i].tors =
		    _mol_calloc(i1, sizeof(struct atomtorsion *));
		ag->atoms[i].ntors = 0;
		i1 = ag->atoms[i].nimps;
		ag->atoms[i].imps =
		    _mol_calloc(i1, sizeof(struct atomimproper *));
		ag->atoms[i].nimps = 0;
	}
	struct atom *atm;
//fill bonds
	for (int i = 0; i < ag->nbonds; i++) {
		atm = ag->bonds[i].a0;
		atm->bonds[(atm->nbonds)++] = &(ag->bonds[i]);
		atm = ag->bonds[i].a1;
		atm->bonds[(atm->nbonds)++] = &(ag->bonds[i]);
	}
//fill angles
	for (int i = 0; i < ag->nangs; i++) {
		atm = ag->angs[i].a0;
		atm->angs[(atm->nangs)++] = &(ag->angs[i]);
		atm = ag->angs[i].a1;
		atm->angs[(atm->nangs)++] = &(ag->angs[i]);
		atm = ag->angs[i].a2;
		atm->angs[(atm->nangs)++] = &(ag->angs[i]);
	}
//fill torsions
	for (int i = 0; i < ag->ntors; i++) {
		atm = ag->tors[i].a0;
		atm->tors[(atm->ntors)++] = &(ag->tors[i]);
		atm = ag->tors[i].a1;
		atm->tors[(atm->ntors)++] = &(ag->tors[i]);
		atm = ag->tors[i].a2;
		atm->tors[(atm->ntors)++] = &(ag->tors[i]);
		atm = ag->tors[i].a3;
		atm->tors[(atm->ntors)++] = &(ag->tors[i]);
	}
//fill impropers
	for (int i = 0; i < ag->nimps; i++) {
		atm = ag->imps[i].a0;
		atm->imps[(atm->nimps)++] = &(ag->imps[i]);
		atm = ag->imps[i].a1;
		atm->imps[(atm->nimps)++] = &(ag->imps[i]);
		atm = ag->imps[i].a2;
		atm->imps[(atm->nimps)++] = &(ag->imps[i]);
		atm = ag->imps[i].a3;
		atm->imps[(atm->nimps)++] = &(ag->imps[i]);
	}
//atom indices in the group
	fill_ingrp(ag);

	ag->is_psf_read = true;

	// copy vals from deprecated to new data structures
	int atomsi;
	for (atomsi = 0; atomsi < ag->natoms; atomsi++) {
		_mol_atom_create_bond_indices(&ag->atoms[atomsi],
					      ag->atoms[atomsi].nbonds);
	}
	_mol_atom_group_copy_from_deprecated(ag);
}
예제 #7
0
struct atomgrp *read_json_ag(const char *json_file)
{
	struct atomgrp *ag =
	    (struct atomgrp *)_mol_calloc(1, sizeof(struct atomgrp));
	json_error_t json_file_error;
	json_t *base = json_load_file(json_file, 0, &json_file_error);

	if (!base) {
		fprintf(stderr,
			"error reading json file %s on line %d column %d: %s\n",
			json_file, json_file_error.line, json_file_error.column,
			json_file_error.text);
	}

	if (!json_is_object(base)) {
		fprintf(stderr, "json file not an object %s\n", json_file);
	}

	json_t *atoms, *bonds, *angles, *torsions, *impropers;
	atoms = json_object_get(base, "atoms");
	if (!json_is_array(atoms)) {
		fprintf(stderr, "json atoms are not an array %s\n", json_file);
	}
	size_t natoms = json_array_size(atoms);
	ag->natoms = natoms;
	ag->atoms = (struct atom *)_mol_calloc(ag->natoms, sizeof(struct atom));

	ag->num_atom_types = 0;

	char *prev_segment = _mol_calloc(1, sizeof(char));
	char *prev_residue = _mol_calloc(1, sizeof(char));
	int prev_residue_seq = -107;
	ag->nres = 0;
	int alloc_res = 250;
	ag->iares = _mol_malloc(alloc_res*sizeof(int));
	for (size_t i = 0; i < natoms; i++) {
		json_t *atom = json_array_get(atoms, i);
		if (!json_is_object(atom)) {
			fprintf(stderr,
				"Atom %zd not an object in json file %s\n", i,
				json_file);
		}
		json_t *ace_volume, *ftype_index, *ftype_name, *eps03;
		json_t *name, *radius03, *eps, *acp_type, *residue_name;
		json_t *charge, *radius, *element;
		json_t *x, *y, *z;
		json_t *yeti_type, *sybyl_type;
		json_t *backbone, *hb_acceptor, *hb_donor, *hb_weight;
		json_t *segment, *residue;


		segment = json_object_get(atom, "segment");
		residue = json_object_get(atom, "residue");
		if ((segment != NULL) && (residue != NULL)) {
			if (!json_is_string(segment)) {
				fprintf(stderr,
					"json segment is not string for atom %zd in json_file %s\n",
					i, json_file);
			}
			if (!json_is_string(residue)) {
				fprintf(stderr,
					"json residue is not string for atom %zd in json_file %s\n",
					i, json_file);
			}

			const char *cur_segment = json_string_value(segment);
			const char *cur_residue = json_string_value(residue);

			if (strcmp(cur_segment, prev_segment) != 0) {
				prev_residue_seq += 100;
				free(prev_segment);
				prev_segment = strdup(cur_segment);
			}
			if (strcmp(cur_residue, prev_residue) != 0) {
				int cur_residue_int = atoi(cur_residue);
				int prev_residue_int = atoi(prev_residue);
				if ((cur_residue_int - prev_residue_int) > 1) {
					prev_residue_seq +=
					    (cur_residue_int -
					     prev_residue_int);
				} else {
					prev_residue_seq += 1;
				}
				free(prev_residue);
				prev_residue = strdup(cur_residue);

				if (ag->nres +1 == alloc_res) {
					alloc_res *= 2;
					ag->iares = _mol_realloc(ag->iares, alloc_res * i);
				}
				ag->iares[ag->nres] = i;
				ag->nres++;
			}


			ag->atoms[i].comb_res_seq = prev_residue_seq;
		} else {
			ag->atoms[i].comb_res_seq = prev_residue_seq;
		}

		ace_volume = json_object_get(atom, "ace_volume");
		if (!json_is_real(ace_volume)) {
			fprintf(stderr,
				"json ace volume is not floating point for atom %zd in json_file %s\n",
				i, json_file);
		}
		ag->atoms[i].acevolume = json_real_value(ace_volume);

		ftype_index = json_object_get(atom, "ftype_index");
		if (!json_is_integer(ftype_index)) {
			fprintf(stderr,
				"json ftype index is not integer for atom %zd in json_file %s\n",
				i, json_file);
		}
		ag->atoms[i].atom_ftypen = json_integer_value(ftype_index);
		if (ag->atoms[i].atom_ftypen > ag->num_atom_types) {
			ag->num_atom_types = ag->atoms[i].atom_ftypen;
		}

		ftype_name = json_object_get(atom, "ftype_name");
		if (!json_is_string(ftype_name)) {
			fprintf(stderr,
				"json ftype name is not string for atom %zd in json_file %s\n",
				i, json_file);
		}
		ag->atoms[i].ftype_name = strdup(json_string_value(ftype_name));

		element = json_object_get(atom, "element");
		if (!json_is_string(element)) {
			fprintf(stderr,
				"json element name is not string for atom %zd in json_file %s\n",
				i, json_file);
		}
		ag->atoms[i].element = strdup(json_string_value(element));

		eps = json_object_get(atom, "eps");
		if (!json_is_real(eps)) {
			fprintf(stderr,
				"json eps is not floating point for atom %zd in json_file %s\n",
				i, json_file);
		}
		ag->atoms[i].eps = sqrt(-json_real_value(eps));

		eps03 = json_object_get(atom, "eps03");
		if (!json_is_real(eps03)) {
			fprintf(stderr,
				"json eps03 is not floating point for atom %zd in json_file %s\n",
				i, json_file);
		}
		ag->atoms[i].eps03 = sqrt(-json_real_value(eps03));

		radius = json_object_get(atom, "radius");
		if (!json_is_real(radius)) {
			fprintf(stderr,
				"json radius is not floating point for atom %zd in json_file %s\n",
				i, json_file);
		}
		ag->atoms[i].rminh = json_real_value(radius);

		radius03 = json_object_get(atom, "radius03");
		if (!json_is_real(radius03)) {
			fprintf(stderr,
				"json radius03 is not floating point for atom %zd in json_file %s\n",
				i, json_file);
		}
		ag->atoms[i].rminh03 = json_real_value(radius03);

		charge = json_object_get(atom, "charge");
		if (!json_is_real(radius03)) {
			fprintf(stderr,
				"json charge is not floating point for atom %zd in json_file %s\n",
				i, json_file);
		}
		ag->atoms[i].chrg = json_real_value(charge);

		name = json_object_get(atom, "name");
		if (!json_is_string(name)) {
			fprintf(stderr,
				"json name is not string for atom %zd in json_file %s\n",
				i, json_file);
		}
		ag->atoms[i].name = strdup(json_string_value(name));

		residue_name = json_object_get(atom, "residue_name");
		if (residue_name != NULL) {
			if (!json_is_string(residue_name)) {
				fprintf(stderr,
					"json residue_name is not string for atom %zd in json_file %s\n",
					i, json_file);
			}
			ag->atoms[i].residue_name =
			    strdup(json_string_value(residue_name));
		} else {
			ag->atoms[i].residue_name = NULL;
		}

		x = json_object_get(atom, "x");
		if (!json_is_real(x)) {
			fprintf(stderr,
				"json coordinate x is not floating point for atom %zd in json_file %s\n",
				i, json_file);
		}
		ag->atoms[i].X = json_real_value(x);

		y = json_object_get(atom, "y");
		if (!json_is_real(y)) {
			fprintf(stderr,
				"json coordinate y is not floating point for atom %zd in json_file %s\n",
				i, json_file);
		}
		ag->atoms[i].Y = json_real_value(y);

		z = json_object_get(atom, "z");
		if (!json_is_real(z)) {
			fprintf(stderr,
				"json coordinate z is not floating point for atom %zd in json_file %s\n",
				i, json_file);
		}
		ag->atoms[i].Z = json_real_value(z);

		acp_type = json_object_get(atom, "acp_type");
		if (acp_type != NULL) {
			if (!json_is_integer(acp_type)) {
				fprintf(stderr,
					"json acp_type index is not integer for atom %zd in json_file %s\n",
					i, json_file);
			}
			ag->atoms[i].acp_type = json_integer_value(acp_type);
		} else {
			ag->atoms[i].acp_type = -1;
		}

		yeti_type = json_object_get(atom, "yeti_type");
		if (yeti_type != NULL) {
			const char *yeti_type_string;
			if (!json_is_string(yeti_type)) {
				fprintf(stderr,
					"json yeti_type is not string for atom %zd in json_file %s\n",
					i, json_file);
			}
			yeti_type_string = json_string_value(yeti_type);
			if (strcmp("carbonyl", yeti_type_string) == 0) {
				ag->atoms[i].yeti_type = MOL_YETI_CARBONYL;
			} else if (strcmp("hydroxyl", yeti_type_string) == 0) {
				ag->atoms[i].yeti_type = MOL_YETI_HYDROXYL;
			} else if (strcmp("sulfonamide", yeti_type_string) == 0) {
				ag->atoms[i].yeti_type = MOL_YETI_SULFONAMIDE;
			} else if (strcmp("N5_aromatic", yeti_type_string) == 0) {
				ag->atoms[i].yeti_type = MOL_YETI_N5_AROMATIC;
			} else if (strcmp("N6_aromatic", yeti_type_string) == 0) {
				ag->atoms[i].yeti_type = MOL_YETI_N6_AROMATIC;
			} else {
				fprintf(stderr,
					"unknown json yeti_type %s for atom %zd in json_file %s\n",
					yeti_type_string, i, json_file);
				ag->atoms[i].yeti_type = MOL_YETI_NONE;
			}
		} else {
			ag->atoms[i].yeti_type = MOL_YETI_NONE;
		}

		sybyl_type = json_object_get(atom, "sybyl_type");
		if (sybyl_type != NULL) {
			const char *sybyl_type_string;
			if (!json_is_string(sybyl_type)) {
				fprintf(stderr,
					"json sybyl_type is not string for atom %zd in json_file %s\n",
					i, json_file);
			}
			sybyl_type_string = json_string_value(sybyl_type);
			ag->atoms[i].hybridization =
			    mol_hydridization_from_sybyl(sybyl_type_string);
		} else {
			ag->atoms[i].hybridization = UNKNOWN_HYBRID;
		}

		backbone = json_object_get(atom, "backbone");
		if (backbone != NULL) {
			if (!json_is_boolean(backbone)) {
				fprintf(stderr,
					"json backbone is not boolean for atom %zd in json_file %s\n",
					i, json_file);
			}
			ag->atoms[i].backbone = json_is_true(backbone);
		} else {
			ag->atoms[i].backbone = false;
		}

		ag->atoms[i].hprop = 0;
		hb_acceptor = json_object_get(atom, "hb_acceptor");
		if (hb_acceptor != NULL) {
			if (!json_is_boolean(hb_acceptor)) {
				fprintf(stderr,
					"json hb_acceptor is not boolean for atom %zd in json_file %s\n",
					i, json_file);
			}
			if (json_is_true(hb_acceptor)) {
				ag->atoms[i].hprop |= HBOND_ACCEPTOR;
			}
		}
		hb_donor = json_object_get(atom, "hb_donor");
		if (hb_donor != NULL) {
			if (!json_is_boolean(hb_donor)) {
				fprintf(stderr,
					"json hb_donor is not boolean for atom %zd in json_file %s\n",
					i, json_file);
			}
			if (json_is_true(hb_donor)) {
				ag->atoms[i].hprop |= DONATABLE_HYDROGEN;
			}
		}
		ag->atoms[i].hbond_weight = 1.0;
		hb_weight = json_object_get(atom, "hb_weight");
		if (hb_weight != NULL) {
			if (!json_is_real(hb_weight)) {
				fprintf(stderr,
					"json hb_weight is not floating point for atom %zd in json_file %s\n",
					i, json_file);
			}
			ag->atoms[i].hbond_weight = json_real_value(hb_weight);
		}

		ag->atoms[i].nbonds = 0;
		ag->atoms[i].nangs = 0;
		ag->atoms[i].ntors = 0;
		ag->atoms[i].nimps = 0;
		ag->atoms[i].fixed = 0;
		ag->atoms[i].sa = -1;
		ag->atoms[i].base = -1;
		ag->atoms[i].base2 = -1;
	}
	ag->iares[ag->nres] = ag->natoms;
	ag->iares = _mol_realloc(ag->iares, (ag->nres+1) * sizeof(int));
	free(prev_segment);
	free(prev_residue);

	bonds = json_object_get(base, "bonds");
	if (!json_is_array(bonds)) {
		fprintf(stderr, "json bonds are not an array %s\n", json_file);
	}
	size_t nbonds = json_array_size(bonds);
	ag->nbonds = nbonds;
	ag->bonds = _mol_calloc(nbonds, sizeof(struct atombond));
	for (size_t i = 0; i < nbonds; i++) {
		json_t *bond = json_array_get(bonds, i);
		if (!json_is_object(bond)) {
			fprintf(stderr,
				"Bond %zd not an object in json file %s\n", i,
				json_file);
		}
		json_t *length, *atom1, *atom2, *spring_constant, *sdf_type;

		atom1 = json_object_get(bond, "atom1");
		if (!json_is_integer(atom1)) {
			fprintf(stderr,
				"json atom1 is not integer for bond %zd in json_file %s\n",
				i, json_file);
		}
		int i1 = json_integer_value(atom1) - 1;
		ag->bonds[i].a0 = &(ag->atoms[i1]);
		(ag->atoms[i1].nbonds)++;

		atom2 = json_object_get(bond, "atom2");
		if (!json_is_integer(atom2)) {
			fprintf(stderr,
				"json atom2 is not integer for bond %zd in json_file %s\n",
				i, json_file);
		}
		int i2 = json_integer_value(atom2) - 1;
		ag->bonds[i].a1 = &(ag->atoms[i2]);
		(ag->atoms[i2].nbonds)++;

		length = json_object_get(bond, "length");
		if (!json_is_real(length)) {
			fprintf(stderr,
				"json length is not floating point for bond %zd in json_file %s\n",
				i, json_file);
		}
		ag->bonds[i].l0 = json_real_value(length);

		spring_constant = json_object_get(bond, "spring_constant");
		if (!json_is_real(spring_constant)) {
			fprintf(stderr,
				"json spring_constant is not floating point for bond %zd in json_file %s\n",
				i, json_file);
		}
		ag->bonds[i].k = json_real_value(spring_constant);

		sdf_type = json_object_get(bond, "sdf_type");
		if (sdf_type != NULL) {
			if (!json_is_integer(sdf_type)) {
				fprintf(stderr,
					"json sdf_type is not integer for bond %zd in json_file %s\n",
					i, json_file);
			}
			ag->bonds[i].sdf_type = json_integer_value(sdf_type);
		} else {
			ag->bonds[i].sdf_type = 0;
		}
	}

	angles = json_object_get(base, "angles");
	if (!json_is_array(angles)) {
		fprintf(stderr, "json angles are not an array %s\n", json_file);
	}
	size_t nangles = json_array_size(angles);
	ag->nangs = nangles;
	ag->angs = _mol_calloc(nangles, sizeof(struct atomangle));
	for (size_t i = 0; i < nangles; i++) {
		json_t *angle = json_array_get(angles, i);
		if (!json_is_object(angle)) {
			fprintf(stderr,
				"Angle %zd not an object in json file %s\n", i,
				json_file);
		}
		json_t *theta, *atom1, *atom2, *atom3, *spring_constant;

		atom1 = json_object_get(angle, "atom1");
		if (!json_is_integer(atom1)) {
			fprintf(stderr,
				"json atom1 is not integer for angle %zd in json_file %s\n",
				i, json_file);
		}
		int i1 = json_integer_value(atom1) - 1;
		ag->angs[i].a0 = &(ag->atoms[i1]);
		(ag->atoms[i1].nangs)++;

		atom2 = json_object_get(angle, "atom2");
		if (!json_is_integer(atom2)) {
			fprintf(stderr,
				"json atom2 is not integer for angle %zd in json_file %s\n",
				i, json_file);
		}
		int i2 = json_integer_value(atom2) - 1;
		ag->angs[i].a1 = &(ag->atoms[i2]);
		(ag->atoms[i2].nangs)++;

		atom3 = json_object_get(angle, "atom3");
		if (!json_is_integer(atom3)) {
			fprintf(stderr,
				"json atom3 is not integer for angle %zd in json_file %s\n",
				i, json_file);
		}
		int i3 = json_integer_value(atom3) - 1;
		ag->angs[i].a2 = &(ag->atoms[i3]);
		(ag->atoms[i3].nangs)++;

		theta = json_object_get(angle, "theta");
		if (!json_is_real(theta)) {
			fprintf(stderr,
				"json theta is not floating point for angle %zd in json_file %s\n",
				i, json_file);
		}
		ag->angs[i].th0 = json_real_value(theta);

		spring_constant = json_object_get(angle, "spring_constant");
		if (!json_is_real(spring_constant)) {
			fprintf(stderr,
				"json spring_constant is not floating point for angle %zd in json_file %s\n",
				i, json_file);
		}
		ag->angs[i].k = json_real_value(spring_constant);
	}

	torsions = json_object_get(base, "torsions");
	if (!json_is_array(torsions)) {
		fprintf(stderr, "json torsions are not an array %s\n",
			json_file);
	}
	size_t ntorsions = json_array_size(torsions);
	ag->ntors = ntorsions;
	ag->tors = _mol_calloc(ntorsions, sizeof(struct atomtorsion));
	for (size_t i = 0; i < ntorsions; i++) {
		json_t *torsion = json_array_get(torsions, i);
		if (!json_is_object(torsion)) {
			fprintf(stderr,
				"Torsion %zd not an object in json file %s\n",
				i, json_file);
		}
		json_t *atom1, *atom2, *atom3, *atom4, *minima, *delta_constant,
		    *spring_constant;

		atom1 = json_object_get(torsion, "atom1");
		if (!json_is_integer(atom1)) {
			fprintf(stderr,
				"json atom1 is not integer for torsion %zd in json_file %s\n",
				i, json_file);
		}
		int i1 = json_integer_value(atom1) - 1;
		ag->tors[i].a0 = &(ag->atoms[i1]);
		(ag->atoms[i1].ntors)++;

		atom2 = json_object_get(torsion, "atom2");
		if (!json_is_integer(atom2)) {
			fprintf(stderr,
				"json atom2 is not integer for torsion %zd in json_file %s\n",
				i, json_file);
		}
		int i2 = json_integer_value(atom2) - 1;
		ag->tors[i].a1 = &(ag->atoms[i2]);
		(ag->atoms[i2].ntors)++;

		atom3 = json_object_get(torsion, "atom3");
		if (!json_is_integer(atom3)) {
			fprintf(stderr,
				"json atom3 is not integer for torsion %zd in json_file %s\n",
				i, json_file);
		}
		int i3 = json_integer_value(atom3) - 1;
		ag->tors[i].a2 = &(ag->atoms[i3]);
		(ag->atoms[i3].ntors)++;

		atom4 = json_object_get(torsion, "atom4");
		if (!json_is_integer(atom4)) {
			fprintf(stderr,
				"json atom4 is not integer for torsion %zd in json_file %s\n",
				i, json_file);
		}
		int i4 = json_integer_value(atom4) - 1;
		ag->tors[i].a3 = &(ag->atoms[i4]);
		(ag->atoms[i4].ntors)++;

		minima = json_object_get(torsion, "minima");
		if (!json_is_integer(minima)) {
			fprintf(stderr,
				"json minima is not integer for torsion %zd in json_file %s\n",
				i, json_file);
		}
		ag->tors[i].n = json_integer_value(minima);

		delta_constant = json_object_get(torsion, "delta_constant");
		if (!json_is_real(delta_constant)) {
			fprintf(stderr,
				"json delta_constant is not floating point for torsion %zd in json_file %s\n",
				i, json_file);
		}
		ag->tors[i].d = json_real_value(delta_constant);

		spring_constant = json_object_get(torsion, "spring_constant");
		if (!json_is_real(spring_constant)) {
			fprintf(stderr,
				"json spring_constant is not floating point for torsion %zd in json_file %s\n",
				i, json_file);
		}
		ag->tors[i].k = json_real_value(spring_constant);
	}

	impropers = json_object_get(base, "impropers");
	if (!json_is_array(impropers)) {
		fprintf(stderr, "json impropers are not an array %s\n",
			json_file);
	}
	size_t nimpropers = json_array_size(impropers);
	ag->nimps = nimpropers;
	ag->imps = _mol_calloc(nimpropers, sizeof(struct atomimproper));
	for (size_t i = 0; i < nimpropers; i++) {
		json_t *improper = json_array_get(impropers, i);
		if (!json_is_object(improper)) {
			fprintf(stderr,
				"Improper %zd not an object in json file %s\n",
				i, json_file);
		}
		json_t *atom1, *atom2, *atom3, *atom4, *phi, *spring_constant;

		atom1 = json_object_get(improper, "atom1");
		if (!json_is_integer(atom1)) {
			fprintf(stderr,
				"json atom1 is not integer for improper %zd in json_file %s\n",
				i, json_file);
		}
		int i1 = json_integer_value(atom1) - 1;
		ag->imps[i].a0 = &(ag->atoms[i1]);
		(ag->atoms[i1].nimps)++;

		atom2 = json_object_get(improper, "atom2");
		if (!json_is_integer(atom2)) {
			fprintf(stderr,
				"json atom2 is not integer for improper %zd in json_file %s\n",
				i, json_file);
		}
		int i2 = json_integer_value(atom2) - 1;
		ag->imps[i].a1 = &(ag->atoms[i2]);
		(ag->atoms[i2].nimps)++;

		atom3 = json_object_get(improper, "atom3");
		if (!json_is_integer(atom3)) {
			fprintf(stderr,
				"json atom3 is not integer for improper %zd in json_file %s\n",
				i, json_file);
		}
		int i3 = json_integer_value(atom3) - 1;
		ag->imps[i].a2 = &(ag->atoms[i3]);
		(ag->atoms[i3].nimps)++;

		atom4 = json_object_get(improper, "atom4");
		if (!json_is_integer(atom4)) {
			fprintf(stderr,
				"json atom4 is not integer for improper %zd in json_file %s\n",
				i, json_file);
		}
		int i4 = json_integer_value(atom4) - 1;
		ag->imps[i].a3 = &(ag->atoms[i4]);
		(ag->atoms[i4].nimps)++;

		phi = json_object_get(improper, "phi");
		if (!json_is_real(phi)) {
			fprintf(stderr,
				"json phi is not floating point for improper %zd in json_file %s\n",
				i, json_file);
		}
		ag->imps[i].psi0 = json_real_value(phi);

		spring_constant = json_object_get(improper, "spring_constant");
		if (!json_is_real(spring_constant)) {
			fprintf(stderr,
				"json spring_constant is not floating point for improper %zd in json_file %s\n",
				i, json_file);
		}
		ag->imps[i].k = json_real_value(spring_constant);
	}

	json_decref(base);

//allocate atom arrays of pointers to parameters
	for (size_t i = 0; i < natoms; i++) {
		int i1 = ag->atoms[i].nbonds;
		ag->atoms[i].bonds = _mol_calloc(i1, sizeof(struct atombond *));
		ag->atoms[i].nbonds = 0;
		i1 = ag->atoms[i].nangs;
		ag->atoms[i].angs = _mol_calloc(i1, sizeof(struct atomangle *));
		ag->atoms[i].nangs = 0;
		i1 = ag->atoms[i].ntors;
		ag->atoms[i].tors =
		    _mol_calloc(i1, sizeof(struct atomtorsion *));
		ag->atoms[i].ntors = 0;
		i1 = ag->atoms[i].nimps;
		ag->atoms[i].imps =
		    _mol_calloc(i1, sizeof(struct atomimproper *));
		ag->atoms[i].nimps = 0;
	}
	struct atom *atm;
//fill bonds
	for (int i = 0; i < ag->nbonds; i++) {
		atm = ag->bonds[i].a0;
		atm->bonds[(atm->nbonds)++] = &(ag->bonds[i]);
		atm = ag->bonds[i].a1;
		atm->bonds[(atm->nbonds)++] = &(ag->bonds[i]);
	}
//fill angles
	for (int i = 0; i < ag->nangs; i++) {
		atm = ag->angs[i].a0;
		atm->angs[(atm->nangs)++] = &(ag->angs[i]);
		atm = ag->angs[i].a1;
		atm->angs[(atm->nangs)++] = &(ag->angs[i]);
		atm = ag->angs[i].a2;
		atm->angs[(atm->nangs)++] = &(ag->angs[i]);
	}
//fill torsions
	for (int i = 0; i < ag->ntors; i++) {
		atm = ag->tors[i].a0;
		atm->tors[(atm->ntors)++] = &(ag->tors[i]);
		atm = ag->tors[i].a1;
		atm->tors[(atm->ntors)++] = &(ag->tors[i]);
		atm = ag->tors[i].a2;
		atm->tors[(atm->ntors)++] = &(ag->tors[i]);
		atm = ag->tors[i].a3;
		atm->tors[(atm->ntors)++] = &(ag->tors[i]);
	}
//fill impropers
	for (int i = 0; i < ag->nimps; i++) {
		atm = ag->imps[i].a0;
		atm->imps[(atm->nimps)++] = &(ag->imps[i]);
		atm = ag->imps[i].a1;
		atm->imps[(atm->nimps)++] = &(ag->imps[i]);
		atm = ag->imps[i].a2;
		atm->imps[(atm->nimps)++] = &(ag->imps[i]);
		atm = ag->imps[i].a3;
		atm->imps[(atm->nimps)++] = &(ag->imps[i]);
	}
//atom indices in the group
	fill_ingrp(ag);

	ag->is_psf_read = true;

	// copy vals from deprecated to new data structures
	int atomsi;
	for (atomsi = 0; atomsi < ag->natoms; atomsi++) {
		_mol_atom_create_bond_indices(&ag->atoms[atomsi],
					      ag->atoms[atomsi].nbonds);
	}
	_mol_atom_group_copy_from_deprecated(ag);
	return ag;
}
예제 #8
0
struct atomgrp *read_pdb(const char *path, struct prm *prm)
{
    FILE *fp = myfopen(path, "r");

    struct atomgrp *ag =
        (struct atomgrp *)_mol_calloc(1, sizeof(struct atomgrp));

    char *line = NULL;
    size_t len = 0;

    char atypemaj[5];
    char atypemin[5];

    // read every line of the pdb file
    int atomi = 0;
    ag->natoms = 100;	// just a guess, realloc as necessary
    ag->atoms =
        (struct atom *)_mol_malloc(sizeof(struct atom) * ag->natoms);
    while (getline(&line, &len, fp) != -1) {
        if (strncmp(line, "ATOM  ", 6) != 0)	// check for ATOM line
            continue;

        if (atomi + 1 > ag->natoms) {
            ag->natoms *= 2;
            ag->atoms =
                (struct atom *)_mol_realloc(ag->atoms,
                                            sizeof(struct atom) *
                                            ag->natoms);
        }

        /*
           // init bonds
           ag->atoms[atomi].bonds[0] = -1;
           ag->atoms[atomi].bonds[1] = -1;
           ag->atoms[atomi].bonds[2] = -1;
           ag->atoms[atomi].bonds[3] = -1;
         */

        // init sa
        ag->atoms[atomi].sa = -1;
        // init mask
        ag->atoms[atomi].mask = 0;
        // init attl
        ag->atoms[atomi].attl = 0.0;
        ag->atoms[atomi].nbondis = 0;
        ag->atoms[atomi].nbonds = 0;
        ag->atoms[atomi].nangs = 0;
        ag->atoms[atomi].ntors = 0;
        ag->atoms[atomi].nimps = 0;

        if (sscanf(line, "%*s %*d %4s %4s", atypemin, atypemaj) < 2) {
            fprintf(stderr,
                    "error: in file %s line %s: incorrect atom line\n",
                    path, line);
            exit(EXIT_FAILURE);
        }

        ag->atoms[atomi].atom_typen = atomid(prm, atypemaj, atypemin);
        if (ag->atoms[atomi].atom_typen == -1)	// val not found
        {
            if (atypemin[0] == 'H')	// try one more time for hydrogen
            {
                atypemin[1] = '\0';
                ag->atoms[atomi].atom_typen =
                    atomid(prm, atypemaj, atypemin);
            }
            if (ag->atoms[atomi].atom_typen == -1)	// val still not found
            {
                fprintf(stderr,
                        "error: in file %s line %s: atom type number of %s %s not defined in prm\n",
                        path, line, atypemaj, atypemin);
                exit(EXIT_FAILURE);
            }
        }

        if (!strcmp(atypemin, "C") || !strcmp(atypemin, "CA")
                || !strcmp(atypemin, "N") || !strcmp(atypemin, "O")
                || !strcmp(atypemin, "H"))
            ag->atoms[atomi].backbone = true;
        else
            ag->atoms[atomi].backbone = false;

        sscanf(&line[30], "%8lf%8lf%8lf",
               &ag->atoms[atomi].X, &ag->atoms[atomi].Y,
               &ag->atoms[atomi].Z);
        sscanf(&line[60], "%6lf", &ag->atoms[atomi].B);

        ag->atoms[atomi].icode = line[26];
        line[26] = 0;
        errno = 0;
        ag->atoms[atomi].res_seq = atoi(&line[22]);
        if (errno) {
            perror("atoi");
            exit(EXIT_FAILURE);
        }

        ag->atoms[atomi].base = ag->atoms[atomi].base2 = -1;

        atomi++;
    }
    if (line)
        free(line);
    myfclose(fp);

    // final realloc of the arrays to make them tight
    ag->natoms = atomi;
    ag->atoms =
        (struct atom *)_mol_realloc(ag->atoms,
                                    sizeof(struct atom) * ag->natoms);

    ag->is_psf_read = false;
    ag->prm = prm;

//      check_atomgrp (ag, prm);

    return ag;
}
예제 #9
0
struct atomgrp *read_pdb_nopar(const char *path)
{
    FILE *fp = myfopen(path, "r");

    struct atomgrp *ag =
        (struct atomgrp *)_mol_calloc(1, sizeof(struct atomgrp));

    char *line = NULL;
    size_t len = 0;

    // read every line of the pdb file
    int atomi = 0;
    ag->natoms = 100;	// just a guess, realloc as necessary
    ag->atoms =
        (struct atom *)_mol_malloc(sizeof(struct atom) * ag->natoms);
    while (getline(&line, &len, fp) != -1) {
        char *atom_name;
        if (strncmp(line, "ATOM  ", 6) != 0
                && strncmp(line, "HETATM", 6) != 0)
            continue;
        if (atomi + 1 > ag->natoms) {
            ag->natoms *= 2;
            ag->atoms =
                (struct atom *)_mol_realloc(ag->atoms,
                                            sizeof(struct atom) *
                                            ag->natoms);
        }
        // init bonds
        /*
                        ag->atoms[atomi].bonds[0] = -1;
                        ag->atoms[atomi].bonds[1] = -1;
                        ag->atoms[atomi].bonds[2] = -1;
                        ag->atoms[atomi].bonds[3] = -1;
        */

        // init sa
        ag->atoms[atomi].sa = -1;
        // init mask
//                ag->atoms[atomi].mask = 0;
        // init attl
//                ag->atoms[atomi].attl = 0.0;

        ag->atoms[atomi].atom_typen = 1;

        if (!strncmp(line + 13, "C ", 2)
                || !strncmp(line + 13, "CA ", 3)
                || !strncmp(line + 13, "N ", 2)
                || !strncmp(line + 13, "O ", 2)
                || !strncmp(line + 13, "H ", 2))
            ag->atoms[atomi].backbone = true;
        else
            ag->atoms[atomi].backbone = false;

        atom_name = _mol_calloc(5, sizeof(char));
        strncpy(atom_name, line + 12, 4);
        rstrip(atom_name);
        while (isspace(*atom_name)) {
            memmove(atom_name, atom_name + 1, 4);
        }
        ag->atoms[atomi].name = atom_name;

        sscanf(&line[30], "%8lf%8lf%8lf",
               &ag->atoms[atomi].X, &ag->atoms[atomi].Y,
               &ag->atoms[atomi].Z);
        sscanf(&line[60], "%6lf", &ag->atoms[atomi].B);

        ag->atoms[atomi].icode = line[26];
        line[26] = 0;
        errno = 0;
        ag->atoms[atomi].res_seq = atoi(&line[22]);
        if (errno) {
            perror("atoi");
            exit(EXIT_FAILURE);
        }

        ag->atoms[atomi].base = ag->atoms[atomi].base2 = -1;
        ag->atoms[atomi].element = NULL;

        atomi++;
    }
    if (line)
        free(line);
    myfclose(fp);

    // final realloc of the arrays to make them tight
    ag->natoms = atomi;
    ag->atoms =
        (struct atom *)_mol_realloc(ag->atoms,
                                    sizeof(struct atom) * ag->natoms);

    ag->is_psf_read = false;
    ag->prm = NULL;

    return ag;
}
struct atomgrp* read_ms (const char* path, struct prm* prm)
{
	FILE* fp = myfopen (path, "r");

	struct atomgrp* ag = (struct atomgrp*) _mol_calloc (1, sizeof (struct atomgrp));

	char* line = NULL;
	size_t len = 0;

	// tmp scanf vals
	char atypemaj[5];
	char atypemin[5];

	// read every line of the pdb file
	int atomi = 0;
	ag->natoms = 100; // just a guess, realloc as necessary
	ag->atoms = (struct atom*) _mol_malloc (sizeof (struct atom) * ag->natoms);
	while (getline (&line, &len, fp) != -1)
	{
		if (strncmp (line, "ATOM  ", 6) != 0) // check for ATOM line
			continue;

		if (atomi+1 > ag->natoms)
		{
			ag->natoms *= 2;
			ag->atoms = (struct atom*) _mol_realloc (ag->atoms, sizeof (struct atom) * ag->natoms);
		}

		/*
		// init bonds
		ag->atoms[atomi].bonds[0] = -1;
		ag->atoms[atomi].bonds[1] = -1;
		ag->atoms[atomi].bonds[2] = -1;
		ag->atoms[atomi].bonds[3] = -1;
		*/

		// init sa
		ag->atoms[atomi].sa = -1;
		// init mask
		ag->atoms[atomi].mask = 0;
		ag->atoms[atomi].nbondis = 0;
		ag->atoms[atomi].nbonds = 0;
		ag->atoms[atomi].nangs = 0;
		ag->atoms[atomi].ntors = 0;
		ag->atoms[atomi].nimps = 0;

		if (sscanf (line, "%*s %*d %4s %4s", atypemin, atypemaj) < 2)
		{
			fprintf (stderr, "begin error\n");
			fprintf (stderr, "in function read_ms\n");
			fprintf (stderr, "incorrect format for ATOM line\n");
			fprintf (stderr, "at file:\n");
			fprintf (stderr, "%s\n", path);
			fprintf (stderr, "at line:\n");
			fprintf (stderr, "%s\n", line);
			fprintf (stderr, "end error\n");
			exit (EXIT_FAILURE);
		}

		if (strncmp (atypemin, "HT", 2) == 0)
			continue; // ignore terminal hydrogens
		if (strncmp (atypemin, "OCT1", 4) == 0)
		{
			atypemin[1] = '\0';
		}
		if (strncmp (atypemin, "OCT2", 4) == 0)
			continue;


		ag->atoms[atomi].atom_typen = atomid (prm, atypemaj, atypemin);
		if (ag->atoms[atomi].atom_typen == -1) // val not found
		{
			if (atypemin[0] == 'H') // try one more time for hydrogen
			{
				atypemin[1] = '\0';
				ag->atoms[atomi].atom_typen = atomid (prm, atypemaj, atypemin);
			}
			if (ag->atoms[atomi].atom_typen == -1) // val still not found
			{
				fprintf (stderr, "error: in file %s line %s: atom type number of %s %s not defined in prm\n", path, line, atypemaj, atypemin);
				exit (EXIT_FAILURE);
			}
		}

		ag->atoms[atomi].X = atof (&line[30]);
		ag->atoms[atomi].Y = atof (&line[38]);
		ag->atoms[atomi].Z = atof (&line[46]);
		//if (line[57] != '0' && line[57] != '1') // verify that sa is 1 or 0
		if (! (line[57] >= '0' && line[57] <= '9')) // verify that sa is 1 or 0
		{
			fprintf (stderr, "error: file %s does not appear to be an ms file\n", path);
			exit (EXIT_FAILURE);
		}
		//ag->atoms[atomi].sa = atoi (&line[57]);
		ag->atoms[atomi].attl = atof (&line[57]);
		if (ag->atoms[atomi].attl > 0.0)
		{
			ag->atoms[atomi].sa = 1;
		}
		else
		{
			ag->atoms[atomi].sa = 0;
		}

		atomi++;
	}
	if (line)
		free (line);
	myfclose (fp);

	// final realloc of the arrays to make them tight
	ag->natoms = atomi;
	assert (ag->natoms > 0);
	ag->atoms = (struct atom*) _mol_realloc (ag->atoms, sizeof (struct atom) * ag->natoms);

	check_atomgrp (ag, prm);

	return ag;
}
struct atomgrp* read_ms_nopar (const char* path)
{
	FILE* fp = myfopen (path, "r");

	struct atomgrp* ag = (struct atomgrp*) _mol_calloc (1, sizeof (struct atomgrp));

	char* line = NULL;
	size_t len = 0;

	// read every line of the pdb file
	int atomi = 0;
	ag->natoms = 100; // just a guess, realloc as necessary
	ag->atoms = (struct atom*) _mol_malloc (sizeof (struct atom) * ag->natoms);
	while (getline (&line, &len, fp) != -1)
	{
		if (strncmp (line, "ATOM  ", 6) != 0) // check for ATOM line
			continue;

		if (atomi+1 > ag->natoms)
		{
			ag->natoms *= 2;
			ag->atoms = (struct atom*) _mol_realloc (ag->atoms, sizeof (struct atom) * ag->natoms);
		}

		/*
		// init bonds
		ag->atoms[atomi].bonds[0] = -1;
		ag->atoms[atomi].bonds[1] = -1;
		ag->atoms[atomi].bonds[2] = -1;
		ag->atoms[atomi].bonds[3] = -1;
		*/

		// init sa
		ag->atoms[atomi].sa = -1;
		// init mask
		ag->atoms[atomi].mask = 0;

        ag->atoms[atomi].atom_typen = 1;
		ag->atoms[atomi].X = atof (&line[30]);
		ag->atoms[atomi].Y = atof (&line[38]);
		ag->atoms[atomi].Z = atof (&line[46]);
		//if (line[57] != '0' && line[57] != '1') // verify that sa is 1 or 0
		if (! (line[57] >= '0' && line[57] <= '9')) // verify that sa is 1 or 0
		{
			fprintf (stderr, "error: file %s does not appear to be an ms file\n", path);
			exit (EXIT_FAILURE);
		}
		//ag->atoms[atomi].sa = atoi (&line[57]);
		ag->atoms[atomi].attl = atof (&line[57]);
		if (ag->atoms[atomi].attl > 0.0)
		{
			ag->atoms[atomi].sa = 1;
		}
		else
		{
			ag->atoms[atomi].sa = 0;
		}

		atomi++;
	}
	if (line)
		free (line);
	myfclose (fp);

	// final realloc of the arrays to make them tight
	ag->natoms = atomi;
	ag->atoms = (struct atom*) _mol_realloc (ag->atoms, sizeof (struct atom) * ag->natoms);

	return ag;
}
예제 #12
0
struct atomgrp* fullcopy_atomgrp (struct atomgrp* srcag)
{
	struct atomgrp* destag = (struct atomgrp*) _mol_calloc (1, sizeof (struct atomgrp));

	destag->natoms = srcag->natoms;
	destag->atoms = (struct atom*) _mol_malloc (sizeof (struct atom) * destag->natoms);
	memcpy(destag->atoms, srcag->atoms, sizeof(struct atom) * destag->natoms);


        //destag->nactives = srcag->nactives ;
        //destag->activelist = _mol_malloc(destag->nactives*sizeof(int));
        //for (i = 0; i < destag->nactives; i++)
        //{
        //     destag->activelist[i]=srcag->activelist[i];
        //}


        destag->nbonds=srcag->nbonds;
        destag->bonds= _mol_malloc (destag->nbonds*sizeof(struct atombond));
	memcpy(destag->bonds, srcag->bonds, sizeof(struct atombond) * destag->nbonds);


 	//destag->nbact=srcag->nbact;
        //destag->bact= _mol_malloc (destag->nbact*sizeof(struct atombond*));
        //for (i = 0; i < destag->nbact; i++)
        //{
        //     destag->bact[i]=srcag->bact[i];
        //}

	destag->nangs=srcag->nangs;
        destag->angs= _mol_malloc (destag->nangs*sizeof(struct atomangle));
	memcpy(destag->angs, srcag->angs, sizeof(struct atomangle) * destag->nangs);

	//destag->nangact=srcag->nangact;
        //destag->angact= _mol_malloc (destag->nangact*sizeof(struct atomangle*));
        //for (i = 0; i < destag->nangact; i++)
        //{
        //     destag->angact[i]=srcag->angact[i];
        //}

	destag->ntors=srcag->ntors;
        destag->tors= _mol_malloc (destag->ntors*sizeof(struct atomtorsion));
	memcpy(destag->tors, srcag->tors, sizeof(struct atomtorsion) * destag->ntors);

	//destag->ntoract=srcag->ntoract;
        //destag->toract= _mol_malloc (destag->ntoract*sizeof(struct atomtorsion*));
        //for (i = 0; i < destag->ntoract; i++)
        //{
        //     destag->toract[i]=srcag->toract[i];
        //}

        destag->nimps=srcag->nimps;
        destag->imps= _mol_malloc (destag->nimps*sizeof(struct atomimproper));
	memcpy(destag->imps, srcag->imps, sizeof(struct atomimproper) * destag->nimps);

	//destag->nimpact=srcag->nimpact;
        //destag->impact= _mol_malloc (destag->nimpact*sizeof(struct atomimproper*));
        //for (i = 0; i < destag->nimpact; i++)
        //{
        //     destag->impact[i]=srcag->impact[i];
        //}

	//point to correct atoms
	size_t atom_offset = destag->atoms - srcag->atoms;
	for (int i = 0; i < destag->nbonds; i++) {
		destag->bonds[i].a0 += atom_offset;
		destag->bonds[i].a1 += atom_offset;
	}
	for (int i = 0; i < destag->nangs; i++) {
		destag->angs[i].a0 += atom_offset;
		destag->angs[i].a1 += atom_offset;
		destag->angs[i].a2 += atom_offset;
	}
	for (int i = 0; i < destag->ntors; i++) {
		destag->tors[i].a0 += atom_offset;
		destag->tors[i].a1 += atom_offset;
		destag->tors[i].a2 += atom_offset;
		destag->tors[i].a3 += atom_offset;
	}
	for (int i = 0; i < destag->nimps; i++) {
		destag->imps[i].a0 += atom_offset;
		destag->imps[i].a1 += atom_offset;
		destag->imps[i].a2 += atom_offset;
		destag->imps[i].a3 += atom_offset;
	}

	//point to atoms to correct bonds, angs, tors, imps
	size_t bond_offset = destag->bonds - srcag->bonds;
	size_t ang_offset  = destag->angs  - srcag->angs;
	size_t imp_offset  = destag->imps  - srcag->imps;
	size_t tor_offset  = destag->tors  - srcag->tors;
	for (int i = 0; i < destag->natoms; i++) {
//		struct atom local_atom = destag->atoms[i];
		destag->atoms[i].name = strdup(srcag->atoms[i].name);

		destag->atoms[i].bonds = _mol_malloc( destag->atoms[i].nbonds*sizeof(struct atombond*));
		memcpy(destag->atoms[i].bonds, srcag->atoms[i].bonds, sizeof(struct atombond*) * destag->atoms[i].nbonds);
		for (int j = 0; j < destag->atoms[i].nbonds; j++) {
			destag->atoms[i].bonds[j] += bond_offset;
		}
		destag->atoms[i].angs = _mol_malloc( destag->atoms[i].nangs*sizeof(struct atomangle*));
		memcpy(destag->atoms[i].angs, srcag->atoms[i].angs, sizeof(struct atomangle*) * destag->atoms[i].nangs);
		for (int j = 0; j < destag->atoms[i].nangs; j++) {
			destag->atoms[i].angs[j] += ang_offset;
		}
		destag->atoms[i].tors = _mol_malloc( destag->atoms[i].ntors*sizeof(struct atomtorsion*));
		memcpy(destag->atoms[i].tors, srcag->atoms[i].tors, sizeof(struct atomtorsion*) * destag->atoms[i].ntors);
		for (int j = 0; j < destag->atoms[i].ntors; j++) {
			destag->atoms[i].tors[j] += tor_offset;
		}
		destag->atoms[i].imps = _mol_malloc( destag->atoms[i].nimps*sizeof(struct atomimproper*));
		memcpy(destag->atoms[i].imps, srcag->atoms[i].imps, sizeof(struct atomimproper*) * destag->atoms[i].nimps);
		for (int j = 0; j < destag->atoms[i].nimps; j++) {
			destag->atoms[i].imps[j] += imp_offset;
		}
	}

	//destag->nres=srcag->nres;
	//destag->iares=srcag->iares;
	//destag->idres=srcag->idres;
	//destag->is_psf_read=srcag->is_psf_read;


	return destag;
}
예제 #13
0
//Init ACE
void ace_ini(struct atomgrp *ag, struct acesetup *ac_s)
{
	const double minr = 0.6;
	int i, j, k;
	const double sqrtpi = sqrt(M_PI);
	const double c1 = 4.0 / (3.0 * M_PI);
	const double c2 = 77.0 * M_PI * M_SQRT2 / 512.0;
	const double c3 = 2.0 * M_PI * sqrtpi;
	const double pi2 = M_1_PI * M_1_PI;
	const double width = 1.2;
	double ri, ri2, rk, vk, rk2, alpha, alpha2, alpha4, prod2, prod4, ratio,
	    tik2, qik, qterm, temp, fik, omik, s2ik, s3ik, uik, omgik;
	int nbsize;
	ac_s->ntypes = ag->num_atom_types + 1;
	ac_s->rsolv = (double *)_mol_malloc(sizeof(double) * ac_s->ntypes);
	ac_s->vsolv = (double *)_mol_malloc(sizeof(double) * ac_s->ntypes);
	ac_s->lwace = (double *)_mol_malloc(sizeof(double) * ac_s->ntypes);
	ac_s->s2ace =
	    (double *)_mol_malloc(sizeof(double) * ac_s->ntypes * ac_s->ntypes);
	ac_s->uace =
	    (double *)_mol_malloc(sizeof(double) * ac_s->ntypes * ac_s->ntypes);
	ac_s->wace =
	    (double *)_mol_malloc(sizeof(double) * ac_s->ntypes * ac_s->ntypes);
	ac_s->hydr = (double *)_mol_malloc(sizeof(double) * ac_s->ntypes);
	for (i = 0; i < ac_s->ntypes; i++) {
		ac_s->vsolv[i] = -1.0;
		ac_s->rsolv[i] = 0.0;
	}
	for (i = 0; i < ag->natoms; i++) {
		if (ac_s->vsolv[ag->atoms[i].atom_ftypen] <= 0.0) {
			struct atombond bp;
			ac_s->vsolv[ag->atoms[i].atom_ftypen] =
			    ag->atoms[i].acevolume;
			ac_s->rsolv[ag->atoms[i].atom_ftypen] =
			    _mol_max(ag->atoms[i].rminh, minr);
			//Hydrogen correction
			if (strcmp("H", ag->atoms[i].ftype_name) == 0) {
				ac_s->rsolv[ag->atoms[i].atom_ftypen] =
				    _mol_max(0.85,
					     ac_s->rsolv[ag->atoms[i].
							 atom_ftypen]);
			} else if (strcmp("HC", ag->atoms[i].ftype_name) == 0) {
				ac_s->rsolv[ag->atoms[i].atom_ftypen] =
				    _mol_max(0.83,
					     ac_s->rsolv[ag->atoms[i].
							 atom_ftypen]);
			}
			//      printf(" %d %.3f \n",ag->atoms[i].atom_ftypen,ag->atoms[i].rminh);
			for (j = 0; j < ag->nbonds; j++) {
				bp = ag->bonds[j];
				if (bp.a0->atom_ftypen ==
				    ag->atoms[i].atom_ftypen) {
					ac_s->rsolv[ag->atoms[i].atom_ftypen] =
					    _mol_max(ac_s->
						     rsolv[ag->atoms[i].
							   atom_ftypen],
						     bp.a1->rminh - bp.l0);
				}
				if (ag->bonds[j].a1->atom_ftypen ==
				    ag->atoms[i].atom_ftypen) {
					ac_s->rsolv[ag->atoms[i].atom_ftypen] =
					    _mol_max(ac_s->
						     rsolv[ag->atoms[i].
							   atom_ftypen],
						     bp.a0->rminh - bp.l0);
				}
			}
		}
	}
	//Hydrogen correction
//      if (ac_s->rsolv[1]<0.85) ac_s->rsolv[1]=0.85; //H   ?
//      if (ac_s->rsolv[2]<0.83) ac_s->rsolv[2]=0.83; //HC  ?
	for (i = 0; i < ac_s->ntypes; i++) {
		if (ac_s->vsolv[i] >= 0.0) {
			//      printf ("%d %.3f %.3f\n",i,ac_s->vsolv[i],ac_s->rsolv[i]);
		}
	}
	for (i = 0; i < ac_s->ntypes; i++) {
		ac_s->hydr[i] =
		    -4 * M_PI * 0.003 * ac_s->rsolv[i] * (ac_s->rsolv[i] +
							  1.4) *
		    (ac_s->rsolv[i] + 1.4);
		ri = ac_s->rsolv[i];
		ri2 = ri * ri;
		if (ri > 0) {
			for (k = 0; k < ac_s->ntypes; k++) {
				rk = ac_s->rsolv[k];
				vk = ac_s->vsolv[k];
				if (rk > 0) {
					rk2 = rk * rk;
					alpha = _mol_max(width, ri / rk);
					alpha2 = alpha * alpha;
					alpha4 = alpha2 * alpha2;
					prod2 = alpha2 * rk2;
					prod4 = prod2 * prod2;
					ratio = alpha2 * rk2 / ri2;
					tik2 = 0.5 * M_PI * ratio;
					temp = 1.0 / (1.0 + 2.0 * tik2);
					fik = 2.0 / (1.0 + tik2) - temp;
					qik = tik2 * sqrt(temp);
					qterm = qik - atan(qik);
					if (k == i) {
						omik =
						    -((vk * pi2) -
						      c1 * (ri2 * ri)) * qterm /
						    (alpha4 * ri2 * ri2);
						ac_s->lwace[i] = omik;
					}
					if (vk > 1.0e-8) {
						omgik =
						    vk * qterm * pi2 / prod4;
						s2ik =
						    3.0 * qterm * prod2 /
						    ((3.0 + fik) * qik -
						     4.0 * atan(qik));
						s3ik = s2ik * sqrt(s2ik);
						uik =
						    c2 * ri / (1.0 -
							       (c3 * s3ik * ri *
								omgik / vk));
						ac_s->wace[i * ac_s->ntypes +
							   k] = omgik;
						ac_s->s2ace[i * ac_s->ntypes +
							    k] = s2ik;
						ac_s->uace[i * ac_s->ntypes +
							   k] = uik;
					} else {
						ac_s->wace[i * ac_s->ntypes +
							   k] = 0.0;
						ac_s->s2ace[i * ac_s->ntypes +
							    k] = 1.0e-6;
						ac_s->uace[i * ac_s->ntypes +
							   k] = 1.0e+6;
					}
				}
			}
		}
	}
	for (i = 0; i < ac_s->ntypes; i++) {
		if (ac_s->vsolv[i] >= 0.0) {
			for (k = 0; k < ac_s->ntypes; k++) {
				if (ac_s->vsolv[k] >= 0.0) {
					//      printf ("%d %d %.3f %.3f\n",i,k,ac_s->wace[i*ac_s->ntypes+k],ac_s->lwace[i]);
				}
			}
		}
	}
	ac_s->nbsize = 1;
	nbsize = 1;
	ac_s->eself = _mol_calloc(sizeof(double), ag->natoms);
	ac_s->rborn = _mol_calloc(sizeof(double), ag->natoms);
	ac_s->swarr = _mol_calloc(sizeof(double), nbsize);
	ac_s->dswarr = _mol_calloc(sizeof(double), nbsize);
	ac_s->darr = _mol_calloc(sizeof(double), nbsize);
	//d(rb)/d(eself)
	ac_s->dbrdes = _mol_calloc(sizeof(double), ag->natoms);
	ac_s->xsf = _mol_calloc(sizeof(double), 2 * nbsize);
	ac_s->ysf = _mol_calloc(sizeof(double), 2 * nbsize);
	ac_s->zsf = _mol_calloc(sizeof(double), 2 * nbsize);
	ac_s->xf = _mol_calloc(sizeof(double), ag->natoms);
	ac_s->yf = _mol_calloc(sizeof(double), ag->natoms);
	ac_s->zf = _mol_calloc(sizeof(double), ag->natoms);
	ac_s->diarr = _mol_calloc(sizeof(double), ag->natoms);
	ac_s->list0123 = _mol_calloc(sizeof(int), 1);
}
struct atomgrp* fullcopy_atomgrp (struct atomgrp* srcag)
{
	struct atomgrp* destag = (struct atomgrp*) _mol_calloc (1, sizeof (struct atomgrp));

	destag->natoms = srcag->natoms;
	destag->atoms = (struct atom*) _mol_malloc (sizeof (struct atom) * destag->natoms);
	int i;
	for (i = 0; i < destag->natoms; i++)
	{
		fullcopy_atom (&srcag->atoms[i], &destag->atoms[i]);
	}


        destag->nactives = srcag->nactives ;
        destag->activelist = _mol_malloc(destag->nactives*sizeof(int));
        for (i = 0; i < destag->nactives; i++)
        {
             destag->activelist[i]=srcag->activelist[i];
        }


        destag->nbonds=srcag->nbonds;
        destag->bonds= _mol_malloc (destag->nbonds*sizeof(struct atombond));
        for (i = 0; i < destag->nbonds; i++)
        {
             destag->bonds[i]=srcag->bonds[i];
        }


 	destag->nbact=srcag->nbact;
        destag->bact= _mol_malloc (destag->nbact*sizeof(struct atombond*));
        for (i = 0; i < destag->nbact; i++)
        {
             destag->bact[i]=srcag->bact[i];
        }

	destag->nangs=srcag->nangs;
        destag->angs= _mol_malloc (destag->nangs*sizeof(struct atomangle));
        for (i = 0; i < destag->nangs; i++)
        {
             destag->angs[i]=srcag->angs[i];
        }

	destag->nangact=srcag->nangact;
        destag->angact= _mol_malloc (destag->nangact*sizeof(struct atomangle*));
        for (i = 0; i < destag->nangact; i++)
        {
             destag->angact[i]=srcag->angact[i];
        }

	destag->ntors=srcag->ntors;
        destag->tors= _mol_malloc (destag->ntors*sizeof(struct atomtorsion));
        for (i = 0; i < destag->ntors; i++)
        {
             destag->tors[i]=srcag->tors[i];
        }

	destag->ntoract=srcag->ntoract;
        destag->toract= _mol_malloc (destag->ntoract*sizeof(struct atomtorsion*));
        for (i = 0; i < destag->ntoract; i++)
        {
             destag->toract[i]=srcag->toract[i];
        }

        destag->nimps=srcag->nimps;
        destag->imps= _mol_malloc (destag->nimps*sizeof(struct atomimproper));
        for (i = 0; i < destag->nimps; i++)
        {
             destag->imps[i]=srcag->imps[i];
        }

	destag->nimpact=srcag->nimpact;
        destag->impact= _mol_malloc (destag->nimpact*sizeof(struct atomimproper*));
        for (i = 0; i < destag->nimpact; i++)
        {
             destag->impact[i]=srcag->impact[i];
        }	

	destag->nres=srcag->nres;
	destag->iares=srcag->iares;
	destag->idres=srcag->idres;
	destag->is_psf_read=srcag->is_psf_read;


	return destag;
}
struct atomgrp *join_rec_lig_ff(struct atomgrp *rec, struct atomgrp *lig)
{
	int i;
	int j;
	struct atomgrp *ag =
	    (struct atomgrp *)_mol_calloc(1, sizeof(struct atomgrp));

	//sum counts
	ag->natoms = rec->natoms + lig->natoms;
	ag->nbonds = rec->nbonds + lig->nbonds;
	ag->nangs = rec->nangs + lig->nangs;
	ag->ntors = rec->ntors + lig->ntors;
	ag->nimps = rec->nimps + lig->nimps;
	ag->num_atom_types = rec->num_atom_types + lig->num_atom_types;
	//don't think we need actives yet
	//ag->nactives = rec->nactives + lig->nactives;
	//ag->nbact    = rec->nbact   + lig->nbact;
	//ag->nangact  = rec->nangact + lig->nangact;
	//ag->ntoract  = rec->ntoract + lig->ntoract;
	//ag->nimpact  = rec->nimpact + lig->nimpact;

	//allocate first level
	ag->atoms =
	    (struct atom *)_mol_malloc(sizeof(struct atom) * ag->natoms);
	ag->bonds =
	    (struct atombond *)_mol_malloc(sizeof(struct atombond) *
					   ag->nbonds);
	ag->angs =
	    (struct atomangle *)_mol_malloc(sizeof(struct atomangle) *
					    ag->nangs);
	ag->tors =
	    (struct atomtorsion *)_mol_malloc(sizeof(struct atomtorsion) *
					      ag->ntors);
	ag->imps =
	    (struct atomimproper *)_mol_malloc(sizeof(struct atomimproper) *
					       ag->nimps);

	//copy rec items
	memcpy(ag->atoms, rec->atoms, sizeof(struct atom) * rec->natoms);
	memcpy(ag->bonds, rec->bonds, sizeof(struct atombond) * rec->nbonds);
	memcpy(ag->angs, rec->angs, sizeof(struct atomangle) * rec->nangs);
	memcpy(ag->tors, rec->tors, sizeof(struct atomtorsion) * rec->ntors);
	memcpy(ag->imps, rec->imps, sizeof(struct atomimproper) * rec->nimps);

	//point to correct atoms
	for (i = 0; i < rec->nbonds; i++) {
		ptrdiff_t a0_offset = ag->bonds[i].a0 - rec->atoms;
		ptrdiff_t a1_offset = ag->bonds[i].a1 - rec->atoms;
		ag->bonds[i].a0 = ag->atoms + a0_offset;
		ag->bonds[i].a1 = ag->atoms + a1_offset;
	}
	for (i = 0; i < rec->nangs; i++) {
		ptrdiff_t a0_offset = ag->angs[i].a0 - rec->atoms;
		ptrdiff_t a1_offset = ag->angs[i].a1 - rec->atoms;
		ptrdiff_t a2_offset = ag->angs[i].a2 - rec->atoms;
		ag->angs[i].a0 = ag->atoms + a0_offset;
		ag->angs[i].a1 = ag->atoms + a1_offset;
		ag->angs[i].a2 = ag->atoms + a2_offset;
	}
	for (i = 0; i < rec->ntors; i++) {
		ptrdiff_t a0_offset = ag->tors[i].a0 - rec->atoms;
		ptrdiff_t a1_offset = ag->tors[i].a1 - rec->atoms;
		ptrdiff_t a2_offset = ag->tors[i].a2 - rec->atoms;
		ptrdiff_t a3_offset = ag->tors[i].a3 - rec->atoms;
		ag->tors[i].a0 = ag->atoms + a0_offset;
		ag->tors[i].a1 = ag->atoms + a1_offset;
		ag->tors[i].a2 = ag->atoms + a2_offset;
		ag->tors[i].a3 = ag->atoms + a3_offset;
	}
	for (i = 0; i < rec->nimps; i++) {
		ptrdiff_t a0_offset = ag->imps[i].a0 - rec->atoms;
		ptrdiff_t a1_offset = ag->imps[i].a1 - rec->atoms;
		ptrdiff_t a2_offset = ag->imps[i].a2 - rec->atoms;
		ptrdiff_t a3_offset = ag->imps[i].a3 - rec->atoms;
		ag->imps[i].a0 = ag->atoms + a0_offset;
		ag->imps[i].a1 = ag->atoms + a1_offset;
		ag->imps[i].a2 = ag->atoms + a2_offset;
		ag->imps[i].a3 = ag->atoms + a3_offset;
	}

	//point to atoms to correct bonds, angs, tors, imps
	for (i = 0; i < rec->natoms; i++) {
		ag->atoms[i].name = strdup(rec->atoms[i].name);
		if (rec->atoms[i].residue_name != NULL) {
			ag->atoms[i].residue_name = strdup(rec->atoms[i].residue_name);
		}
		ag->atoms[i].ftype_name = strdup(rec->atoms[i].ftype_name);

		ag->atoms[i].bonds =
		    _mol_malloc(rec->atoms[i].nbonds *
				sizeof(struct atombond *));
		memcpy(ag->atoms[i].bonds, rec->atoms[i].bonds,
		       sizeof(struct atombond *) * rec->atoms[i].nbonds);
		for (j = 0; j < ag->atoms[i].nbonds; j++) {
			ptrdiff_t bond_offset =
			    ag->atoms[i].bonds[j] - rec->bonds;
			ag->atoms[i].bonds[j] = ag->bonds + bond_offset;
		}
		ag->atoms[i].angs =
		    _mol_malloc(rec->atoms[i].nangs *
				sizeof(struct atomangle *));
		memcpy(ag->atoms[i].angs, rec->atoms[i].angs,
		       sizeof(struct atomangle *) * rec->atoms[i].nangs);
		for (j = 0; j < ag->atoms[i].nangs; j++) {
			ptrdiff_t ang_offset = ag->atoms[i].angs[j] - rec->angs;
			ag->atoms[i].angs[j] = ag->angs + ang_offset;
		}
		ag->atoms[i].tors =
		    _mol_malloc(rec->atoms[i].ntors *
				sizeof(struct atomtorsion *));
		memcpy(ag->atoms[i].tors, rec->atoms[i].tors,
		       sizeof(struct atomtorsion *) * rec->atoms[i].ntors);
		for (j = 0; j < ag->atoms[i].ntors; j++) {
			ptrdiff_t tor_offset = ag->atoms[i].tors[j] - rec->tors;
			ag->atoms[i].tors[j] = ag->tors + tor_offset;
		}
		ag->atoms[i].imps =
		    _mol_malloc(rec->atoms[i].nimps *
				sizeof(struct atomimproper *));
		memcpy(ag->atoms[i].imps, rec->atoms[i].imps,
		       sizeof(struct atomimproper *) * rec->atoms[i].nimps);
		for (j = 0; j < ag->atoms[i].nimps; j++) {
			ptrdiff_t imp_offset = ag->atoms[i].imps[j] - rec->imps;
			ag->atoms[i].imps[j] = ag->imps + imp_offset;
		}
	}

	//copy lig items
	memcpy(ag->atoms + rec->natoms, lig->atoms,
	       sizeof(struct atom) * lig->natoms);
	memcpy(ag->bonds + rec->nbonds, lig->bonds,
	       sizeof(struct atombond) * lig->nbonds);
	memcpy(ag->angs + rec->nangs, lig->angs,
	       sizeof(struct atomangle) * lig->nangs);
	memcpy(ag->tors + rec->ntors, lig->tors,
	       sizeof(struct atomtorsion) * lig->ntors);
	memcpy(ag->imps + rec->nimps, lig->imps,
	       sizeof(struct atomimproper) * lig->nimps);

	//point to correct atoms
	struct atom *newlig_atoms = ag->atoms + rec->natoms;
	for (i = rec->nbonds; i < ag->nbonds; i++) {
		ptrdiff_t a0_offset = ag->bonds[i].a0 - lig->atoms;
		ptrdiff_t a1_offset = ag->bonds[i].a1 - lig->atoms;
		ag->bonds[i].a0 = newlig_atoms + a0_offset;
		ag->bonds[i].a1 = newlig_atoms + a1_offset;
		ag->bonds[i].ai += rec->natoms;
		ag->bonds[i].aj += rec->natoms;
	}
	for (i = rec->nangs; i < ag->nangs; i++) {
		ptrdiff_t a0_offset = ag->angs[i].a0 - lig->atoms;
		ptrdiff_t a1_offset = ag->angs[i].a1 - lig->atoms;
		ptrdiff_t a2_offset = ag->angs[i].a2 - lig->atoms;
		ag->angs[i].a0 = newlig_atoms + a0_offset;
		ag->angs[i].a1 = newlig_atoms + a1_offset;
		ag->angs[i].a2 = newlig_atoms + a2_offset;
	}
	for (i = rec->ntors; i < ag->ntors; i++) {
		ptrdiff_t a0_offset = ag->tors[i].a0 - lig->atoms;
		ptrdiff_t a1_offset = ag->tors[i].a1 - lig->atoms;
		ptrdiff_t a2_offset = ag->tors[i].a2 - lig->atoms;
		ptrdiff_t a3_offset = ag->tors[i].a3 - lig->atoms;
		ag->tors[i].a0 = newlig_atoms + a0_offset;
		ag->tors[i].a1 = newlig_atoms + a1_offset;
		ag->tors[i].a2 = newlig_atoms + a2_offset;
		ag->tors[i].a3 = newlig_atoms + a3_offset;
	}
	for (i = rec->nimps; i < ag->nimps; i++) {
		ptrdiff_t a0_offset = ag->imps[i].a0 - lig->atoms;
		ptrdiff_t a1_offset = ag->imps[i].a1 - lig->atoms;
		ptrdiff_t a2_offset = ag->imps[i].a2 - lig->atoms;
		ptrdiff_t a3_offset = ag->imps[i].a3 - lig->atoms;
		ag->imps[i].a0 = newlig_atoms + a0_offset;
		ag->imps[i].a1 = newlig_atoms + a1_offset;
		ag->imps[i].a2 = newlig_atoms + a2_offset;
		ag->imps[i].a3 = newlig_atoms + a3_offset;
	}

	int max_rec_res_seq = rec->atoms[rec->natoms-1].comb_res_seq;

	//point to atoms to correct bonds, angs, tors, imps
	struct atombond *newlig_bonds = ag->bonds + rec->nbonds;
	struct atomangle *newlig_angs = ag->angs + rec->nangs;
	struct atomtorsion *newlig_tors = ag->tors + rec->ntors;
	struct atomimproper *newlig_imps = ag->imps + rec->nimps;
	for (i = rec->natoms; i < ag->natoms; i++) {
//              struct atom local_atom = ag->atoms[i];
		ag->atoms[i].comb_res_seq += 100 + max_rec_res_seq;
		ag->atoms[i].atom_ftypen += rec->num_atom_types;
		ag->atoms[i].name = strdup(lig->atoms[i - (rec->natoms)].name);
		if (lig->atoms[i - (rec->natoms)].residue_name != NULL) {
			ag->atoms[i].residue_name =
			    strdup(lig->atoms[i - (rec->natoms)].residue_name);
		}
		ag->atoms[i].ftype_name =
		    strdup(lig->atoms[i - (rec->natoms)].ftype_name);

		ag->atoms[i].bonds =
		    _mol_malloc(lig->atoms[i - (rec->natoms)].nbonds *
				sizeof(struct atombond *));
		memcpy(ag->atoms[i].bonds, lig->atoms[i - (rec->natoms)].bonds,
		       sizeof(struct atombond *) * lig->atoms[i -
							      (rec->natoms)].
		       nbonds);
		for (j = 0; j < ag->atoms[i].nbonds; j++) {
			ptrdiff_t bond_offset =
			    ag->atoms[i].bonds[j] - lig->bonds;
			ag->atoms[i].bonds[j] = newlig_bonds + bond_offset;
		}
		ag->atoms[i].angs =
		    _mol_malloc(lig->atoms[i - (rec->natoms)].nangs *
				sizeof(struct atomangle *));
		memcpy(ag->atoms[i].angs, lig->atoms[i - (rec->natoms)].angs,
		       sizeof(struct atomangle *) * lig->atoms[i -
							       (rec->natoms)].
		       nangs);
		for (j = 0; j < ag->atoms[i].nangs; j++) {
			ptrdiff_t ang_offset = ag->atoms[i].angs[j] - lig->angs;
			ag->atoms[i].angs[j] = newlig_angs + ang_offset;
		}
		ag->atoms[i].tors =
		    _mol_malloc(lig->atoms[i - (rec->natoms)].ntors *
				sizeof(struct atomtorsion *));
		memcpy(ag->atoms[i].tors, lig->atoms[i - (rec->natoms)].tors,
		       sizeof(struct atomtorsion *) * lig->atoms[i -
								 (rec->natoms)].
		       ntors);
		for (j = 0; j < ag->atoms[i].ntors; j++) {
			ptrdiff_t tor_offset = ag->atoms[i].tors[j] - lig->tors;
			ag->atoms[i].tors[j] = newlig_tors + tor_offset;
		}
		ag->atoms[i].imps =
		    _mol_malloc(lig->atoms[i - (rec->natoms)].nimps *
				sizeof(struct atomimproper *));
		memcpy(ag->atoms[i].imps, lig->atoms[i - (rec->natoms)].imps,
		       sizeof(struct atomimproper *) * lig->atoms[i -
								  (rec->
								   natoms)].
		       nimps);
		for (j = 0; j < ag->atoms[i].nimps; j++) {
			ptrdiff_t imp_offset = ag->atoms[i].imps[j] - lig->imps;
			ag->atoms[i].imps[j] = newlig_imps + imp_offset;
		}
	}

	//copy into ryan's structure
//      _mol_atom_group_copy_from_deprecated(ag);

	fill_ingrp(ag);

	return ag;
}
예제 #16
0
struct atomgrp* join_rec_lig_ff(struct atomgrp* rec, struct atomgrp* lig)
{
	struct atomgrp* ag = (struct atomgrp*) _mol_calloc (1, sizeof (struct atomgrp));

	//sum counts
	ag->natoms   = rec->natoms  + lig->natoms;
	ag->nbonds   = rec->nbonds  + lig->nbonds;
	ag->nangs    = rec->nangs   + lig->nangs;
	ag->ntors    = rec->ntors   + lig->ntors;
	ag->nimps    = rec->nimps   + lig->nimps;
	//don't think we need actives yet
	//ag->nactives = rec->nactives + lig->nactives;
	//ag->nbact    = rec->nbact   + lig->nbact;
	//ag->nangact  = rec->nangact + lig->nangact;
	//ag->ntoract  = rec->ntoract + lig->ntoract;
	//ag->nimpact  = rec->nimpact + lig->nimpact;

	//allocate first level
	ag->atoms = (struct atom*) _mol_malloc (sizeof (struct atom) * ag->natoms);
	ag->bonds = (struct atombond*) _mol_malloc (sizeof (struct atombond) * ag->nbonds);
	ag->angs = (struct atomangle*) _mol_malloc (sizeof (struct atomangle) * ag->nangs);
	ag->tors = (struct atomtorsion*) _mol_malloc (sizeof (struct atomtorsion) * ag->ntors);
	ag->imps = (struct atomimproper*) _mol_malloc (sizeof (struct atomimproper) * ag->nimps);

	//copy rec items
	memcpy(ag->atoms, rec->atoms, sizeof(struct atom) * rec->natoms);
	memcpy(ag->bonds, rec->bonds, sizeof(struct atombond) * rec->nbonds);
	memcpy(ag->angs, rec->angs, sizeof(struct atomangle) * rec->nangs);
	memcpy(ag->tors, rec->tors, sizeof(struct atomtorsion) * rec->ntors);
	memcpy(ag->imps, rec->imps, sizeof(struct atomimproper) * rec->nimps);

	//point to correct atoms
	size_t atom_offset = ag->atoms - rec->atoms;
	for (int i = 0; i < rec->nbonds; i++) {
		ag->bonds[i].a0 += atom_offset;
		ag->bonds[i].a1 += atom_offset;
	}
	for (int i = 0; i < rec->nangs; i++) {
		ag->angs[i].a0 += atom_offset;
		ag->angs[i].a1 += atom_offset;
		ag->angs[i].a2 += atom_offset;
	}
	for (int i = 0; i < rec->ntors; i++) {
		ag->tors[i].a0 += atom_offset;
		ag->tors[i].a1 += atom_offset;
		ag->tors[i].a2 += atom_offset;
		ag->tors[i].a3 += atom_offset;
	}
	for (int i = 0; i < rec->nimps; i++) {
		ag->imps[i].a0 += atom_offset;
		ag->imps[i].a1 += atom_offset;
		ag->imps[i].a2 += atom_offset;
		ag->imps[i].a3 += atom_offset;
	}

	//point to atoms to correct bonds, angs, tors, imps
	size_t bond_offset = ag->bonds - rec->bonds;
	size_t ang_offset  = ag->angs  - rec->angs;
	size_t imp_offset  = ag->imps  - rec->imps;
	size_t tor_offset  = ag->tors  - rec->tors;
	for (int i = 0; i < rec->natoms; i++) {
//		struct atom local_atom = ag->atoms[i];
		ag->atoms[i].name = strdup(rec->atoms[i].name);

		ag->atoms[i].bonds = _mol_malloc( rec->atoms[i].nbonds*sizeof(struct atombond*));
		memcpy(ag->atoms[i].bonds, rec->atoms[i].bonds, sizeof(struct atombond*) * rec->atoms[i].nbonds);
		for (int j = 0; j < ag->atoms[i].nbonds; j++) {
			ag->atoms[i].bonds[j] += bond_offset;
		}
		ag->atoms[i].angs = _mol_malloc( rec->atoms[i].nangs*sizeof(struct atomangle*));
		memcpy(ag->atoms[i].angs, rec->atoms[i].angs, sizeof(struct atomangle*) * rec->atoms[i].nangs);
		for (int j = 0; j < ag->atoms[i].nangs; j++) {
			ag->atoms[i].angs[j] += ang_offset;
		}
		ag->atoms[i].tors = _mol_malloc( rec->atoms[i].ntors*sizeof(struct atomtorsion*));
		memcpy(ag->atoms[i].tors, rec->atoms[i].tors, sizeof(struct atomtorsion*) * rec->atoms[i].ntors);
		for (int j = 0; j < ag->atoms[i].ntors; j++) {
			ag->atoms[i].tors[j] += tor_offset;
		}
		ag->atoms[i].imps = _mol_malloc( rec->atoms[i].nimps*sizeof(struct atomimproper*));
		memcpy(ag->atoms[i].imps, rec->atoms[i].imps, sizeof(struct atomimproper*) * rec->atoms[i].nimps);
		for (int j = 0; j < ag->atoms[i].nimps; j++) {
			ag->atoms[i].imps[j] += imp_offset;
		}
	}


	//copy lig items
	memcpy(ag->atoms + rec->natoms, lig->atoms, sizeof(struct atom) * lig->natoms);
	memcpy(ag->bonds + rec->nbonds, lig->bonds, sizeof(struct atombond) * lig->nbonds);
	memcpy(ag->angs + rec->nangs, lig->angs, sizeof(struct atomangle) * lig->nangs);
	memcpy(ag->tors + rec->ntors, lig->tors, sizeof(struct atomtorsion) * lig->ntors);
	memcpy(ag->imps + rec->nimps, lig->imps, sizeof(struct atomimproper) * lig->nimps);

	//point to correct atoms
	atom_offset = ag->atoms - lig->atoms + rec->natoms;
	for (int i = rec->nbonds; i < ag->nbonds; i++) {
		ag->bonds[i].a0 += atom_offset;
		ag->bonds[i].a1 += atom_offset;
	}
	for (int i = rec->nangs; i < ag->nangs; i++) {
		ag->angs[i].a0 += atom_offset;
		ag->angs[i].a1 += atom_offset;
		ag->angs[i].a2 += atom_offset;
	}
	for (int i = rec->ntors; i < ag->ntors; i++) {
		ag->tors[i].a0 += atom_offset;
		ag->tors[i].a1 += atom_offset;
		ag->tors[i].a2 += atom_offset;
		ag->tors[i].a3 += atom_offset;
	}
	for (int i = rec->nimps; i < ag->nimps; i++) {
		ag->imps[i].a0 += atom_offset;
		ag->imps[i].a1 += atom_offset;
		ag->imps[i].a2 += atom_offset;
		ag->imps[i].a3 += atom_offset;
	}

	//point to atoms to correct bonds, angs, tors, imps
	bond_offset = ag->bonds - lig->bonds + rec->nbonds;
	ang_offset  = ag->angs  - lig->angs + rec->nangs;
	imp_offset  = ag->imps  - lig->imps + rec->nimps;
	tor_offset  = ag->tors  - lig->tors + rec->ntors;
	for (int i = rec->natoms; i < ag->natoms; i++) {
//		struct atom local_atom = ag->atoms[i];
		ag->atoms[i].name = strdup(lig->atoms[i-(rec->natoms)].name);

		ag->atoms[i].bonds = _mol_malloc( lig->atoms[i-(rec->natoms)].nbonds*sizeof(struct atombond*));
		memcpy(ag->atoms[i].bonds, lig->atoms[i-(rec->natoms)].bonds, sizeof(struct atombond*) * lig->atoms[i-(rec->natoms)].nbonds);
		for (int j = 0; j < ag->atoms[i].nbonds; j++) {
			ag->atoms[i].bonds[j] += bond_offset;
		}
		ag->atoms[i].angs = _mol_malloc( lig->atoms[i-(rec->natoms)].nangs*sizeof(struct atomangle*));
		memcpy(ag->atoms[i].angs, lig->atoms[i-(rec->natoms)].angs, sizeof(struct atomangle*) * lig->atoms[i-(rec->natoms)].nangs);
		for (int j = 0; j < ag->atoms[i].nangs; j++) {
			ag->atoms[i].angs[j] += ang_offset;
		}
		ag->atoms[i].tors = _mol_malloc( lig->atoms[i-(rec->natoms)].ntors*sizeof(struct atomtorsion*));
		memcpy(ag->atoms[i].tors, lig->atoms[i-(rec->natoms)].tors, sizeof(struct atomtorsion*) * lig->atoms[i-(rec->natoms)].ntors);
		for (int j = 0; j < ag->atoms[i].ntors; j++) {
			ag->atoms[i].tors[j] += tor_offset;
		}
		ag->atoms[i].imps = _mol_malloc( lig->atoms[i-(rec->natoms)].nimps*sizeof(struct atomimproper*));
		memcpy(ag->atoms[i].imps, lig->atoms[i-(rec->natoms)].imps, sizeof(struct atomimproper*) * lig->atoms[i-(rec->natoms)].nimps);
		for (int j = 0; j < ag->atoms[i].nimps; j++) {
			ag->atoms[i].imps[j] += imp_offset;
		}
	}

	//copy into ryan's structure
//	_mol_atom_group_copy_from_deprecated(ag);
	
	return ag;
}
struct atomgrp *fullcopy_atomgrp(struct atomgrp *srcag)
{
	int i;
	int j;
	struct atomgrp *destag =
	    (struct atomgrp *)_mol_calloc(1, sizeof(struct atomgrp));

	destag->natoms = srcag->natoms;
	destag->num_atom_types = srcag->num_atom_types;
	destag->atoms =
	    (struct atom *)_mol_malloc(sizeof(struct atom) * destag->natoms);
	memcpy(destag->atoms, srcag->atoms,
	       sizeof(struct atom) * destag->natoms);

	//destag->nactives = srcag->nactives ;
	//destag->activelist = _mol_malloc(destag->nactives*sizeof(int));
	//for (i = 0; i < destag->nactives; i++)
	//{
	//     destag->activelist[i]=srcag->activelist[i];
	//}

	destag->nbonds = srcag->nbonds;
	if (srcag->nbonds > 0) {
		destag->bonds =
		    _mol_malloc(destag->nbonds * sizeof(struct atombond));
		memcpy(destag->bonds, srcag->bonds,
		       sizeof(struct atombond) * destag->nbonds);
	}

	//destag->nbact=srcag->nbact;
	//destag->bact= _mol_malloc (destag->nbact*sizeof(struct atombond*));
	//for (i = 0; i < destag->nbact; i++)
	//{
	//     destag->bact[i]=srcag->bact[i];
	//}

	destag->nangs = srcag->nangs;
	if (srcag->nangs > 0) {
		destag->angs =
		    _mol_malloc(destag->nangs * sizeof(struct atomangle));
		memcpy(destag->angs, srcag->angs,
		       sizeof(struct atomangle) * destag->nangs);
	}
	//destag->nangact=srcag->nangact;
	//destag->angact= _mol_malloc (destag->nangact*sizeof(struct atomangle*));
	//for (i = 0; i < destag->nangact; i++)
	//{
	//     destag->angact[i]=srcag->angact[i];
	//}

	destag->ntors = srcag->ntors;
	if (srcag->ntors > 0) {
		destag->tors =
		    _mol_malloc(destag->ntors * sizeof(struct atomtorsion));
		memcpy(destag->tors, srcag->tors,
		       sizeof(struct atomtorsion) * destag->ntors);
	}
	//destag->ntoract=srcag->ntoract;
	//destag->toract= _mol_malloc (destag->ntoract*sizeof(struct atomtorsion*));
	//for (i = 0; i < destag->ntoract; i++)
	//{
	//     destag->toract[i]=srcag->toract[i];
	//}

	destag->nimps = srcag->nimps;
	if (srcag->nimps > 0) {
		destag->imps =
		    _mol_malloc(destag->nimps * sizeof(struct atomimproper));
		memcpy(destag->imps, srcag->imps,
		       sizeof(struct atomimproper) * destag->nimps);
	}
	//destag->nimpact=srcag->nimpact;
	//destag->impact= _mol_malloc (destag->nimpact*sizeof(struct atomimproper*));
	//for (i = 0; i < destag->nimpact; i++)
	//{
	//     destag->impact[i]=srcag->impact[i];
	//}

	//point to correct atoms
	for (i = 0; i < destag->nbonds; i++) {
		ptrdiff_t a0_offset = destag->bonds[i].a0 - srcag->atoms;
		ptrdiff_t a1_offset = destag->bonds[i].a1 - srcag->atoms;
		destag->bonds[i].a0 = destag->atoms + a0_offset;
		destag->bonds[i].a1 = destag->atoms + a1_offset;
	}
	for (i = 0; i < destag->nangs; i++) {
		ptrdiff_t a0_offset = destag->angs[i].a0 - srcag->atoms;
		ptrdiff_t a1_offset = destag->angs[i].a1 - srcag->atoms;
		ptrdiff_t a2_offset = destag->angs[i].a2 - srcag->atoms;
		destag->angs[i].a0 = destag->atoms + a0_offset;
		destag->angs[i].a1 = destag->atoms + a1_offset;
		destag->angs[i].a2 = destag->atoms + a2_offset;
	}
	for (i = 0; i < destag->ntors; i++) {
		ptrdiff_t a0_offset = destag->tors[i].a0 - srcag->atoms;
		ptrdiff_t a1_offset = destag->tors[i].a1 - srcag->atoms;
		ptrdiff_t a2_offset = destag->tors[i].a2 - srcag->atoms;
		ptrdiff_t a3_offset = destag->tors[i].a3 - srcag->atoms;
		destag->tors[i].a0 = destag->atoms + a0_offset;
		destag->tors[i].a1 = destag->atoms + a1_offset;
		destag->tors[i].a2 = destag->atoms + a2_offset;
		destag->tors[i].a3 = destag->atoms + a3_offset;
	}
	for (i = 0; i < destag->nimps; i++) {
		ptrdiff_t a0_offset = destag->imps[i].a0 - srcag->atoms;
		ptrdiff_t a1_offset = destag->imps[i].a1 - srcag->atoms;
		ptrdiff_t a2_offset = destag->imps[i].a2 - srcag->atoms;
		ptrdiff_t a3_offset = destag->imps[i].a3 - srcag->atoms;
		destag->imps[i].a0 = destag->atoms + a0_offset;
		destag->imps[i].a1 = destag->atoms + a1_offset;
		destag->imps[i].a2 = destag->atoms + a2_offset;
		destag->imps[i].a3 = destag->atoms + a3_offset;
	}

	//point to atoms to correct bonds, angs, tors, imps
	for (i = 0; i < destag->natoms; i++) {
//              struct atom local_atom = destag->atoms[i];
		destag->atoms[i].name = strdup(srcag->atoms[i].name);
		if (srcag->atoms[i].residue_name != NULL) {
			destag->atoms[i].residue_name =
			    strdup(srcag->atoms[i].residue_name);
		}
		destag->atoms[i].ftype_name =
		    strdup(srcag->atoms[i].ftype_name);

		if (srcag->nbonds > 0) {
			destag->atoms[i].bonds =
			    _mol_malloc(destag->atoms[i].nbonds *
					sizeof(struct atombond *));
			memcpy(destag->atoms[i].bonds, srcag->atoms[i].bonds,
			       sizeof(struct atombond *) *
			       destag->atoms[i].nbonds);
			for (j = 0; j < destag->atoms[i].nbonds; j++) {
				ptrdiff_t bond_offset =
				    destag->atoms[i].bonds[j] - srcag->bonds;
				destag->atoms[i].bonds[j] =
				    destag->bonds + bond_offset;
			}
		}
		if (srcag->nangs > 0) {
			destag->atoms[i].angs =
			    _mol_malloc(destag->atoms[i].nangs *
					sizeof(struct atomangle *));
			memcpy(destag->atoms[i].angs, srcag->atoms[i].angs,
			       sizeof(struct atomangle *) *
			       destag->atoms[i].nangs);
			for (j = 0; j < destag->atoms[i].nangs; j++) {
				ptrdiff_t ang_offset =
				    destag->atoms[i].angs[j] - srcag->angs;
				destag->atoms[i].angs[j] =
				    destag->angs + ang_offset;
			}
		}
		if (srcag->ntors > 0) {
			destag->atoms[i].tors =
			    _mol_malloc(destag->atoms[i].ntors *
					sizeof(struct atomtorsion *));
			memcpy(destag->atoms[i].tors, srcag->atoms[i].tors,
			       sizeof(struct atomtorsion *) *
			       destag->atoms[i].ntors);
			for (j = 0; j < destag->atoms[i].ntors; j++) {
				ptrdiff_t tor_offset =
				    destag->atoms[i].tors[j] - srcag->tors;
				destag->atoms[i].tors[j] =
				    destag->tors + tor_offset;
			}
		}
		if (srcag->nimps > 0) {
			destag->atoms[i].imps =
			    _mol_malloc(destag->atoms[i].nimps *
					sizeof(struct atomimproper *));
			memcpy(destag->atoms[i].imps, srcag->atoms[i].imps,
			       sizeof(struct atomimproper *) *
			       destag->atoms[i].nimps);
			for (j = 0; j < destag->atoms[i].nimps; j++) {
				ptrdiff_t imp_offset =
				    destag->atoms[i].imps[j] - srcag->imps;
				destag->atoms[i].imps[j] =
				    destag->imps + imp_offset;
			}
		}
	}

	//destag->nres=srcag->nres;
	//destag->iares=srcag->iares;
	//destag->idres=srcag->idres;
	//destag->is_psf_read=srcag->is_psf_read;

	return destag;
}