docs: def _add_1(self,  hydrogen_name,  heavy_atom,  bonds):
          """
          Adds the missing proton to single protonated heavy_atoms.
          """
          
          residue = heavy_atom.parent
          ffld = self.ffld[self.selection[residue]]
          bnd_len = self.bondfield.length
          anchor = bonds[0]
                  
          # If not linear
          if self.bondfield.nonlinear.has_key(ffld[(  residue.resname,  
                                                      heavy_atom.name)]['type']):
              # returns tuple of two atoms
              bonded = self._find_secondary_anchors(residue,  heavy_atom,  anchor)
  
              if bonded:
                  # Phenolic hydrogens,  etc.
                  if self.bondfield.planer.has_key(ffld[( residue.resname,  
                                                          anchor.name)]['type']):
                      secondary_anchor = bonded[0]
                     
                      p0 = heavy_atom.coord - anchor.coord
                      d2 = secondary_anchor.coord - anchor.coord
                      p1 = normalize(cross_product(d2,  p0))
                      p2 = normalize(cross_product(p0,  p1))                     
                      vector = scale(p2,  TRI_TAN)
                      vector = normalize(add(p0,  vector))
                      
                      hydrogen_coord = add(heavy_atom.coord, 
                                          scale(vector,  
                                                bnd_len[(ffld[(residue.resname, 
                                                               heavy_atom.name)]['type'], 
                                                ffld[(residue.resname,  
                                                      hydrogen_name)]['type'])]))
                  
                  else: # Ser,  Cys,  Thr hydroxyl hydrogens
                      secondary_anchor = bonded[0]
                      vector = anchor.coord - secondary_anchor.coord
                      hydrogen_coord = add(heavy_atom.coord, 
                                          scale(vector,  
                                                bnd_len[(ffld[(residue.resname,  heavy_atom.name)]['type'],  
                                                ffld[(residue.resname,  hydrogen_name)]['type'])]    ))
                      
              elif len(bonds):
                  d2 = [1.0, 0, 0]
                  p0 = heavy_atom.coord - anchor.coord
                  p1 = normalize(cross_product(d2,  p0))
                  vector = scale(p1,  TET_TAN)
                  vector = normalize(add(p0,  vector))
                  
                  hydrogen_coord = add(heavy_atom.coord, 
                                       scale(  vector,  
                                               bnd_len[(ffld[(residue.resname,  heavy_atom.name)]['type'],  
                                               ffld[(residue.resname,  hydrogen_name)]['type'])]    ))
              else:
                  hydrogen_coord = random_sphere(heavy_atom.coord, 
                                                 bnd_len[ (ffld[(residue.resname,  heavy_atom.name)]['type'], 
                                                           ffld[(residue.resname,  hydrogen_name)]['type']) ])
  
          elif len(bonds): # linear sum...amide,  tbu,  etc
              vector = [0.0, 0.0, 0.0]
              if heavy_atom.name == 'N': # Fix to get previous atom O from peptide bond. Ugly.
                  prev_res = list(residue.get_id())
                  prev_res[1] -= 1
                  prev_res = tuple(prev_res)
                  if residue.parent.child_dict.has_key(prev_res):
                      prev_res = residue.parent.child_dict[prev_res]
                      bonds.append(prev_res.child_dict['O'])
              for b in bonds:
                  d = heavy_atom.coord - b.coord
                  vector = add(vector,  d)
              vector = normalize(vector)
              hydrogen_coord = add(heavy_atom.coord, 
                                   scale(vector, 
                                   bnd_len[(ffld[(residue.resname,  heavy_atom.name)]['type'], 
                                            ffld[(residue.resname,  hydrogen_name)]['type']) ]))
          else:
              hydrogen_coord = random_sphere(heavy_atom.coord, 
                                             bnd_len[ (ffld[(residue.resname,  heavy_atom.name)]['type'], 
                                                       ffld[(residue.resname,  hydrogen_name)]['type']) ])
          
          return hydrogen_coord