arvi 0.2.3__py3-none-any.whl → 0.2.5__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
arvi/config.py CHANGED
@@ -8,6 +8,7 @@ def get_config_path():
8
8
 
9
9
  def get_config():
10
10
  config = configparser.ConfigParser()
11
+ config.add_section('config')
11
12
  if (path := get_config_path()).exists():
12
13
  config.read(path)
13
14
  return config
@@ -33,6 +34,8 @@ class config:
33
34
  'request_as_public': False,
34
35
  # enable from arvi import star_name
35
36
  'fancy_import': True,
37
+ # use the 'dark_background' matplotlib theme
38
+ 'dark_plots': False,
36
39
  # debug
37
40
  'debug': False,
38
41
  }
arvi/dace_wrapper.py CHANGED
@@ -7,7 +7,7 @@ from itertools import islice
7
7
  import numpy as np
8
8
 
9
9
  from .setup_logger import setup_logger
10
- from .utils import create_directory, all_logging_disabled, stdout_disabled, tqdm
10
+ from .utils import create_directory, all_logging_disabled, stdout_disabled, timer, tqdm
11
11
 
12
12
 
13
13
  def load_spectroscopy(user=None):
@@ -47,8 +47,9 @@ def load_spectroscopy(user=None):
47
47
  logger.warning('requesting DACE data as public (no .dacerc file found)')
48
48
  return default_Spectroscopy
49
49
 
50
- @lru_cache()
51
- def get_dace_id(star, verbose=True):
50
+
51
+ @lru_cache(maxsize=1024)
52
+ def get_dace_id(star, verbose=True, raise_error=False):
52
53
  logger = setup_logger()
53
54
  filters = {"obj_id_catname": {"equal": [star]}}
54
55
  try:
@@ -58,8 +59,11 @@ def get_dace_id(star, verbose=True):
58
59
  except KeyError:
59
60
  if verbose:
60
61
  logger.error(f"Could not find DACE ID for {star}")
62
+ if not raise_error:
63
+ return None
61
64
  raise ValueError from None
62
65
 
66
+
63
67
  def get_arrays(result, latest_pipeline=True, ESPRESSO_mode='HR11', NIRPS_mode='HE', verbose=True):
64
68
  logger = setup_logger()
65
69
  arrays = []
