20
20
import warnings
21
21
import xml .etree .ElementTree as ET
22
22
from typing import List , Optional , Tuple , Dict , Set , Union
23
- from dataclasses import dataclass
24
23
from datetime import datetime , timezone , timedelta
25
24
26
25
import astropy .table
29
28
import keyring
30
29
import requests .exceptions
31
30
from astropy .table import Table , Column
32
- from astropy .utils .decorators import deprecated , deprecated_renamed_argument
31
+ from astropy .utils .decorators import deprecated_renamed_argument
33
32
from bs4 import BeautifulSoup
34
33
import pyvo
35
34
@@ -67,20 +66,15 @@ def expired(self) -> bool:
67
66
return time .time () > self .expiration_time - 600
68
67
69
68
70
- @dataclass
71
- class QueryOnField :
72
- table_name : str
73
- column_name : str
69
+ class EsoNames :
70
+ raw_table = "dbo.raw"
71
+ phase3_table = "ivoa.ObsCore"
72
+ raw_instruments_column = "instrument"
73
+ phase3_collections_column = "obs_collection"
74
74
75
-
76
- QueryOnInstrument = QueryOnField (
77
- table_name = "dbo.raw" , # This should be ist.<instrument_name>
78
- column_name = "instrument" )
79
-
80
-
81
- QueryOnCollection = QueryOnField (
82
- table_name = "ivoa.ObsCore" ,
83
- column_name = "obs_collection" )
75
+ @staticmethod
76
+ def ist_table (instrument_name ):
77
+ return f"ist.{ instrument_name } "
84
78
85
79
86
80
class EsoClass (QueryWithLogin ):
@@ -104,10 +98,6 @@ def __init__(self, timeout=None):
104
98
def timeout (self ):
105
99
return self ._timeout
106
100
107
- # The logging module needs strings
108
- # written in %s style. This wrappers
109
- # are used for that purpose.
110
- # [W1203 - logging-fstring-interpolation]
111
101
@staticmethod
112
102
def log_info (message ):
113
103
"Wrapper for logging function"
@@ -321,8 +311,8 @@ def list_collections(self, *, cache=True) -> List[str]:
321
311
"""
322
312
if self ._collections is None :
323
313
self ._collections = []
324
- c = QueryOnCollection . column_name
325
- t = QueryOnCollection . table_name
314
+ t = EsoNames . phase3_table
315
+ c = EsoNames . phase3_collections_column
326
316
query_str = f"select distinct { c } from { t } "
327
317
res = self .query_tap_service (query_str , cache = cache )[c ].data
328
318
@@ -343,30 +333,29 @@ def print_table_help(self, table_name: str) -> None:
343
333
self .log_info (f"\n Columns present in the table { table_name } :\n { available_cols } \n " )
344
334
astropy .conf .max_lines = n_
345
335
346
- def _query_instrument_or_collection (self ,
347
- query_on : QueryOnField ,
348
- collections : Union [ List [ str ], str ], * ,
349
- ra : float = None , dec : float = None , radius : float = None ,
350
- column_filters : Dict = None ,
351
- columns : Union [List , str ] = None ,
352
- print_help = False , cache = True ,
353
- ** kwargs ) -> astropy .table .Table :
336
+ def _query_on_allowed_values (self ,
337
+ table_name : str ,
338
+ column_name : str ,
339
+ allowed_values : Union [ List [ str ], str ] = None , * ,
340
+ ra : float = None , dec : float = None , radius : float = None ,
341
+ columns : Union [List , str ] = None ,
342
+ print_help = False , cache = True ,
343
+ ** kwargs ) -> astropy .table .Table :
354
344
"""
355
345
Query instrument- or collection-specific data contained in the ESO archive.
356
346
- instrument-specific data is raw
357
347
- collection-specific data is processed
358
348
"""
359
- column_filters = column_filters or {}
360
349
columns = columns or []
361
- filters = {** dict (kwargs ), ** column_filters }
350
+ filters = {** dict (kwargs )}
362
351
363
352
if print_help :
364
- self .print_table_help (query_on . table_name )
353
+ self .print_table_help (table_name )
365
354
return
366
355
367
- if (('box' in filters . keys () )
368
- or ('coord1' in filters . keys () )
369
- or ('coord2' in filters . keys () )):
356
+ if (('box' in filters )
357
+ or ('coord1' in filters )
358
+ or ('coord2' in filters )):
370
359
message = 'box, coord1 and coord2 are deprecated; use ra, dec and radius instead'
371
360
raise ValueError (message )
372
361
@@ -375,125 +364,65 @@ def _query_instrument_or_collection(self,
375
364
message += f"Values provided: ra = { ra } , dec = { dec } , radius = { radius } "
376
365
raise ValueError (message )
377
366
378
- if isinstance (collections , str ):
379
- collections = _split_str_as_list_of_str (collections )
367
+ where_collections_strlist = []
368
+ if allowed_values :
369
+ if isinstance (allowed_values , str ):
370
+ allowed_values = _split_str_as_list_of_str (allowed_values )
380
371
381
- collections = list (map (lambda x : f"'{ x .strip ()} '" , collections ))
382
- where_collections_str = f"{ query_on . column_name } in (" + ", " .join (collections ) + ")"
372
+ allowed_values = list (map (lambda x : f"'{ x .strip ()} '" , allowed_values ))
373
+ where_collections_strlist = [ f"{ column_name } in (" + ", " .join (allowed_values ) + ")" ]
383
374
384
375
where_constraints_strlist = [f"{ k } = { adql_sanitize_val (v )} " for k , v in filters .items ()]
385
- where_constraints = [ where_collections_str ] + where_constraints_strlist
386
- query = py2adql (table = query_on . table_name , columns = columns ,
376
+ where_constraints = where_collections_strlist + where_constraints_strlist
377
+ query = py2adql (table = table_name , columns = columns ,
387
378
ra = ra , dec = dec , radius = radius ,
388
379
where_constraints = where_constraints ,
389
380
top = self .ROW_LIMIT )
390
381
391
382
return self .query_tap_service (query_str = query , cache = cache )
392
383
393
- @deprecated_renamed_argument (('open_form' , 'help' ), (None , 'print_help' ),
394
- since = ['0.4.8' , '0.4.8' ])
395
- def query_instrument (self , instrument : Union [List , str ] = None , * ,
396
- ra : float = None , dec : float = None , radius : float = None ,
397
- column_filters : Dict = None , columns : Union [List , str ] = None ,
398
- open_form = False , print_help = False , cache = True ,
399
- ** kwargs ) -> astropy .table .Table :
400
- _ = open_form
401
- return self ._query_instrument_or_collection (query_on = QueryOnInstrument ,
402
- collections = instrument ,
403
- ra = ra , dec = dec , radius = radius ,
404
- column_filters = column_filters ,
405
- columns = columns ,
406
- print_help = print_help ,
407
- cache = cache ,
408
- ** kwargs )
409
-
410
- @deprecated_renamed_argument (('open_form' , 'help' ), (None , 'print_help' ),
411
- since = ['0.4.8' , '0.4.8' ])
412
- def query_collections (self , collections : Union [List , str ] = None , * ,
384
+ def query_collections (self ,
385
+ collections : Union [List [str ], str ], * ,
413
386
ra : float = None , dec : float = None , radius : float = None ,
414
- column_filters : Dict = None , columns : Union [List , str ] = None ,
415
- open_form = False , print_help = False , cache = True ,
387
+ columns : Union [List , str ] = None ,
388
+ print_help = False , cache = True ,
416
389
** kwargs ) -> astropy .table .Table :
417
- column_filters = column_filters or {}
418
- columns = columns or []
419
- _ = open_form
420
- return self ._query_instrument_or_collection (query_on = QueryOnCollection ,
421
- collections = collections ,
422
- ra = ra , dec = dec , radius = radius ,
423
- column_filters = column_filters ,
424
- columns = columns ,
425
- print_help = print_help ,
426
- cache = cache ,
427
- ** kwargs )
428
-
429
- @deprecated_renamed_argument (old_name = 'help' , new_name = 'print_help' , since = '0.4.8' )
430
- def query_raw (self , * ,
431
- ra : float = None , dec : float = None , radius : float = None ,
432
- column_filters = None , columns = None ,
433
- print_help = False , cache = True , ** kwargs ):
434
- """
435
- Query raw data contained in the ESO archive.
436
-
437
- Returns
438
- -------
439
- table : `~astropy.table.Table`, the number of rows
440
- capped by the ROW_LIMIT configuration item.
441
- """
442
- column_filters = column_filters or {}
443
- columns = columns or []
444
- filters = {** dict (kwargs ), ** column_filters }
445
- table_name = "dbo.raw"
446
-
447
- if print_help :
448
- self .print_table_help (table_name = table_name )
449
- return
450
-
451
- where_constraints_strlist = [f"{ k } = { adql_sanitize_val (v )} " for k , v in filters .items ()]
452
- where_constraints = where_constraints_strlist
453
-
454
-
455
- query = py2adql (table = table_name ,
456
- columns = columns ,
457
- ra = ra , dec = dec , radius = radius ,
458
- where_constraints = where_constraints ,
459
- top = self .ROW_LIMIT )
460
-
461
- return self .query_tap_service (query_str = query , cache = cache )
462
-
463
- @deprecated_renamed_argument (old_name = 'help' , new_name = 'print_help' , since = '0.4.8' )
464
- def query_prods (self , * ,
390
+ return self ._query_on_allowed_values (table_name = EsoNames .phase3_table ,
391
+ column_name = EsoNames .phase3_collections_column ,
392
+ allowed_values = collections ,
393
+ ra = ra , dec = dec , radius = radius ,
394
+ columns = columns ,
395
+ print_help = print_help , cache = cache ,
396
+ ** kwargs )
397
+
398
+ def query_main (self ,
399
+ instruments : Union [List [str ], str ] = None , * ,
465
400
ra : float = None , dec : float = None , radius : float = None ,
466
- column_filters = None , columns = None ,
467
- print_help = False , cache = True , ** kwargs ):
468
- """
469
- Query processed data contained in the ESO archive.
470
-
471
- Returns
472
- -------
473
- table : `~astropy.table.Table`, the number of rows
474
- capped by the ROW_LIMIT configuration item.
475
- """
476
- column_filters = column_filters or {}
477
- columns = columns or []
478
- filters = {** dict (kwargs ), ** column_filters }
479
-
480
- where_constraints_strlist = [f"{ k } = { adql_sanitize_val (v )} " for k , v in filters .items ()]
481
- where_constraints = where_constraints_strlist
482
-
483
- if print_help :
484
- help_query = \
485
- "select column_name, datatype from TAP_SCHEMA.columns where table_name = 'ivoa.ObsCore'"
486
- h = self .query_tap_service (help_query , cache = cache )
487
- self .log_info (f"Columns present in the table: { h } " )
488
- return
489
-
490
- query = py2adql (table = "ivoa.ObsCore" ,
491
- columns = columns ,
492
- ra = ra , dec = dec , radius = radius ,
493
- where_constraints = where_constraints ,
494
- top = self .ROW_LIMIT )
495
-
496
- return self .query_tap_service (query_str = query , cache = cache )
401
+ columns : Union [List , str ] = None ,
402
+ print_help = False , cache = True ,
403
+ ** kwargs ) -> astropy .table .Table :
404
+ return self ._query_on_allowed_values (table_name = EsoNames .raw_table ,
405
+ column_name = EsoNames .raw_instruments_column ,
406
+ allowed_values = instruments ,
407
+ ra = ra , dec = dec , radius = radius ,
408
+ columns = columns ,
409
+ print_help = print_help , cache = cache ,
410
+ ** kwargs )
411
+
412
+ # ex query_instrument
413
+ def query_instrument (self ,
414
+ instrument : str , * ,
415
+ ra : float = None , dec : float = None , radius : float = None ,
416
+ columns : Union [List , str ] = None ,
417
+ print_help = False , cache = True ,
418
+ ** kwargs ) -> astropy .table .Table :
419
+ return self ._query_on_allowed_values (table_name = EsoNames .ist_table (instrument ),
420
+ column_name = None ,
421
+ allowed_values = None ,
422
+ ra = ra , dec = dec , radius = radius ,
423
+ columns = columns ,
424
+ print_help = print_help , cache = cache ,
425
+ ** kwargs )
497
426
498
427
def get_headers (self , product_ids , * , cache = True ):
499
428
"""
@@ -821,21 +750,5 @@ def query_apex_quicklooks(self, *, project_id=None, print_help=False,
821
750
else :
822
751
raise NotImplementedError
823
752
824
- @deprecated (since = "v0.4.8" , message = ("The ESO list_surveys function is deprecated,"
825
- "Use the list_collections function instead." ))
826
- def list_surveys (self , * args , ** kwargs ):
827
- if "surveys" in kwargs :
828
- kwargs ["collections" ] = kwargs ["surveys" ]
829
- del kwargs ["surveys" ]
830
- return self .list_collections (* args , ** kwargs )
831
-
832
- @deprecated (since = "v0.4.8" , message = ("The ESO query_surveys function is deprecated,"
833
- "Use the query_collections function instead." ))
834
- def query_surveys (self , * args , ** kwargs ):
835
- if "surveys" in kwargs :
836
- kwargs ["collections" ] = kwargs ["surveys" ]
837
- del kwargs ["surveys" ]
838
- return self .query_collections (* args , ** kwargs )
839
-
840
753
841
754
Eso = EsoClass ()
0 commit comments