code: def mass(self,R,z=None,t=0.,forceint=False):
          
          if self.isNonAxi:
              raise NotImplementedError('mass for non-axisymmetric potentials is not currently supported')
          try:
              if forceint: raise AttributeError #Hack!
              return self._amp*self._mass(R,z=z,t=t)
          except AttributeError:
              #Use numerical integration to get the mass
              if z is None:
                  return 4.*nu.pi\
                      *integrate.quad(lambda x: x**2.\
                                          *self.dens(x,0.,
                                                    use_physical=False),
                                      0.,R)[0]
              else:
                  return 4.*nu.pi\
                      *integrate.dblquad(lambda y,x: x\
                                             *self.dens(x,y,use_physical=False),
                                         0.,R,lambda x: 0., lambda x: z)[0]
docs: NAME:
  
             mass
  
          PURPOSE:
  
             evaluate the mass enclosed
  
          INPUT:
  
             R - Cylindrical Galactocentric radius (can be Quantity)
  
             z= (None) vertical height (can be Quantity)
  
             t - time (optional; can be Quantity)
  
          KEYWORDS:
  
             forceint= if True, calculate the mass through integration of the density, even if an explicit expression for the mass exists
  
          OUTPUT:
  
             1) for spherical potentials: M(<R) [or if z is None], when the mass is implemented explicitly, the mass enclosed within  r = sqrt(R^2+z^2) is returned when not z is None; forceint will integrate between -z and z, so the two are inconsistent (If you care to have this changed, raise an issue on github)
  
             2) for axisymmetric potentials: M(<R,<fabs(Z))
  
          HISTORY:
  
             2014-01-29 - Written - Bovy (IAS)