@@ -70,7 +74,6 @@ def get_arrays(result, latest_pipeline=True, ESPRESSO_mode='HR11', NIRPS_mode='H
70
74
 
71
75
  # select ESPRESSO mode, which is defined at the level of the pipeline
72
76
  if 'ESPRESSO' in inst:
73
-
74
77
  find_mode = [ESPRESSO_mode in pipe for pipe in pipelines]
75
78
  # the mode was not found
76
79
  if not any(find_mode):
@@ -83,6 +86,11 @@ def get_arrays(result, latest_pipeline=True, ESPRESSO_mode='HR11', NIRPS_mode='H
83
86
  i = [i for i, pipe in enumerate(pipelines) if ESPRESSO_mode in pipe][0]
84
87
  pipelines = [pipelines[i]]
85
88
 
89
+ # select NIRPS mode
90
+ if 'NIRPS' in inst:
91
+ if any(this_mode := [p for p in pipelines if NIRPS_mode in p]):
92
+ pipelines = this_mode
93
+
86
94
  if latest_pipeline:
87
95
  npipe = len(pipelines)
88
96
  if 'NIRPS' in inst and any(['LBL' in p for p in pipelines]):
@@ -161,19 +169,19 @@ def get_observations_from_instrument(star, instrument, user=None, main_id=None,
161
169
  dictionary with data from DACE
162
170
  """
163
171
  Spectroscopy = load_spectroscopy(user)
164
-
165
172
  found_dace_id = False
166
- try:
167
- dace_id = get_dace_id(star, verbose=verbose)
168
- found_dace_id = True
169
- except ValueError as e:
170
- if main_id is not None:
171
- try:
172
- dace_id = get_dace_id(main_id, verbose=verbose)
173
- found_dace_id = True
174
- except ValueError:
175
- pass
176
-
173
+ with timer('simbad query'):
174
+ try:
175
+ dace_id = get_dace_id(star, verbose=verbose, raise_error=True)
176
+ found_dace_id = True
177
+ except ValueError as e:
178
+ if main_id is not None:
179
+ try:
180
+ dace_id = get_dace_id(main_id, verbose=verbose, raise_error=True)
181
+ found_dace_id = True
182
+ except ValueError:
183
+ pass
184
+
177
185
  if not found_dace_id:
178
186
  try:
179
187
  with all_logging_disabled():
@@ -184,11 +192,16 @@ def get_observations_from_instrument(star, instrument, user=None, main_id=None,
184
192
  except TypeError:
185
193
  msg = f'no {instrument} observations for {star}'
186
194
  raise ValueError(msg) from None
187
-
188
- filters = {
189
- "ins_name": {"contains": [instrument]},
190
- "obj_id_daceid": {"contains": [dace_id]}
191
- }
195
+ if (isinstance(instrument, str)):
196
+ filters = {
197
+ "ins_name": {"contains": [instrument]},
198
+ "obj_id_daceid": {"contains": [dace_id]}
199
+ }
200
+ elif (isinstance(instrument, list)):
201
+ filters = {
202
+ "ins_name": {"contains": instrument},
203
+ "obj_id_daceid": {"contains": [dace_id]}
204
+ }
192
205
  with all_logging_disabled():
193
206
  result = Spectroscopy.query_database(filters=filters)
194
207
 
@@ -299,12 +312,14 @@ def get_observations(star, instrument=None, user=None, main_id=None, verbose=Tru
299
312
  result[inst] = dict(result[inst])
300
313
  #
301
314
 
302
- instruments = list(result.keys())
315
+ instruments = list(map(str, result.keys()))
303
316
 
304
317
  if instrument is not None:
305
318
  # select only the provided instrument (if it's there)
306
- instruments = [inst for inst in instruments if instrument in inst]
307
-
319
+ if (isinstance(instrument, str)):
320
+ instruments = [inst for inst in instruments if instrument in inst]
321
+ elif (isinstance(instrument, list)):
322
+ instruments = [inst for inst in instruments if any(i in inst for i in instrument)]
308
323
  if len(instruments) == 0:
309
324
  if instrument is None:
310
325
  msg = f'no observations for {star}'
@@ -328,30 +343,53 @@ def get_observations(star, instrument=None, user=None, main_id=None, verbose=Tru
328
343
  # else:
329
344
  # return -1
330
345
 
331
- # sort pipelines, must be extra careful with HARPS/HARPN pipeline version numbers
332
- # got here with the help of DeepSeek
333
- from re import match
334
- def custom_sort_key(s):
335
- s = s[0]
336
- # Check for version number pattern (e.g., 3.2.5 or 3.2.5-EGGS)
337
- version_match = match(r'^(\d+(?:\.\d+)*)(?:[-\s](.*))?$', s)
338
- if version_match:
339
- version_parts = list(map(int, version_match.group(1).split('.')))
340
- if len(version_parts) == 2:
341
- version_parts.insert(1, -1)
342
- return (0, 1, version_parts)
343
- # Check for scientific reference pattern (e.g., 2004A&A...)
344
- year_match = match(r'^(\d{4})', s)
345
- if year_match:
346
- year = int(year_match.group(1))
347
- return (1, year)
348
- # For all other strings, sort alphabetically
349
- return (2, s)
350
-
351
- # from functools import cmp_to_key
346
+ # # sort pipelines, must be extra careful with HARPS/HARPN pipeline version numbers
347
+ # # got here with the help of DeepSeek
348
+ # # from functools import cmp_to_key
349
+ # from re import match
350
+ # def custom_sort_key(s):
351
+ # s = s[0]
352
+ # # Check for version number pattern (e.g., 3.2.5 or 3.2.5-EGGS)
353
+ # version_match = match(r'^(\d+(?:\.\d+)*)(?:[-\s](.*))?$', s)
354
+ # if version_match:
355
+ # version_parts = list(map(int, version_match.group(1).split('.')))
356
+ # if len(version_parts) == 2:
357
+ # version_parts.insert(1, -1)
358
+ # # if version_match.group(2) and 'LBL' in version_match.group(2):
359
+ # # version_parts.append(-1)
360
+ # # else:
361
+ # # version_parts.append(0)
362
+ # if version_match.group(2) is None:
363
+ # version_parts.append('')
364
+ # else:
365
+ # version_parts.append(version_match.group(2))
366
+ # return (0, 1, version_parts)
367
+ # # Check for scientific reference pattern (e.g., 2004A&A...)
368
+ # year_match = match(r'^(\d{4})', s)
369
+ # if year_match:
370
+ # year = int(year_match.group(1))
371
+ # return (1, year)
372
+ # # For all other strings, sort alphabetically
373
+ # return (2, s)
374
+
375
+ def custom_key(val):
376
+ key = 0
377
+ key -= 2 if val == '3.5' else 0
378
+ key -= 1 if 'EGGS' in val else 0
379
+ key -= 1 if ('UHR' in val or 'MR' in val) else 0
380
+ key -= 1 if 'LBL' in val else 0
381
+ return str(key) if key != 0 else val
382
+
352
383
  new_result = {}
353
384
  for inst in instruments:
354
- new_result[inst] = dict(sorted(result[inst].items(), key=custom_sort_key, reverse=True))
385
+ # new_result[inst] = dict(
386
+ # sorted(result[inst].items(), key=custom_sort_key, reverse=True)
387
+ # )
388
+ # WARNING: not the same as reverse=True (not sure why)
389
+ sorted_keys = sorted(result[inst].keys(), key=custom_key)[::-1]
390
+ new_result[inst] = {}
391
+ for key in sorted_keys:
392
+ new_result[inst][key] = result[inst][key]
355
393
 
356
394
  if verbose:
357
395
  logger.info('RVs available from')
@@ -385,7 +423,7 @@ def check_existing(output_directory, files, type):
385
423
  ]
386
424
 
387
425
  if type == 'S2D':
388
- existing = [
426
+ existing += [
389
427
  f.partition('.fits')[0] for f in os.listdir(output_directory)
390
428
  if 'e2ds' in f
391
429
  ]
@@ -503,7 +541,7 @@ def do_download_filetype(type, raw_files, output_directory, clobber=False, user=
503
541
  # check existing files to avoid re-downloading
504
542
  if not clobber:
505
543
  raw_files = check_existing(output_directory, raw_files, type)
506
-
544
+
507
545
  n = raw_files.size
508
546
 
509
547
  # any file left to download?
@@ -5,7 +5,7 @@ from .setup_logger import setup_logger
5
5
  from .utils import ESPRESSO_ADC_issues, ESPRESSO_cryostat_issues
6
6
 
7
7
 
8
- # HARPS started operations in October 1st, 2003
8
+ # HARPS started operations on October 1st, 2003
9
9
  # https://www.eso.org/sci/facilities/lasilla/instruments/harps/news.html
10
10
  HARPS_start = 52913
11
11
 
@@ -21,6 +21,11 @@ HARPS_technical_intervention = 57170
21
21
  # when the instrument was handed back to Science Operations.
22
22
  HARPS_technical_intervention_range = (57161, 57176)
23
23
 
24
+
25
+ # ESPRESSO started operations on October 1st, 2018
26
+ # see Pepe et al. (2021, A&A 645, A96)
27
+ ESPRESSO_start = 58392
28
+
24
29
  # ESPRESSO fiber link upgrade (1 July 2019)
25
30
  ESPRESSO_technical_intervention = 58665
26
31
 
@@ -113,7 +118,7 @@ def check(self, instrument):
113
118
 
114
119
  # HARPS commissioning
115
120
  def HARPS_commissioning(self, mask=True, plot=True):
116
- """ Identify and optionally mask points during HARPS commissioning (HARPS).
121
+ """ Identify and optionally mask points during HARPS commissioning.
117
122
 
118
123
  Args:
119
124
  mask (bool, optional):
@@ -175,6 +180,38 @@ def HARPS_fiber_commissioning(self, mask=True, plot=True):
175
180
  return affected
176
181
 
177
182
 
183
+ # ESPRESSO commissioning
184
+ def ESPRESSO_commissioning(self, mask=True, plot=True):
185
+ """ Identify and optionally mask points during ESPRESSO commissioning.
186
+
187
+ Args:
188
+ mask (bool, optional):
189
+ Whether to mask out the points.
190
+ plot (bool, optional):
191
+ Whether to plot the masked points.
192
+ """
193
+ logger = setup_logger()
194
+ if check(self, 'ESPRESSO') is None:
195
+ return
196
+
197
+ affected = self.time < ESPRESSO_start
198
+ total_affected = affected.sum()
199
+
200
+ if self.verbose:
201
+ n = total_affected
202
+ logger.info(f"there {'are'[:n^1]}{'is'[n^1:]} {n} frame{'s'[:n^1]} "
203
+ "during ESPRESSO commissioning")
204
+
205
+ if mask:
206
+ self.mask[affected] = False
207
+ self._propagate_mask_changes()
208
+
209
+ if plot:
210
+ self.plot(show_masked=True)
211
+
212
+ return affected
213
+
214
+
178
215
  # ESPRESSO ADC issues
179
216
  def ADC_issues(self, mask=True, plot=True, check_headers=False):
180
217
  """ Identify and optionally mask points affected by ADC issues (ESPRESSO).
@@ -316,31 +353,25 @@ class ISSUES:
316
353
  plot (bool, optional): Whether to plot the masked points.
317
354
  """
318
355
  logger = setup_logger()
319
- try:
320
- adc = ADC_issues(self, mask, plot, **kwargs)
321
- except IndexError:
322
- logger.error('are the data binned? cannot proceed to mask these points...')
323
-
324
- try:
325
- cryostat = blue_cryostat_issues(self, mask, plot)
326
- except IndexError:
327
- logger.error('are the data binned? cannot proceed to mask these points...')
328
-
329
- try:
330
- harps_comm = HARPS_commissioning(self, mask, plot)
331
- except IndexError:
332
- logger.error('are the data binned? cannot proceed to mask these points...')
333
-
334
- try:
335
- harps_fibers = HARPS_fiber_commissioning(self, mask, plot)
336
- except IndexError:
337
- logger.error('are the data binned? cannot proceed to mask these points...')
338
356
 
339
- # if None in (adc, cryostat, harps_comm, harps_fibers):
340
- # return
357
+ functions = (
358
+ ESPRESSO_commissioning,
359
+ ADC_issues,
360
+ blue_cryostat_issues,
361
+ HARPS_commissioning,
362
+ HARPS_fiber_commissioning
363
+ )
364
+ results = []
365
+
366
+ for fun in functions:
367
+ try:
368
+ results.append(fun(self, mask, plot, **kwargs))
369
+ except IndexError:
370
+ logger.error('are the data binned? cannot proceed to mask these points...')
371
+
372
+ results = list(filter(lambda x: x is not None, results))
341
373
 
342
374
  try:
343
- # return adc | cryostat
344
- return np.logical_or.reduce((adc, cryostat, harps_comm, harps_fibers))
375
+ return np.logical_or.reduce(results)
345
376
  except UnboundLocalError:
346
377
  return
arvi/plots.py CHANGED
@@ -13,10 +13,12 @@ from .utils import lazy_import
13
13
  plt = lazy_import('matplotlib.pyplot')
14
14
 
15
15
 
16
- def plot_fast(func):
16
+ def plot_settings(func):
17
17
  @wraps(func)
18
18
  def wrapper(*args, **kwargs):
19
- with plt.style.context('fast'):
19
+ # with plt.style.context('fast'):
20
+ theme = 'dark_background' if config.dark_plots else 'fast'
21
+ with plt.style.context(theme):
20
22
  return func(*args, **kwargs)
21
23
  return wrapper
22
24
 
@@ -135,7 +137,7 @@ def clickable_legend(fig, ax, leg):
135
137
  pass
136
138
  return on_pick_legend
137
139
 
138
- # @plot_fast
140
+ @plot_settings
139
141
  def plot(self, ax=None, show_masked=False, instrument=None, time_offset=0,
140
142
  remove_50000=False, tooltips=True, show_title=False, show_legend=True, label=None,
141
143
  jitter=None, N_in_label=False, versus_n=False, show_histogram=False, bw=False, **kwargs):
@@ -403,7 +405,7 @@ def plot(self, ax=None, show_masked=False, instrument=None, time_offset=0,
403
405
  return fig, ax
404
406
 
405
407
 
406
- @plot_fast
408
+ # @plot_fast
407
409
  def plot_quantity(self, quantity, ax=None, show_masked=False, instrument=None,
408
410
  time_offset=0, remove_50000=False, tooltips=False, show_legend=True,
409
411
  N_in_label=False, **kwargs):
@@ -506,7 +508,88 @@ plot_rhk = partialmethod(plot_quantity, quantity='rhk')
506
508
  plot_berv = partialmethod(plot_quantity, quantity='berv')
507
509
 
508
510
 
509
- @plot_fast
511
+ def plot_xy(self, x, y, ax=None, instrument=None, show_legend=True, **kwargs):
512
+ logger = setup_logger()
513
+ if self.N == 0:
514
+ if self.verbose:
515
+ logger.error('no data to plot')
516
+ return
517
+
518
+ if ax is None:
519
+ fig, ax = plt.subplots(1, 1, constrained_layout=True)
520
+ else:
521
+ fig = ax.figure
522
+
523
+ kwargs.setdefault('marker', 'o')
524
+ kwargs.setdefault('ls', '')
525
+ kwargs.setdefault('capsize', 0)
526
+ kwargs.setdefault('ms', 4)
527
+
528
+ instruments = self._check_instrument(instrument)
529
+
530
+ for inst in instruments:
531
+ s = self if self._child else getattr(self, inst)
532
+ label = inst
533
+
534
+ missing = False
535
+ try:
536
+ xdata = getattr(s, x).copy()
537
+ except AttributeError:
538
+ missing = True
539
+ try:
540
+ e_xdata = getattr(s, x + '_err').copy()
541
+ except AttributeError:
542
+ e_xdata = np.zeros_like(xdata)
543
+
544
+ try:
545
+ ydata = getattr(s, y).copy()
546
+ except AttributeError:
547
+ missing = True
548
+ try:
549
+ e_ydata = getattr(s, y + '_err').copy()
550
+ except AttributeError:
551
+ e_ydata = np.zeros_like(ydata)
552
+
553
+ if missing:
554
+ lines, *_ = ax.errorbar([], [], [],
555
+ label=label, picker=True, **kwargs)
556
+ continue
557
+
558
+ ax.errorbar(xdata[s.mask], ydata[s.mask], e_xdata[s.mask], e_ydata[s.mask],
559
+ label=label, **kwargs)
560
+
561
+ # if show_masked:
562
+ # ax.errorbar(self.time[~self.mask] - time_offset,
563
+ # getattr(self, quantity)[~self.mask],
564
+ # getattr(self, quantity + '_err')[~self.mask],
565
+ # label='masked', fmt='x', ms=10, color='k', zorder=-2)
566
+
567
+ if show_legend:
568
+ leg = ax.legend()
569
+ on_pick_legend = clickable_legend(fig, ax, leg)
570
+ plt.connect('pick_event', on_pick_legend)
571
+
572
+ ax.minorticks_on()
573
+
574
+ delta = 'Δ' if self._did_adjust_means else ''
575
+
576
+ # ylabel = {
577
+ # quantity.lower(): quantity,
578
+ # 'fwhm': f'{delta}FWHM [{self.units}]',
579
+ # 'bispan': f'{delta}BIS [{self.units}]',
580
+ # 'rhk': r"$\log$ R'$_{HK}$",
581
+ # 'berv': 'BERV [km/s]',
582
+ # }
583
+
584
+ # ax.set_ylabel(ylabel[quantity.lower()])
585
+
586
+ if config.return_self:
587
+ return self
588
+ else:
589
+ return fig, ax
590
+
591
+
592
+ # @plot_fast
510
593
  def gls(self, ax=None, label=None, instrument=None,
511
594
  fap=True, fap_method='baluev', adjust_means=config.adjust_means_gls,
512
595
  picker=True, **kwargs):
arvi/setup_logger.py CHANGED
@@ -6,7 +6,7 @@ def setup_logger():
6
6
  import marimo as mo
7
7
  if mo.running_in_notebook():
8
8
  raise NotImplementedError
9
- except NotImplementedError:
9
+ except (NotImplementedError, AttributeError):
10
10
  pass
11
11
  except (ImportError, ModuleNotFoundError):
12
12
  logger.remove()
arvi/timeseries.py CHANGED
@@ -55,7 +55,7 @@ class RV(ISSUES, REPORTS):
55
55
  Information on the target from Simbad
56
56
  """
57
57
  star: str
58
- instrument: str = field(init=True, repr=False, default=None)
58
+ instrument: Union[str, list] = field(init=True, repr=False, default=None)
59
59
  verbose: bool = field(init=True, repr=False, default=True)
60
60
  do_maxerror: Union[bool, float] = field(init=True, repr=False, default=False)
61
61
  do_secular_acceleration: bool = field(init=True, repr=False, default=True)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: arvi
3
- Version: 0.2.3
3
+ Version: 0.2.5
4
4
  Summary: The Automated RV Inspector
5
5
  Author-email: João Faria <joao.faria@unige.ch>
6
6
  License: MIT
@@ -23,7 +23,7 @@ Requires-Dist: kepmodel
23
23
  Dynamic: license-file
24
24
 
25
25
  <p align="center">
26
- <img width = "140" src="https://github.com/j-faria/arvi/blob/main/docs/logo/logo.png?raw=true"/>
26
+ <img width = "140" src="https://raw.githubusercontent.com/j-faria/arvi/refs/heads/main/docs/logo/logo.png"/>
27
27
  </p>
28
28
 
29
29
  This package sits alongside [DACE](https://dace.unige.ch/) to help with the
@@ -3,25 +3,25 @@ arvi/__init__.py,sha256=8IeHbu8LR1H3MxVi9aJHNpBU6SDbmzj9FZGKsiF0AKE,740
3
3
  arvi/ariadne_wrapper.py,sha256=YvilopJa9T4NwPcj3Nah_U8smSeSAU5-HYZMb_GJ-BQ,2232
4
4
  arvi/berv.py,sha256=eKnpuPC1w45UrUEyFRbs9F9j3bXz3kxYzNXbnRgvFQM,17596
5
5
  arvi/binning.py,sha256=NK9y9bUrdyWCbh79LkcRABHG-n5MtlETMHMvLj1z-OM,15437
6
- arvi/config.py,sha256=mqDYcxd8RLQz2L8x4GM6jGX8uG7FRFfz-yHGDmB08I8,2222
7
- arvi/dace_wrapper.py,sha256=TxHEtAKLhlrtQyEpZuDqa-CCT0Vz8UisvF1BTpHrnpw,23516
6
+ arvi/config.py,sha256=JkHSwF-EEqwwbcc8thGgbFc9udDZPjQH-9XFjqDepBY,2337
7
+ arvi/dace_wrapper.py,sha256=eWZiWrezCUh6X6H0_Mvse0-DxgD627DiYyzLJ1bWuQg,25257
8
8
  arvi/exofop_wrapper.py,sha256=8S7UEcrBAgANIweMV0-CvaWaVTPgGVo8vQQk_KRa0nU,2414
9
9
  arvi/extra_data.py,sha256=Xi65pI5kkzqlMmHGl9xFoumtH699611pJJ5PV-a_IfU,3397
10
10
  arvi/gaia_wrapper.py,sha256=jfBdK9N9ZOqHIzE5MRFmXNyN3PAOT_uzXM23MIy0POY,4371
11
11
  arvi/headers.py,sha256=uvdJebw1M5YkGjE3vJJwYBOnLikib75uuZE9FXB5JJM,1673
12
- arvi/instrument_specific.py,sha256=StRcHVDszm2a4yMWkO1pYYCsEWvXsS2ZtYTrSGD9JHM,11125
12
+ arvi/instrument_specific.py,sha256=DMvr9KiXpUGGajHeIcHCUiDmfaXhkrHpUU-aTLl39ZY,11676
13
13
  arvi/kima_wrapper.py,sha256=BvNTVqzM4lMNhLCyBFVh3T84hHfGKAFpgiYiOi4lh0g,2731
14
14
  arvi/lbl_wrapper.py,sha256=_ViGVkpakvuBR_xhu9XJRV5EKHpj5Go6jBZGJZMIS2Y,11850
15
15
  arvi/nasaexo_wrapper.py,sha256=mWt7eHgSZe4MBKCmUvMPTyUPGuiwGTqKugNBvmjOg9s,7306
16
- arvi/plots.py,sha256=4_xTrUFlR_6YyyVGlouoO1k9kndPa0s45mXGlXHjIF0,32839
16
+ arvi/plots.py,sha256=fHc6ScATCzvM4KQ77TYfHYmY6HSZ4N4oMYsLEUvxJpU,35279
17
17
  arvi/programs.py,sha256=BW7xBNKLei7NVLLW3_lsVskwzkaIoNRiHK2jn9Tn2ZM,8879
18
18
  arvi/reports.py,sha256=CKmtg5rewMyT26gbWeoZDYrL0z5Sbb6cTJry0HWk_rs,7445
19
- arvi/setup_logger.py,sha256=cdy2nG33TgcD-aRrDN8rbe0b3Kk-vwXhIe4hqQ-21fo,597
19
+ arvi/setup_logger.py,sha256=dHzO2gPjw6CaKWpYZd2f83z09tmxgi--qpp7k1jROjI,615
20
20
  arvi/simbad_wrapper.py,sha256=U1XmOR7bg_mq4KSutTgEsusjBph8BfEqHh-8YuHNMog,8629
21
21
  arvi/spectra.py,sha256=ebF1ocodTastLx0CyqLSpE8EZNDXBF8riyfxMr3L6H0,7491
22
22
  arvi/stats.py,sha256=ilzzGL9ew-SyVa9eEdrYCpD3DliOAwhoNUg9LIlHjzU,2583
23
23
  arvi/stellar.py,sha256=GQ7yweuBRnfkJ0M5eWjvLd8uvGq_by81PbXfidBvWis,4918
24
- arvi/timeseries.py,sha256=CCTcuA9vk3KUiXygsSgP9_pA0EeNdqh-tHHZUUuF4tA,90874
24
+ arvi/timeseries.py,sha256=XVFJoaIx_mD0pPmdPfGPDsYIgmasebk9yUtklnBkbqI,90887
25
25
  arvi/translations.py,sha256=PUSrn4zvYO2MqGzUxlFGwev_tBkgJaJrIYs6NKHzbWo,951
26
26
  arvi/utils.py,sha256=BZoafVF1TWCI44GSMi1o66kJ1wqihjaqpf3y1Q3XGlk,7103
27
27
  arvi/data/info.svg,sha256=0IMI6W-eFoTD8acnury79WJJakpBwLa4qKS4JWpsXiI,489
@@ -30,8 +30,8 @@ arvi/data/obs_affected_blue_cryostat_issues.dat,sha256=z4AK17xfz8tGTDv1FjRvQFnio
30
30
  arvi/data/extra/HD86226_PFS1.rdb,sha256=vfAozbrKHM_j8dYkCBJsuHyD01KEM1asghe2KInwVao,3475
31
31
  arvi/data/extra/HD86226_PFS2.rdb,sha256=F2P7dB6gVyzCglUjNheB0hIHVClC5RmARrGwbrY1cfo,4114
32
32
  arvi/data/extra/metadata.json,sha256=C69hIw6CohyES6BI9vDWjxwSz7N4VOYX0PCgjXtYFmU,178
33
- arvi-0.2.3.dist-info/licenses/LICENSE,sha256=6JfQgl7SpM55t0EHMFNMnNh-AdkpGW25MwMiTnhdWQg,1068
34
- arvi-0.2.3.dist-info/METADATA,sha256=vG_p_Iz1b4javtEhxs16KG-osWfRH6T2VjI0Q4dE6MI,1920
35
- arvi-0.2.3.dist-info/WHEEL,sha256=0CuiUZ_p9E4cD6NyLD6UG80LBXYyiSYZOKDm5lp32xk,91
36
- arvi-0.2.3.dist-info/top_level.txt,sha256=4EeiKDVLD45ztuflTGfQ3TU8GVjJg5Y95xS5XjI-utU,5
37
- arvi-0.2.3.dist-info/RECORD,,
33
+ arvi-0.2.5.dist-info/licenses/LICENSE,sha256=6JfQgl7SpM55t0EHMFNMnNh-AdkpGW25MwMiTnhdWQg,1068
34
+ arvi-0.2.5.dist-info/METADATA,sha256=qPQf7tZ_0acKhf_Y2KaZd-Xm7UMbEm8Xir7eE2ZG9j0,1932
35
+ arvi-0.2.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
36
+ arvi-0.2.5.dist-info/top_level.txt,sha256=4EeiKDVLD45ztuflTGfQ3TU8GVjJg5Y95xS5XjI-utU,5
37
+ arvi-0.2.5.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.3.1)
2
+ Generator: setuptools (80.9.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5