<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def get_sites_in_sphere(self, pt, r, include_index=False, include_image=False):
 """ Find all sites within a sphere from the point. This includes sites in other periodic images. Algorithm: 1. place sphere of radius r in crystal and determine minimum supercell (parallelpiped) which would contain a sphere of radius r. for this we need the projection of a_1 on a unit vector perpendicular to a_2 & a_3 (i.e. the unit vector in the direction b_1) to determine how many a_1"s it will take to contain the sphere. Nxmax = r * length_of_b_1 / (2 Pi) 2. keep points falling within r. Args: pt (3x1 array):
 cartesian coordinates of center of sphere. r (float):
 Radius of sphere. include_index (bool):
 Whether the non-supercell site index is included in the returned data include_image (bool):
 Whether to include the supercell image is included in the returned data Returns: requires the distance. """

        site_fcoords = np.mod(self.frac_coords, 1)
        neighbors = []
        for fcoord, dist, i, img in self._lattice.get_points_in_sphere(
                site_fcoords, pt, r):
            nnsite = PeriodicSite(self[i].species,
                                  fcoord, self._lattice,
                                  properties=self[i].properties)

            # Get the neighbor data
            nn_data = (nnsite, dist) if not include_index else (nnsite, dist, i)
            if include_image:
                nn_data += (img,)
            neighbors.append(nn_data)
        return neighbors