The following software is freely available. However, if you use it for published research, you are requested to cite the paper where the method is described, highlighted in red. You are not allowed to redistribute any of these programs (modified or not) without explicit permission from the author.
NOTE: If you are just starting to program and are wondering which version you should use, I strongly recommend the Python version of my programs.
Illustration of the steps involved in the MGE fit to the S0 galaxy NGC 4342 using the mge_fit_sectors package. The figures were produced by the mge_fit_example.py script included in the Python distribution of the software.

MGE_FIT_SECTORS
packageThis software obtains an accurate MultiGaussian Expansion (MGE) parameterizations (Emsellem et al. 1994) for a galaxy surface brightness, with the efficient and robust fitting method of Cappellari (2002, MNRAS, 333, 400).
See Cappellari et al. (2006) for a large scale application of this software to the study of the M/L ratio and the Fundamental Plane of earlytype galaxies and Cappellari et al. (2012, Nature) for an application to the study of the stellar IMF. The MGE parameterizations is useful in the construction of realistic dynamical models of galaxies (see JAM modelling below), for PSF deconvolution of images, for the correction and estimation of dust absorption effects, or for galaxy photometry.
mge_fit_sectors
source code in The source code of the mge_fit_sectors
package in Python, including a test galaxy image, can be downloaded here in ZIP format (4.9 MB). This version was last updated on the 20 January 2017. It is functionally identical to the IDL one, but it is typically about 5× faster due to the use of Scipy's builtin NNSL procedure and Numpy's broadcasting. It is orders of magnitude faster when using the option linear=True
, which is now always recommended with Python.
How to install: To be able to import the module from any directory, one can add the directory with the Python code to a "path configuration file" (.pth
) placed in the .../sitepackages/
directory (see here for details).
Running this version of mge_fit_sectors
requires no installation or compilation of any Python package that is not certainly already included in a standard scientific Python installation. Namely mge_fit_sectors
only requires the scientific core packages Numpy, Scipy and Matplotlib (the mge_fit_sectors
package was tested with both Python 2.7 and 3.5, using NumPy 1.11, SciPy 0.18 and Matplotlib 1.5), and Pyfits to read FITS images.
Also included in the mge_fit_sectors
distribution is the mpfit
implementation by Markwardt (2009) of the MINPACK (Moré, Garbow & Hillstrom, 1980) LevenbergMarquardt nonlinear leastsquares optimization algorithm. The mpfit
routine was translated into Python by Mark River and updated here for Numpy by Sergey Koposov. I modified the latter version to support both Python 2.6/2.7 and Python 3. Note that mge_fit_sectors
uses the mpfit
implementation instead of the scipy.optimize.leastsq
one, because of the ability of mpfit
to set limits on parameters or keep them fixed.
MGE_FIT_SECTORS
source code in The source code of the IDL package MGE_FIT_SECTORS
, with examples
and instructions, can be downloaded here in ZIP format (326 KB). This version was last updated on the 24 April 2015 and the changes are documented in the program file. Optionally the FITS files of the five galaxy images that are required to run the examples routine can be downloaded here in ZIP format (19 MB).
Also required is the following IDL routine, which must be downloaded separately:
And if you just started using IDL and still do not have the IDL Astronomy User's Library installed, or if you have an old version, you should immediately get it from here.
NOTE: I would appreciate if you drop me an email (address at the bottom) when you download the above procedures. I would also like to know if you got the IDL or Python version.
2. The JAM modelling method 

