brick_core.py 2.43 KB
Newer Older
Wu You's avatar
Wu You committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import healpy as hp
import numpy as np
from .brick_utils import radius_exact

class Config:
    def __init__(self, nside, overlap):
        self.nside = nside
        self.overlap = overlap
        
class Brick:
    """
    A class representing a sky region ("brick") generated based on HEALPix.

    Attributes
    ----------
    brick_id : int
        Unique identifier of the brick (HEALPix pixel ID).
    ra : float
        Right Ascension of the brick center (degrees).
    dec : float
        Declination of the brick center (degrees).
    min_radius : float
        Minimum enclosing circle radius of the brick (degrees, without overlap).
    radius : float
        Enlarged radius of the brick (degrees, after applying overlap).
    nside : int
        HEALPix resolution parameter.
    """
    def __init__(self, brick_id, ra, dec, min_radius, radius, nside):
        self.brick_id = brick_id
        self.ra = ra      
        self.dec = dec    
        self.min_radius = min_radius 
        self.radius = radius  
        self.nside = nside  

    def __repr__(self):
        return f"Brick(brick_id={self.brick_id}, ra={self.ra}, dec={self.dec}, min_radius={self.min_radius}, radius={self.radius}, nside={self.nside})"

    
def generate_bricks(nside, brick_id=None, overlap=1.2):
    """
    Generate Brick objects for all HEALPix pixels or a single specified pixel.

    Parameters
    ----------
    nside : int
        HEALPix resolution parameter.
    brick_id : int, optional
        Specific HEALPix pixel (brick) ID to generate. If None (default),
        generate bricks for all pixels.
    overlap : float, optional
        Overlap factor to enlarge the brick radius.
        - 1.0 = no overlap
        - >1.0 = enlarged radius
        Default is 1.2.

    Returns
    -------
    Brick or list of Brick
        - If `brick_id` is provided: a single Brick object.
        - If `brick_id` is None: a list of Brick objects for all pixels.
    """
    def _create_brick(pix, nside):
        theta, phi = hp.pix2ang(nside, pix)
        ra = np.degrees(phi)
        dec = 90 - np.degrees(theta)
        min_radius = radius_exact(nside, pix)
        radius = min_radius * overlap
        return Brick(brick_id=pix, ra=ra, dec=dec, min_radius=min_radius, radius=radius, nside=nside)

    if brick_id is not None:
        return _create_brick(brick_id, nside)
    else:
        npix = hp.nside2npix(nside)
        return [_create_brick(pix, nside) for pix in range(npix)]