Skip to content

sgnligo.transforms.condition

An SGN graph to condition incoming data with whitening and gating.

ConditionInfo dataclass

Condition options for whitening and gating

Parameters:

Name Type Description Default
whiten_sample_rate int

int, the sample rate to perform the whitening

2048
psd_fft_length int

int, the fft length for the psd calculation, in seconds

8
whitening_method str

str, the whitening method, must be either 'gwpy' or 'gstlal'

'gstlal'
ht_gate_threshold float

float, the threshold above which to gate out data

float('+inf')
reference_psd Optional[str]

str, the filename for the reference psd used in the Whiten element

None
track_psd bool

bool, default True, whether to track psd in gstlal whitening method

True
Source code in sgnligo/transforms/condition.py
 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
@dataclass
class ConditionInfo:
    """Condition options for whitening and gating

    Args:
        whiten_sample_rate:
            int, the sample rate to perform the whitening
        psd_fft_length:
            int, the fft length for the psd calculation, in seconds
        whitening_method:
            str, the whitening method, must be either 'gwpy' or 'gstlal'
        ht_gate_threshold:
            float, the threshold above which to gate out data
        reference_psd:
            str, the filename for the reference psd used in the Whiten element
        track_psd:
            bool, default True, whether to track psd in gstlal whitening method
    """

    whiten_sample_rate: int = 2048
    psd_fft_length: int = 8
    whitening_method: str = "gstlal"
    reference_psd: Optional[str] = None
    ht_gate_threshold: float = float("+inf")
    track_psd: bool = True

    def __post_init__(self):
        self.validate()

    def validate(self):
        if self.whitening_method not in ["gwpy", "gstlal"]:
            raise ValueError("Whitening method must be either 'gwpy' or 'gstlal'")

        if self.reference_psd is None and self.track_psd is False:
            raise ValueError("Must enable track_psd if reference_psd not provided")

    @staticmethod
    def append_options(parser: ArgumentParser):
        group = parser.add_argument_group(
            "PSD Options", "Adjust noise spectrum estimation parameters"
        )
        group.add_argument(
            "--whitening-method",
            metavar="algorithm",
            default="gstlal",
            help="Algorithm to use for whitening the data. Supported options are"
            " 'gwpy' or 'gstlal'. Default is gstlal.",
        )
        group.add_argument(
            "--psd-fft-length",
            action="store",
            type=int,
            default=8,
            help="The fft length for psd estimation.",
        )
        group.add_argument(
            "--reference-psd",
            metavar="file",
            help="load the spectrum from this LIGO light-weight XML file (optional).",
        )
        group.add_argument(
            "--track-psd",
            action="store_true",
            default=True,
            help="Enable dynamic PSD tracking.  Always enabled if --reference-psd is"
            " not given.",
        )
        group.add_argument(
            "--whiten-sample-rate",
            metavar="Hz",
            action="store",
            type=int,
            default=2048,
            help="Sample rate at which to whiten the data and generate the PSD, default"
            " 2048 Hz.",
        )

        group = parser.add_argument_group(
            "Data Qualtiy", "Adjust data quality handling"
        )
        group.add_argument(
            "--ht-gate-threshold",
            action="store",
            type=float,
            default=float("+inf"),
            help="The gating threshold. Data above this value will be gated out.",
        )

    @staticmethod
    def from_options(options):
        return ConditionInfo(
            whiten_sample_rate=options.whiten_sample_rate,
            psd_fft_length=options.psd_fft_length,
            whitening_method=options.whitening_method,
            reference_psd=options.reference_psd,
            ht_gate_threshold=options.ht_gate_threshold,
            track_psd=options.track_psd,
        )

condition(pipeline, condition_info, ifos, data_source, input_sample_rate, input_links, whiten_latency=False)

Condition the data with whitening and gating

Parameters:

Name Type Description Default
pipeline Pipeline

Pipeline: the sgn pipeline

required
ifos list[str]

list[str], the ifo names

required
data_source str

str, the data source for the pipeline

required
input_sample_rate int

int, the sample rate of the data

required
input_links list[str]

the src pad names to link to this element

required
Source code in sgnligo/transforms/condition.py
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
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
def condition(
    pipeline: Pipeline,
    condition_info: ConditionInfo,
    ifos: list[str],
    data_source: str,
    input_sample_rate: int,
    input_links: list[str],
    whiten_latency: bool = False,
):
    """Condition the data with whitening and gating

    Args:
        pipeline:
            Pipeline: the sgn pipeline
        ifos:
            list[str], the ifo names
        data_source:
            str, the data source for the pipeline
        input_sample_rate:
            int, the sample rate of the data
        input_links:
            the src pad names to link to this element
    """
    condition_out_links = {ifo: None for ifo in ifos}
    spectrum_out_links = {ifo: None for ifo in ifos}
    if whiten_latency is True:
        whiten_latency_out_links = {ifo: None for ifo in ifos}
    else:
        whiten_latency_out_links = None

    for ifo in ifos:

        # Downsample and whiten
        pipeline.insert(
            Whiten(
                name=ifo + "_Whitener",
                sink_pad_names=(ifo,),
                instrument=ifo,
                psd_pad_name="spectrum_" + ifo,
                whiten_pad_name=ifo,
                input_sample_rate=input_sample_rate,
                whiten_sample_rate=condition_info.whiten_sample_rate,
                fft_length=condition_info.psd_fft_length,
                whitening_method=condition_info.whitening_method,
                reference_psd=condition_info.reference_psd,
            ),
            link_map={
                ifo + "_Whitener:snk:" + ifo: input_links[ifo],  # type: ignore
            },
        )
        spectrum_out_links[ifo] = ifo + "_Whitener:src:spectrum_" + ifo  # type: ignore

        # Apply htgate
        if not isinf(condition_info.ht_gate_threshold):
            pipeline.insert(
                Threshold(
                    name=ifo + "_Threshold",
                    source_pad_names=(ifo,),
                    sink_pad_names=(ifo,),
                    threshold=condition_info.ht_gate_threshold,
                    startwn=condition_info.whiten_sample_rate // 2,
                    stopwn=condition_info.whiten_sample_rate // 2,
                    invert=True,
                ),
                link_map={
                    ifo + "_Threshold:snk:" + ifo: ifo + "_Whitener:src:" + ifo,
                },
            )
            condition_out_links[ifo] = ifo + "_Threshold:src:" + ifo  # type: ignore
        else:
            condition_out_links[ifo] = ifo + "_Whitener:src:" + ifo  # type: ignore

        if whiten_latency is True:
            pipeline.insert(
                Latency(
                    name=ifo + "_Latency",
                    source_pad_names=(ifo,),
                    sink_pad_names=(ifo,),
                    route=ifo + "_whitening_latency",
                    interval=1,
                ),
                link_map={
                    ifo + "_Latency:snk:" + ifo: ifo + "_Whitener:src:" + ifo,
                },
            )
            whiten_latency_out_links[ifo] = ifo + "_Latency:src:" + ifo  # type: ignore

    return condition_out_links, spectrum_out_links, whiten_latency_out_links