Jeans Anisotropic Models of stellar kinematics or proper motions of axisymmetric or spherical galaxies 
Figure 1: Examples of JAM datamodel comparisons. The bisymmetrized SAURON stellar kinematics of 6 Elliptical (left) and 6 S0 (right) fastrotator earlytype galaxies is compared to the predictions of the anisotropic Jeans models with JAM. The kinematics varies widely for different galaxies, yet these twoparameter models are able to correctly predict the shape of a pair of twodimensional functions (V and V_{rms}), once the observed surface brightness is given (this is fig.10 of Cappellari 2016). 
Figure 4: The benchmark black hole (BH) in NGC4258. A detailed modelling using JAM accurately recovers the "correct" BH mass inferred from maser observations (Drehmer et al. 2015). This is one of the most reliable BH mass estimates, after the Milky Way. For other comparisons see Cappellari et al. (2010). 
Figure 3: JAM models examples of kinematically decoupled components. (a) Threeparameters JAM description of the SAURON stellar kinematics of the earlytype galaxy NGC4550, which contains two counterrotating stellar disks (Cappellari et al. 2007). To reproduce the observed velocity field, the flattest (q' < 0.25) Gaussians of the MGE model were assigned opposite rotation (κ < 0). (b) Same as in [a] but with the model orbits all rotating in the same direction. (c) Best fitting JAM model of NGC5308, with constant anisotropy (β_{z} = 0.28 and κ = 1.02) (Cappellari 2008). (d) Same as in [c], but with a nonrotating bulge (κ = 0). (e) Same as in [c] but with an isotropic bulge (β_{z} = 0) and an anisotropic disk (β_{z} = 0.28). The best model has an oblate velocity ellipsoid, with the same strong anisotropy and the same rotation for both the bulge and the disk! 
Figure 2: Including both proper motions and radial velocities. Top Panels: the components of the symmetric velocity second moment tensor measured from the particles of a realistic Nbody simulation. Bottom Panels: the corresponding JAM model predictions. Note the striking agreement! (Cappellari 2012) 
The software in this section implements in Python and in IDL a solution of the Jeans equations which allows for orbital anisotropy (threeintegrals distribution function) and also provides the full second moment tensor, including both proper motions and radial velocities, for both axisymmetric (Cappellari 2012) and spherical geometry (Cappellari 2015). The technique was introduced in Cappellari (2008, MNRAS, 390, 71) and we call it the Jeans Anisotropic Modelling (JAM) method. It relies on the MultiGaussian Expansion parameterization (Emsellem et al. 1994; Cappellari 2002) for the galaxy surface brightness.
With the addition of a single extra parameter β_{z}=1(σ_{z}/σ_{R})^{2}, the simple and userfriendly JAM method already provides a dramatic improvement over the less general but widely used twointegrals f(E,L_{z}) Jeans (1922) models. However JAM also allows for tangential ansiotropy γ=1(σ_{φ}/σ_{R})^{2} and/or for spatially varying anisotropy. The JAM models provide good descriptions of stateoftheart integralfield stellar kinematics of real galaxies (Figure 1). This makes the technique well suited to measure the inclination, the dynamical M/L and angular momenta of earlytype fastrotators and spiral galaxies.
The JAM routines are designed for axisymmetric or spherical geometry, (i) they can provide the proper motion dispersion tensor (Cappellari 2012; Cappellari 2015; Figure 2), (ii) allow for the inclusion of dark matter, (iii) variable stellar M/L, (iv) spatially varying anisotropy and (v) multiple kinematic components (Figure 3) and (vi) supermassive black holes (BH; Figure 4). The JAM package also includes a routine to compute the circular velocity from the MGE models. Some sample applications of the JAM method are given below:
To construct dynamical models with the JAM method one needs to describe the galaxies surface brightness via the MultiGaussian Expansion parametrization using my MGE_FIT_SECTORS package above.
jam
source code in The source code of the jam
modelling package in Python can be downloaded here in ZIP format (47 KB). This version was last updated on the 20 January 2017 and the changes are documented in the program files. The Python version of the mean velocity calculation is about 30× faster than the IDL version, due to a redesign of the double integration approach, made possible by Numpy's broadcasting.
Also required for plotting are the generic routines plot_velfield
, symmetrize_velfield
and sauron_colormap
in this ZIP file.
How to install: To be able to import the module from any directory, one can add the directory with the Python code to a "path configuration file" (.pth
) placed in the .../sitepackages/
directory (see here for details).
Running this version of jam
requires no installation or compilation of any Python package that is not certainly already included in a standard scientific Python installation. Namely jam
only requires the scientific core packages Numpy, Scipy and Matplotlib (jam
was tested with both Python 2.7 and 3.5, using NumPy 1.11, SciPy 0.18 and Matplotlib 1.5).
The source code of the JAM modelling package in IDL, with documentation and examples, can be downloaded here in ZIP format (45 KB). This version was last updated on 7 April 2015 and the changes are documented in the program files.
Also required are the generic plotting routines SAURON_COLORMAP
and PLOT_VELFIELD
which can be found in this ZIP file.
And if you just started using IDL and still do not have the IDL Astronomy User's Library installed, or if you have an old version, you should immediately get it from here.
NOTE: I would appreciate if you drop me an email (address at the bottom) when you download the above procedures. I would also like to know if you got the IDL or Python version.
Left: Fourcoloring of Voronoi binning; Middle: Unbinned versus Voronoi binned IntegralField Spectroscopy (Cappellari & Copin 2003); Right: Voronoi binning of Xray data (Sanders et al. 2004). 
The Voronoi Binning method of Cappellari & Copin (2003, MNRAS, 342, 345) optimally solves the problem of preserving the maximum spatial resolution of general twodimensional data (or higher dimensions), given a constraint on the minimum signaltonoise ratio.
The Voronoi binning method has been applied to a variety of types of data. A review of the concepts and applications to (i) Xray data, (ii) integralfield spectroscopy, (iii) FabryPerot interferometry, (iv) Nbody simulations, (v) standard images and (vi) other regularly or irregularly sampled data is given in Cappellari (2009).
The source code of the Python program voronoi_2d_binning
, with examples and instructions, can be downloaded here in ZIP format (70 KB). It was last updated on the 12 April 2016 and the changes are documented in the program files. This version is functionally identical to the IDL one from which it was translated. It was tested to produce identical results for every spaxel.
How to install: To be able to import the module from any directory, one can add the directory with the Python code to a "path configuration file" (.pth
) placed in the .../sitepackages/
directory (see here for details).
Running this version of voronoi_2d_binning
requires no installation or compilation of any Python package that is not certainly already included in a standard scientific Python installation. Namely voronoi_2d_binning
only requires the scientific core packages Numpy, Scipy and Matplotlib (voronoi_2d_binning
was tested with both Python 2.7 and 3.5, using NumPy 1.11, SciPy 0.18 and Matplotlib 1.5).
This optional ZIP file contains the routines display_bins
, display_bins_generators
, display_pixels
, plot_velfield
and the sauron_colormap
which can be used to visualize Voronoi 2Dbinned or unbinned data, either using interpolation, or by showing the actual bins like in the figures above.
The source code of the IDL program VORONOI_2D_BINNING, with examples and instructions, can be downloaded here in ZIP format (75 KB). This version was last updated on 12 April 2016 and the changes are documented in the program file. Some minor adaptations of the routine may be required to optimally use the method with different types of data. Please ask for suggestions if needed.
This optional ZIP file contains the routines display_bins
, display_bins_generators
, DISPLAY_PIXELS
, PLOT_VELFIELD
and SAURON_COLORMAP
which can be used to visualize Voronoi 2Dbinned or unbinned data, either using interpolation, or by showing the actual bins like in the figures above.
NOTE: I would appreciate if you drop me an email (address at the bottom) when you download the above procedures. I would also like to know if you got the IDL or Python version.
Figure 1: Stellar and gas kinematics fit with pPXF. The black line (mostly hidden by the fit) is the relative flux of the observed spectrum. The red line is the pPXF fit for the stellar component, while the orange line is a fit to the gas emission lines. The green symbols at the bottom are the fit residuals, while the blue lines is the gasonly bestfitting spectrum. The main absorption and emission features are indicated at the top of the plot (taken from Cappellari 2017). 
This software implements the Penalized PixelFitting method (pPXF) to extract the stellar kinematics or stellar population from absorptionline spectra of galaxies, using a maximum penalized likelihood approach. The method was originally described in Cappellari & Emsellem (2004, PASP, 116, 138) and upgraded in Cappellari (2017, MNRAS, 466, 798). The method is very general and robust. For this reason it was applied to a variety of situations. The following key features are implemented in the current pPXF program:
See Emsellem et al. (2004) and Cappellari et al. (2011) for two largescale applications of the pPXF method to the measurement of the stellar kinematics of galaxies. FalconBarroso et al. (2004) present an example of using the optimal template generated by pPXF to extract the gas kinematics from galaxy spectra and to measure emissioncorrected linestrength indexes. McDermid et al. (2006; their Fig. 3) use pPXF for spectral flux calibration, and extract the kinematics of a large galaxy sample. Cappellari et al. (2009) use pPXF to measure velocity dispersion of a sample of 9 passive earlytype galaxies at redshift z~2.
The ability of the pPXF method to fit a large set of stellar templates together with the kinematics allows the template mismatch problem to be virtually eliminated. This is particularly useful given the current availability of large stellar libraries spanning wide ranges of physical parameters and having good spectral resolution. Excellent results have been obtained by using a few hundred template stars with pPXF, from which generally about 1020 are selected by the program to provide detailed fits to high S/N galaxy spectra (e.g. the four panels of Figure 1 show pPXF fits to SAURON spectra using the full MILES stellar library). An extensive account of the available stellar libraries is maintained by David Montes. An incomplete list of libraries that have been successfully used with pPXF for the kinematics extraction is given below:
Figure 4: Population and gas with pPXF. The top panels show the pPXF fit to the SDSS DR8 spectrum of the earlytype galaxy NGC3522, using as templates a subset of 26(Ages)×6([M/H])=156 MILES model spectra by Vazdekis et al. (2010), and 12 gas emission lines. The bottom panels show the corresponding pPXF solution for the distribution of the mass fraction in different age and metallicity intervals. The Left Panel has no regularization. This is the minimum χ^{2} solution which all nonregularized fullspectrum fitting programs must return, if they properly converge. However the solution is rather arbitrary due to the fact that this general inverse problem is illposed. For this reason the solution consists of a few model spectra with quite different characteristics. Regularization is a standard approach to solve illposed problems. The Right Panel shows the pPXF regularized solution. This is the smoothest solution consistent with the noise in the data. It has a quite extended distribution dominated in mass by an old stellar population and nearly solar mean metallicity. (This figure was made with the script ppxf_population_gas_example_sdss.py in the pPXF Python distribution)

Figure 3: Starformation history with pPXF. The plot shows the starformation history of ATLAS^{3D} galaxies, in bins of different galaxy stellar mass. This was recovered with pPXF using regularization (taken from McDermid et al. 2015). 
Figure 2: Fitting gas and multiple kinematic components with pPXF. The plot shows the pPXF fit to the spectrum of the galaxy NGC4550, which is known to contain two counterrotating stellar disks (e.g. Figure 3 in JAM section). The fit uses two kinematic components of different age for the stars and one for the gas emission lines (taken from Johnston et al. 2013). 
When one uses as input templates a set of synthetic galaxy spectra, arranged in a grid of population parameters (e.g. age and metallicity), pPXF is the most efficient and reliable public implementation of the so called "FullSpectrum Fitting" method to study stellar populations. This technique has replaced the traditional use of linestrength indices, due to the availability of highquality model spectra (e.g. Bruzual & Charlot 2003; Vazdekis et al. 2010; Maraston & Stromback 2011; Conroy & van Dokkum 2012).
pPXF allows one to extract multiple kinematic components, with different stellar populations, from a spectrum. Gas emission lines can be fitted simultaneously, avoiding the need for masking them. This is particularly useful when studying the stellar population of galaxies with prominent emission lines filling important absorption features (see Figures 2 and 4).
A number of similar, but less optimized and less general implementations of the Full Spectrum Fitting method exist (e.g. STARLIGHT by Cid Fernandes et al. 2005; STECMAP by Ocvirk, et al. 2006; VESPA by Tojeiro et al. 2007). A major limitation of most available codes is that they ignore the fact that the recovery of the star formation history and chemical composition distribution from the galaxy spectra is an illposed problem. A standard technique to solve illposed problems is regularization, which is invoked in pPXF via the keyword REGUL (see Press et al. 1992, Sec.18.5). Regularization is essential to make sense of the derived star formation histories and to explore model degeneracies (see Figure 3 and 4).
See Cappellari et al. (2012, Nature) for a pPXF study of the M/L and IMF of stellar populations, and figure 20 of Onodera et al. (2012) for an application of pPXF to the study of the star formation history of passive galaxies at redshift z~2.
ppxf
source code in ppxf
version 6.0 (AUG/2016), the Python code includes the upgrade introduced in Cappellari (2017, MNRAS, 466, 798)
The source code of the Python program ppxf
, with examples and instructions, can be downloaded here in ZIP format (3.4 MB). It was last updated on the 18 January 2017 and the changes are documented in the program files. This version contains some extra options not present in the IDL version. The Python version is also faster than the IDL one (10× faster in the example of Figure 4) when using a large number (>100) of templates, thanks to Scipy's builtin nnls
(a similar pPXF performance in IDL requires calling the compiled version of BVLS: see below).
How to install: To be able to import the module from any directory, one can add the directory with the Python code to a "path configuration file" (.pth
) placed in the .../sitepackages/
directory (see here for details).
Running this version of ppxf
requires no installation or compilation of any Python package that is not certainly already included in a standard scientific Python installation. Namely ppxf
only requires the scientific core packages Numpy, Scipy and Matplotlib (ppxf
was tested with both Python 2.7 and 3.5, using NumPy 1.11, SciPy 0.18 and Matplotlib 1.5), and Pyfits to read any FITS data.
Also included in the ppxf
distribution is the mpfit
implementation by Markwardt (2009) of the MINPACK (Moré, Garbow & Hillstrom, 1980) LevenbergMarquardt nonlinear leastsquares optimization algorithm. The mpfit
routine was translated into Python by Mark River and updated here for Numpy by Sergey Koposov. I modified the latter version to support both Python 2.6/2.7 and Python 3. Note that ppxf
uses the mpfit
implementation instead of the scipy.optimize.leastsq
one, because of the ability of mpfit
to set limits on parameters or keep them fixed.
I recommend running the provided ppxf
examples and checking the output against the provided ppxf_python_reference_output.txt
file, to detect possible Python installation issues.
The source code of the IDL program pPXF, with examples and instructions, can be downloaded here in ZIP format (2.6 MB). This version was last updated on the 10 August 2016 and the changes are documented in the program file.
The following two IDL routines are also required to run pPXF. They must be downloaded separately:
CALL_EXTERNAL
.
And if you just started using IDL and still do not have the IDL Astronomy User's Library installed, or if you have an old version, you should immediately get it from here.
NOTE: I would appreciate if you drop me an email (address at the bottom) when you download the above procedures. I would also like to know if you got the IDL or Python version.
GANDALF
in If you are interested in both the stellar and gas kinematics, you may also use pPXF in combination with GANDALF
. Please acknowledge both the pPXF (Cappellari & Emsellem 2004) and the GANDALF
(Sarzi et al. 2006) papers if you use the two programs together. See Oh et al. (2011) for a largescale application of the pPXF and GANDALF
combination.
Best fitting symmetrized kinematics of NGC 2974 
This software implements the method presented in Appendix C of Krajnovic et al. (2006, MNRAS, 366, 787) to measure the global kinematic positionangle (PA) from integral field observations of a galaxy stellar or gas kinematics.
See Cappellari et al. (2007) and Krajnovic et al. (2011) for two large scale application of this software to the study of the stellar kinematical misalignment of earlytype galaxies. See Davor's Krajnovic page for the related Kinemetry package.
fit_kinematic_pa
source code in The source code of the Python program fit_kinematic_pa
can be downloaded here in ZIP format. It was last updated on the 20 January 2017. This version is functionally identical to the IDL one from which it was translated.
Also required are the generic plotting routines plot_velfield
, symmetrize_velfield
and sauron_colormap
in this ZIP file.
How to install: To be able to import the module from any directory, one can add the directory with the Python code to a "path configuration file" (.pth
) placed in the .../sitepackages/
directory (see here for details).
Running this version of fit_kinematic_pa
requires no installation or compilation of any Python package that is not certainly already included in a standard scientific Python installation. Namely fit_kinematic_pa
only requires the scientific core packages Numpy, Scipy and Matplotlib (fit_kinematic_pa
was tested with both Python 2.7 and 3.5, using NumPy 1.11, SciPy 0.18 and Matplotlib 1.5).
The source code of the IDL program FIT_KINEMATIC_PA, with examples and instructions, can be downloaded here in ZIP format (9 KB). This version was last updated on 12 October 2013 and the changes are documented in the program file.
Also required are the generic plotting routines SAURON_COLORMAP
and PLOT_VELFIELD
which can be found in this ZIP file.
And if you just started using IDL and still do not have the IDL Astronomy User's Library installed, or if you have an old version, you should immediately get it from here.
NOTE: I would appreciate if you drop me an email (address at the bottom) when you download FIT_KINEMATIC_PA. I would also like to know if you got the IDL or Python version.
Figure 1: Fitting of the (M/L)σ relation in the Virgo cluster using LTS_LINEFIT (taken from Cappellari et al. 2013a). The green outliers above the relation are automatically removed from the fit. They turn out to be background galaxies and for this reason they do not follow the cluster relation.

LTS_LINEFIT
and LTS_PLANEFIT
This software implements the method presented in Sec. 3.2 of Cappellari et al. (2013a, MNRAS, 432, 1709) to to perform extremely robust fit of lines or planes to data with errors in all variables, possible large outliers (bada data) and unknown intrinsic scatter.
The code combines the Least Trimmed Squares (LTS) robust technique, proposed by Rousseeuw (1984) and speeded up in Rousseeuw & Driessen (2006), into a leastsquares fitting algorithm which allows for intrinsic scatter and errors in all coordinates. This method makes the fit converge to the correct solution even in the presence of a large number of catastrophic outliers (like in Figure 1), where the much simpler σclipping approach can converge to the wrong solution.
lts_linefit
and lts_planefit
source code in The source code of the Python programs lts_linefit
and lts_planefit
can be downloaded here in ZIP format. It was last updated on the 20 January 2017. This version is functionally identical to the IDL one from which it was translated. It was tested to produce identical results. It is typically a couple of times faster than the IDL version.
How to install: To be able to import the module from any directory, one can add the directory with the Python code to a "path configuration file" (.pth
) placed in the .../sitepackages/
directory (see here for details).
Running this version of lts_linefit
requires no installation or compilation of any Python package that is not certainly already included in a standard scientific Python installation. Namely lts_linefit
only requires the scientific core packages Numpy, Scipy and Matplotlib (lts_linefit
was tested with both Python 2.7 and 3.5, using NumPy 1.11, SciPy 0.18 and Matplotlib 1.5).
LTS_LINEFIT
and LTS_PLANEFIT
source code in The source code of the IDL programs LTS_LINEFIT
and LTS_PLANEFIT
can be downloaded here in ZIP format (9 KB). This version was last updated on 26 October 2015 and the changes are documented in the program file.
The following two IDL routine are also required to run the two programs. They must be downloaded separately:
And if you just started using IDL and still do not have the IDL Astronomy User's Library installed, or if you have an old version, you should immediately get it from here.
NOTE: I would appreciate if you drop me an email (address at the bottom) when you download LTS_LINEFIT
and LTS_PLANEFIT
.
Application of the CAP_LOESS_2D routine (with FRAC=0.6) to the recovery of two underlying functions from a noisy distribution of 200 scattered values. For comparison, the right panels show the distribution obtained via simple averaging on a grid, but using 100× more values than the ones used for the LOESS recovery. The LOESS approach achieves a comparable result while requiring a much smaller number of input values.

CAP_LOESS_1D
and CAP_LOESS_2D
This software provides an improved implementation of the onedimensional (Clevelend 1979) and twodimensional (Cleveland & Devlin 1988) Locally Weighted Regression (LOESS) method to recover the mean trends of the population from noisy data in one or two dimensions. It includes a robust approach to deal with outliers (bad data).
These programs were implemented and used to produce the twodimensional maps and the onedimensional mean trends in Cappellari et al. (2013b, MNRAS, 432, 1862).
loess_1d
and loess_2d
source code in The source code of the Python program loess_2d
can be downloaded here in ZIP format. It was last updated on the 20 January 2017. This version is functionally identical to the IDL one from which it was translated. It was tested to produce identical results.
Also required to run the 2D example are the generic plotting routines plot_velfield
and sauron_colormap
in this ZIP file.
How to install: To be able to import the module from any directory, one can add the directory with the Python code to a "path configuration file" (.pth
) placed in the .../sitepackages/
directory (see here for details).
CAP_LOESS_1D
and CAP_LOESS_2D
source in The source code of the IDL programs CAP_LOESS_1D
and CAP_LOESS_2D
can be downloaded here in ZIP format (6 KB). This version was last updated on 31 October 2013 and the changes are documented in the program file.
And if you just started using IDL and still do not have the IDL Astronomy User's Library installed, or if you have an old version, you should immediately get it from here.
NOTE: I would appreciate if you drop me an email (address at the bottom) when you download the code.
Comments and suggestions are welcome to the address michele.cappellari
@physics.ox.ac.ukLatest changes: 20/JAN/2017
Go back to Michele Cappellari Homepage