int main () { PDBFile pdb ("temp.pdb"); Molecule * mol = pdb.Molecules(0); mol->Name("qtz"); std::vector<Atom *> atoms = mol->Atoms(); /* cycle through each atom in order of the pdb file */ RUN (atoms) { Atom * atom = atoms[i]; atom->Residue("qtz"); VecR pos = atom->Position(); /* find the surface Oxygens */ if (atom->Name().find("O") != string::npos && pos[z] > -7.9) { /* add H's to the surface */ Atom * h = new Atom ("H", pos + VecR (0.0, 0.0, 1.1)); mol->AddAtom(h); } } std::vector<Molecule *> mols; mols.push_back(mol); PDBFile::WritePDB(mols); }
/* Take a set of molecules and return a single molecule with all the atoms */ Molecule * MakeSingleMolecule (Mol_ptr_vec& mols) { Molecule * mol = new Molecule(); for (Mol_it mols_i = mols.begin(); mols_i != mols.end(); mols_i++) { for (Atom_it atom_i = (*mols_i)->begin(); atom_i != (*mols_i)->end(); atom_i++) { mol->AddAtom((*atom_i)); } } return mol; }
// Makes a repeating slab out of a single unit cell by creating copies and shifting Mol_ptr_vec UnitCellToSlab (GridParams& params) { std::vector<Molecule *> mols; Molecule * uc = params.unitCell; VecR yshift, xshift, zshift; yshift.Zero(); for (int i = 0; i < params.y; i++) { zshift.Zero(); for (int j = 0; j < params.x; j++) { xshift.Zero(); if (!(j % 2)) xshift += params.x_shift * 0.5; for (int k = 0; k < params.z; k++) { // make a copy of the unitcell Molecule * copy = new Molecule(); copy->Name(params.name); // make copies of all the atoms in the unitcell for (Atom_it atom_i = uc->begin(); atom_i != uc->end(); atom_i++) { //for (int atom = 0; atom < uc->size(); atom++) { Atom * pa = new Atom (*(*atom_i)); copy->AddAtom(pa); } // shift the new copy to the next lattice point copy->Shift(yshift + xshift + zshift); mols.push_back(copy); xshift += params.x_shift; } zshift += params.z_shift; } yshift += params.y_shift; } return mols; }
// Makes a repeating slab out of a single unit cell by creating copies and shifting Mol_ptr_vec UnitCellToSlab (Molecule * uc, VecR& x_shift,VecR& y_shift, VecR& z_shift) { std::vector<Molecule *> mols; VecR yshift, xshift, zshift; for (int i = 0; i < 1; i++) { zshift.Zero(); yshift.Zero(); for (int j = 0; j < 6; j++) { xshift.Zero(); for (int k = 0; k < 6; k++) { // make a copy of the unitcell Molecule * copy = new Molecule(); copy->Name("qtz"); // make copies of all the atoms in the unitcell for (int atom = 0; atom < uc->size(); atom++) { Atom * pa = new Atom (*uc->Atoms(atom)); copy->AddAtom(pa); } // shift the new copy to the next lattice point copy->Shift(yshift + xshift + zshift); mols.push_back(copy); xshift += x_shift; } yshift += y_shift; } zshift += z_shift; } return mols; }