<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def circular_pores(target, pore_diameter='pore.diameter', throat_diameter='throat.diameter', throat_centroid='throat.centroid'):
 r""" Calculate the coordinates of throat endpoints, assuming circular pores. This model accounts for the overlapping lens between pores and throats. Parameters target : OpenPNM Object The object which this model is associated with. This controls the length of the calculated array, and also provides access to other necessary properties. pore_diameter : string Dictionary key of the pore diameter values. throat_diameter : string Dictionary key of the throat diameter values. throat_centroid : string, optional Dictionary key of the throat centroid values. See the notes. Returns ------- EP : dictionary Coordinates of throat endpoints stored in Dict form. Can be accessed via the dict keys 'head' and 'tail'. Notes ----- (1) This model should only be applied to ture 2D networks. (2) By default, this model assumes that throat centroid and pore coordinates are colinear. If that's not the case, such as in extracted networks, `throat_centroid` could be passed as an optional argument, and the model takes care of the rest. """

    return spherical_pores(target=target, pore_diameter=pore_diameter,
                           throat_diameter=throat_diameter)