String read(int id, Point3f position) {
		if (id < 0 || id >= moleculeMap.size())
			return null;
		if (reader == null)
			reader = new MoleculeReader(model);
		int n0 = model.getAtomCount();
		reader.read(getClass().getResource("resources/" + moleculeMap.get(moleculeMap.keySet().toArray()[id])));
		int n1 = model.getAtomCount();
		if (center == null) {
			center = new Point3f();
		}
		else {
			center.set(0, 0, 0);
		}
		for (int i = n0; i < n1; i++) {
			center.x += model.atom[i].rx;
			center.y += model.atom[i].ry;
			center.z += model.atom[i].rz;
		}
		float inv = 1.0f / (n1 - n0);
		center.x = position.x - center.x * inv;
		center.y = position.y - center.y * inv;
		center.z = position.z - center.z * inv;
		boolean overlap = false;
		getout: for (int i = n0; i < n1; i++) {
			model.atom[i].rx += center.x;
			model.atom[i].ry += center.y;
			model.atom[i].rz += center.z;
			for (int j = 0; j < n0; j++) {
				if (model.atom[i].isTooClose(model.atom[j])) {
					overlap = true;
					break getout;
				}
			}
		}
		if (overlap) {
			BitSet bs = new BitSet(n1);
			bs.set(n0, n1);
			model.removeAtoms(bs);
			return null;
		}
		return reader.getDescription();
	}