Skip to content
Snippets Groups Projects
affine_matrix.py 2.96 KiB
Newer Older
  • Learn to ignore specific revisions
  • Cain, Payton David's avatar
    Cain, Payton David committed
    from obspy import UTCDateTime
    from typing import Optional
    import typer
    
    from ..adjusted.Affine import Affine
    
    from ..residual import Reading, SpreadsheetSummaryFactory, WebAbsolutesFactory
    from ..metadata import (
        GEOMAG_API_URL,
        Metadata,
        MetadataCategory,
        MetadataFactory,
        MetadataQuery,
    )
    
    class InputFactory(str, Enum):
        METADATA = "metadata"
        SPREADSHEET = "spreadsheet"
        WEBABSOLUTES = "webabsolutes"
    
    
    
    Cain, Payton David's avatar
    Cain, Payton David committed
    def main():
        typer.run(generate_matrix)
    
    
    def generate_matrix(
        observatory: str,
    
        starttime: str,
        endtime: str,
        readings_starttime: str,
        readings_endtime: str,
    
        input_factory: InputFactory = InputFactory.WEBABSOLUTES,
    
        metadata_url: str = GEOMAG_API_URL,
        output_file: Optional[str] = None,
        output_metadata: bool = False,
    
    Cain, Payton David's avatar
    Cain, Payton David committed
        spreadsheet_directory: Optional[str] = None,
        webabsolutes_url: Optional[
            str
        ] = "https://geomag.usgs.gov/baselines/observation.json.php",
    
    Cain, Payton David's avatar
    Cain, Payton David committed
    ):
    
        if input_factory == InputFactory.METADATA:
            metadata = MetadataFactory(url=metadata_url).get_metadata(
                query=MetadataQuery(
                    station=observatory,
                    starttime=readings_starttime,
                    endtime=readings_endtime,
                    category=MetadataCategory.READING,
                    data_valid=True,
                    metadata_valid=True,
                )
            )
            readings = [Reading(**m.metadata) for m in metadata]
        elif input_factory == InputFactory.SPREADSHEET:
    
    Cain, Payton David's avatar
    Cain, Payton David committed
            readings = SpreadsheetSummaryFactory(
                base_directory=spreadsheet_directory
            ).get_readings(
                observatory=observatory,
    
                starttime=UTCDateTime(readings_starttime),
                endtime=UTCDateTime(readings_endtime),
    
    Cain, Payton David's avatar
    Cain, Payton David committed
            )
    
        elif input_factory == InputFactory.WEBABSOLUTES:
    
    Cain, Payton David's avatar
    Cain, Payton David committed
            readings = WebAbsolutesFactory(url=webabsolutes_url).get_readings(
                observatory=observatory,
    
                starttime=UTCDateTime(readings_starttime),
                endtime=UTCDateTime(readings_endtime),
    
    Cain, Payton David's avatar
    Cain, Payton David committed
            )
    
        # calculate one affine matrix between starttime and endtime
    
    Cain, Payton David's avatar
    Cain, Payton David committed
        result = Affine(
            observatory=observatory,
    
            starttime=UTCDateTime(starttime),
            endtime=UTCDateTime(endtime),
    
    Cain, Payton David's avatar
    Cain, Payton David committed
        ).calculate(readings=readings)[0]
    
    
        if output_metadata:
            MetadataFactory(url=metadata_url).create_metadata(
                metadata=Metadata(
                    station=observatory,
                    created_by="generate_matrix",
                    metadata=result.dict(),
    
                    starttime=result.starttime,
                    endtime=result.endtime,
    
                    network="NT",
                    category=MetadataCategory.ADJUSTED_MATRIX,
    
                    comment=f"calculated from {readings_starttime} to {readings_endtime}",
    
                )
            )
    
        if output_file:
            with open(output_file, "w") as file: