def geom_size(geom, dim=None):
    """Returns the size of a volume or sinogram, based on the projection or volume geometry.

    :param geom: Geometry to calculate size from
    :type geometry: :class:`dict`
    :param dim: Optional axis index to return
    :type dim: :class:`int`
    """
    if 'GridSliceCount' in geom:
        s = geom['GridSliceCount'], geom['GridRowCount'], geom['GridColCount']
    elif 'GridColCount' in geom:
        s = geom['GridRowCount'], geom['GridColCount']
    elif geom['type'] == 'parallel' or geom['type'] == 'fanflat':
        s = len(geom['ProjectionAngles']), geom['DetectorCount']
    elif geom['type'] == 'parallel3d' or geom['type'] == 'cone':
        s = geom['DetectorRowCount'], len(geom['ProjectionAngles']), geom[
            'DetectorColCount']
    elif geom['type'] == 'fanflat_vec':
        s = geom['Vectors'].shape[0], geom['DetectorCount']
    elif geom['type'] == 'parallel3d_vec' or geom['type'] == 'cone_vec':
        s = geom['DetectorRowCount'], geom['Vectors'].shape[0], geom[
            'DetectorColCount']
    if dim != None:
        s = s[dim]
    return s
