Skip to content

surveycodex.survey

Survey dataclass

A dataclass for storing the parameters of a survey

Source code in surveycodex/survey.py
 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
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
@dataclass(frozen=True)
class Survey:
    """A dataclass for storing the parameters of a survey"""

    name: str
    "The survey name"
    description: str
    "The survey description with telescope/instrument information"
    _filters: Dict[str, Filter]
    "A private dictionary containing the survey filters"
    pixel_scale: Quantity
    "The pixel scale of the survey"
    mirror_diameter: Quantity
    "The mirror diameter"
    gain: Quantity
    "The gain in electron/ADU"
    obscuration: Quantity
    "The total obscuration created by the instrument pieces"
    zeropoint_airmass: Quantity
    "The zeropoint airmass"
    available_filters: List[str] = field(init=False)
    "The list of survey filters"
    effective_area: Quantity = field(init=False)
    "The survey instrument effective area on the sky computed from the obscuration"
    references: Dict[str, Dict[str, str]]
    "Dictionary of references for each parameter specified in surveycodex"

    @classmethod
    def from_yaml(cls, yaml_file: str):
        """Constructor for the Survey class

        Parameters
        ----------
        yaml_file: pathlike
            Filepath to YAML file containing the survey info

        Returns
        -------
        Survey
            A `Survey` instance filled with the information as attributes

        """
        with open(yaml_file) as f:
            data = yaml.safe_load(f)

        filters = Survey._construct_filter_dict(data)
        pixel_scale = data["pixel_scale"] * u.arcsec
        mirror_diameter = data["mirror_diameter"] * u.m
        gain = data["gain"] * u.electron / u.adu
        obscuration = data["obscuration"] * u.dimensionless_unscaled
        zeropoint_airmass = data["zeropoint_airmass"] * u.dimensionless_unscaled

        return cls(
            data["name"],
            data["description"],
            filters,
            pixel_scale,
            mirror_diameter,
            gain,
            obscuration,
            zeropoint_airmass,
            data["references"],
        )

    def __str__(self):
        n = len(self.name)
        survey_repr = "-" * (n + 4) + "\n"
        survey_repr += f"| {self.name} |"
        survey_repr += f" {self.description}\n"
        survey_repr += "-" * (n + 4) + "\n"
        printed_params = [
            f"  {key:<20} = {val}"
            for key, val in self.__dict__.items()
            if key not in ("name", "description", "_filters", "references")
        ]
        survey_repr += "\n".join(printed_params)
        return survey_repr

    def __repr__(self):
        return f"Survey {self.name}"

    @staticmethod
    def _construct_filter_dict(survey_dict):
        """Create a custom dictionary for the survey filters

        Parameters
        ----------
        survey_dict: dict
            Dictionnary of the survey parameters, including the definition of the filters

        Returns
        -------
        dict
            Dictionary of the survey Filter instances

        """
        return {
            fname: Filter.from_dict(fdict)
            for fname, fdict in survey_dict["filters"].items()
        }

    def __post_init__(self):
        """Set attributes computed after class is constructed"""
        available_filters = list(self._filters.keys())
        object.__setattr__(self, "available_filters", available_filters)

        total_area = math.pi * (self.mirror_diameter * 0.5) ** 2
        effective_area = total_area * (1 - self.obscuration)
        object.__setattr__(self, "effective_area", effective_area)

    def get_filter(self, filter_name):
        """Getter method to retrieve a Filter object

        Parameters
        ----------
        filter_name : str
            Name of a filter chosen among the `available_filters` attribute

        Returns
        -------
        Filter
            Corresponding `Filter` dataclass

        Raises
        ------
        ValueError
            The requested filter does not exist or is not available in surveycodex

        """
        if filter_name not in self.available_filters:
            raise ValueError(
                "Please check the filter name. "
                f"The available filters for {self.name} "
                f"are {self.available_filters}"
            )

        return self._filters[filter_name]

available_filters: List[str] = field(init=False) class-attribute instance-attribute

The list of survey filters

description: str instance-attribute

The survey description with telescope/instrument information

effective_area: Quantity = field(init=False) class-attribute instance-attribute

The survey instrument effective area on the sky computed from the obscuration

gain: Quantity instance-attribute

The gain in electron/ADU

mirror_diameter: Quantity instance-attribute

The mirror diameter

name: str instance-attribute

The survey name

obscuration: Quantity instance-attribute

The total obscuration created by the instrument pieces

pixel_scale: Quantity instance-attribute

The pixel scale of the survey

references: Dict[str, Dict[str, str]] instance-attribute

Dictionary of references for each parameter specified in surveycodex

zeropoint_airmass: Quantity instance-attribute

The zeropoint airmass

__post_init__()

Set attributes computed after class is constructed

Source code in surveycodex/survey.py
113
114
115
116
117
118
119
120
def __post_init__(self):
    """Set attributes computed after class is constructed"""
    available_filters = list(self._filters.keys())
    object.__setattr__(self, "available_filters", available_filters)

    total_area = math.pi * (self.mirror_diameter * 0.5) ** 2
    effective_area = total_area * (1 - self.obscuration)
    object.__setattr__(self, "effective_area", effective_area)

from_yaml(yaml_file) classmethod

Constructor for the Survey class

Parameters

yaml_file: pathlike Filepath to YAML file containing the survey info

Returns

Survey A Survey instance filled with the information as attributes

Source code in surveycodex/survey.py
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
@classmethod
def from_yaml(cls, yaml_file: str):
    """Constructor for the Survey class

    Parameters
    ----------
    yaml_file: pathlike
        Filepath to YAML file containing the survey info

    Returns
    -------
    Survey
        A `Survey` instance filled with the information as attributes

    """
    with open(yaml_file) as f:
        data = yaml.safe_load(f)

    filters = Survey._construct_filter_dict(data)
    pixel_scale = data["pixel_scale"] * u.arcsec
    mirror_diameter = data["mirror_diameter"] * u.m
    gain = data["gain"] * u.electron / u.adu
    obscuration = data["obscuration"] * u.dimensionless_unscaled
    zeropoint_airmass = data["zeropoint_airmass"] * u.dimensionless_unscaled

    return cls(
        data["name"],
        data["description"],
        filters,
        pixel_scale,
        mirror_diameter,
        gain,
        obscuration,
        zeropoint_airmass,
        data["references"],
    )

get_filter(filter_name)

Getter method to retrieve a Filter object

Parameters

filter_name : str Name of a filter chosen among the available_filters attribute

Returns

Filter Corresponding Filter dataclass

Raises

ValueError The requested filter does not exist or is not available in surveycodex

Source code in surveycodex/survey.py
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
def get_filter(self, filter_name):
    """Getter method to retrieve a Filter object

    Parameters
    ----------
    filter_name : str
        Name of a filter chosen among the `available_filters` attribute

    Returns
    -------
    Filter
        Corresponding `Filter` dataclass

    Raises
    ------
    ValueError
        The requested filter does not exist or is not available in surveycodex

    """
    if filter_name not in self.available_filters:
        raise ValueError(
            "Please check the filter name. "
            f"The available filters for {self.name} "
            f"are {self.available_filters}"
        )

    return self._filters[filter_name]