From c7a8bfde54c5d9ef6ea71e6b7094dd52932f407f Mon Sep 17 00:00:00 2001 From: Marc Pound <22331890+mpound@users.noreply.github.com> Date: Tue, 7 May 2024 14:45:57 -0400 Subject: [PATCH 01/14] fix internal references --- docs/source/for_beta_testers/beta_testing.rst | 4 ++-- docs/source/for_developers/github_integrations.rst | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/source/for_beta_testers/beta_testing.rst b/docs/source/for_beta_testers/beta_testing.rst index 40f9a028..ce8c2ff5 100644 --- a/docs/source/for_beta_testers/beta_testing.rst +++ b/docs/source/for_beta_testers/beta_testing.rst @@ -14,7 +14,7 @@ If you are interested in beta testing `dysh`, please contact Pedro Salas (psalas Providing feedback ================== -If you encounter a problem with `dysh`, would like to request a new feature or enhancement or would like to leave feedback, please do so using `GitHub issues `_. There are some basic instructions of how to do this :ref:`here `. This requires `creating a free account `_ on GitHub if you do not have one. +If you encounter a problem with `dysh`, would like to request a new feature or enhancement or would like to leave feedback, please do so using `GitHub issues `_. There are some basic instructions of how to do this :ref:`here `. This requires `creating a free account `_ on GitHub if you do not have one. If you prefer not to create a GitHub account, please provide your feedback to the `dysh-beta mailing list `_, or send an email to dysh-beta@googlegroups.com. Additionally, we will provide a `form for collecting feedback `_. @@ -40,7 +40,7 @@ Here are examples of feedback on GitHub * reporting an issue, `Issue #88 `_ * requesting a modification, `Issue #78 `_ -.. _beta-install +.. _beta-install: Installing `dysh` ================= diff --git a/docs/source/for_developers/github_integrations.rst b/docs/source/for_developers/github_integrations.rst index 481a7fb9..bf6c96c6 100644 --- a/docs/source/for_developers/github_integrations.rst +++ b/docs/source/for_developers/github_integrations.rst @@ -7,6 +7,8 @@ Actions Tests should be named `test_*.py` and located within a `tests` directory of their parent module. To define a workflow that runs the tests, create a new `.yml` file in `dysh/.github/workflows/`. +.. _githubissues: + Issues ====== From 33d48895c237fa2a8b9c3b4f874590a1085986a5 Mon Sep 17 00:00:00 2001 From: Marc Pound <22331890+mpound@users.noreply.github.com> Date: Tue, 7 May 2024 14:58:12 -0400 Subject: [PATCH 02/14] version 0.3.0b --- src/dysh/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dysh/__init__.py b/src/dysh/__init__.py index c3cdeabc..51f81e3b 100644 --- a/src/dysh/__init__.py +++ b/src/dysh/__init__.py @@ -1,6 +1,6 @@ """Top-level package for dysh.""" -__version__ = "0.2.1" +__version__ = "0.3.0b" all = ["version"] From 9dfeeea341f03c90c1baef98e846770b40f7126d Mon Sep 17 00:00:00 2001 From: Marc Pound <22331890+mpound@users.noreply.github.com> Date: Tue, 7 May 2024 14:58:34 -0400 Subject: [PATCH 03/14] remove deprecated weights keyword --- docs/source/examples/subbeamnod.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/examples/subbeamnod.rst b/docs/source/examples/subbeamnod.rst index bd58536c..48d20a01 100644 --- a/docs/source/examples/subbeamnod.rst +++ b/docs/source/examples/subbeamnod.rst @@ -77,6 +77,6 @@ The SubBeamNod scans are 43, 46, and 54. Retrieve and calibrate a SubBeamNod sc .. code:: python - >>> sbn = sdfits.subbeamnod(scan=43, fdnum=1, ifnum=0, weights='tsys') + >>> sbn = sdfits.subbeamnod(scan=43, fdnum=1, ifnum=0) >>> ta = sbn.timeaverage(weights="tsys") >>> ta.plot() From 2a2d9ce35c297cb684507c7cf7c2e7be8b86c881 Mon Sep 17 00:00:00 2001 From: Marc Pound <22331890+mpound@users.noreply.github.com> Date: Tue, 7 May 2024 16:09:39 -0400 Subject: [PATCH 04/14] add virtual documents directories created by jupyter --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 6c928cf6..86f1ebd2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ # Custom *.fits .ignore/ +.virtual_documents docs/source/_build/ # Byte-compiled / optimized / DLL files From e9f3bfc5a0a0ae2df035f85c0f40776cdf3cd909 Mon Sep 17 00:00:00 2001 From: Marc Pound <22331890+mpound@users.noreply.github.com> Date: Tue, 7 May 2024 16:10:59 -0400 Subject: [PATCH 05/14] add whatsnew and changes --- docs/source/Makefile | 23 +++++++++++++++++++++++ docs/source/index.rst | 1 + docs/source/whatsnew/0.3.rst | 21 +++++++++++++++++++++ docs/source/whatsnew/CHANGES.rst | 3 +++ docs/source/whatsnew/changelog.rst | 7 +++++++ docs/source/whatsnew/index.rst | 16 ++++++++++++++++ 6 files changed, 71 insertions(+) create mode 100644 docs/source/Makefile create mode 100644 docs/source/whatsnew/0.3.rst create mode 100644 docs/source/whatsnew/CHANGES.rst create mode 100644 docs/source/whatsnew/changelog.rst create mode 100644 docs/source/whatsnew/index.rst diff --git a/docs/source/Makefile b/docs/source/Makefile new file mode 100644 index 00000000..e83f08b3 --- /dev/null +++ b/docs/source/Makefile @@ -0,0 +1,23 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = python -m sphinx +SPHINXPROJ = dysh +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +dev: + sphinx-autobuild "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) diff --git a/docs/source/index.rst b/docs/source/index.rst index d9586efe..7f44b2bf 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -14,6 +14,7 @@ Contents .. toctree:: :maxdepth: 3 + whatsnew/0.3 background/index getting_started/index examples/index diff --git a/docs/source/whatsnew/0.3.rst b/docs/source/whatsnew/0.3.rst new file mode 100644 index 00000000..cded5a0d --- /dev/null +++ b/docs/source/whatsnew/0.3.rst @@ -0,0 +1,21 @@ + +.. _whatsnew-0.3: + +*********************** +What's New in dysh 0.3? +*********************** + +Overview +======== +In this release, `dysh` has the following new or updated features: + +* Conversion between standard velocity frames: heliocentric, barycentric, geocentric, topcentric, local standard of rest (kinematic and dynamical), and galactocentric rest frames. +* Conversion between the radio, optical, and relativistic velocity definitions. +* Data selection via any SDFITS column name +* Frequency switching calibration. + +Full change log +=============== + +To see a detailed list of all changes in version 0.3, including changes in +API, please see the :ref:`changelog`. diff --git a/docs/source/whatsnew/CHANGES.rst b/docs/source/whatsnew/CHANGES.rst new file mode 100644 index 00000000..deffcd7a --- /dev/null +++ b/docs/source/whatsnew/CHANGES.rst @@ -0,0 +1,3 @@ + +Version 0.3.0 +============== diff --git a/docs/source/whatsnew/changelog.rst b/docs/source/whatsnew/changelog.rst new file mode 100644 index 00000000..9186ea75 --- /dev/null +++ b/docs/source/whatsnew/changelog.rst @@ -0,0 +1,7 @@ + +.. _changelog: + +Full Changelog +=============== + +.. include:: CHANGES.rst diff --git a/docs/source/whatsnew/index.rst b/docs/source/whatsnew/index.rst new file mode 100644 index 00000000..9825812a --- /dev/null +++ b/docs/source/whatsnew/index.rst @@ -0,0 +1,16 @@ + +.. _dysh_whats_new_index: + +********** +What's New +********** + +Examples in these documents are frozen in time to respect the status of the +API at the time of the release they are describing. Please refer to the +main, up-to-date documentation if you run into any issues with the +functionality highlighted in these pages. + +.. toctree:: + :maxdepth: 1 + +* What's new in Dysh 0.3? From 58566aa3b11b155db6463078669965900e961852 Mon Sep 17 00:00:00 2001 From: Marc Pound <22331890+mpound@users.noreply.github.com> Date: Tue, 7 May 2024 17:25:09 -0400 Subject: [PATCH 06/14] flesh out changelog --- docs/source/whatsnew/CHANGES.rst | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/docs/source/whatsnew/CHANGES.rst b/docs/source/whatsnew/CHANGES.rst index deffcd7a..87509111 100644 --- a/docs/source/whatsnew/CHANGES.rst +++ b/docs/source/whatsnew/CHANGES.rst @@ -1,3 +1,25 @@ Version 0.3.0 ============== + +Functionality & Enhancements +--------------------------------- +- Handling of Doppler frames and conventions + - A GBT Spectrum has a spectral axis derived from the WCS of the spectrum (which in turn is created from meta data in the SDFITS file). The default Doppler frame for this axis is topocentric. The spectral axis of a Spectrum can be converted to standard frames recognized by astropy: LSRK, HCRS, ICRS, GCRS, ITRS, GalactoCentric. See `Spectrum.set_frame `_, `Spectrum.with_frame `_, and also the `xaxis_unit` and `vel_frame` keywords to `SpecPlot.plot. `_ + - The Doppler conventions *radio, optical, relativistic* are recognized by `dysh`. Users can convert a Spectrum to different conventions with `Spectrum.set_convention `_ and `Spectrum.with_velocity_convention `_. See also, the `doppler_convention` keyword of `SpecPlot.plot `_ +- Data Selection + - The `Selection `_ class implements a very flexible way of selecting data rows from an SDFITS file using any column name. (Column name aliases are also supported). Multiple selection rules are logically combined to a final selection. + - Data selection is implemented on `GBTFITSLoad `_ via delegation to a Selection attribute. +- Frequency switching calibration + - GBTFITSLoad.getfs() implemented + - FSScan implemented + +- `ScanBlock `_ API change + - `timeaverage() `_ now returns a Spectrum instead of a list. Previously the list contained the time average of each Scan within the ScanBlock. Now the time average across all Scans in the ScanBlock is returned. + +Bug Fixes +----------- +- `SubBeamNod error when using cycle method `_ +- `Spectrum arithmetic operations not working `_ +- `SDFITS summary() reports wrong number of integrations `_ +- `Certain old GBTIDL files could not be read by dysh `_ From a22daf1add29ccfed630aed887f6f9f22142dc94 Mon Sep 17 00:00:00 2001 From: Marc Pound <22331890+mpound@users.noreply.github.com> Date: Wed, 8 May 2024 10:58:26 -0400 Subject: [PATCH 07/14] remove duplicated fold keyword doc --- src/dysh/fits/gbtfitsload.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/dysh/fits/gbtfitsload.py b/src/dysh/fits/gbtfitsload.py index 9f3cbe6a..0f4b1581 100644 --- a/src/dysh/fits/gbtfitsload.py +++ b/src/dysh/fits/gbtfitsload.py @@ -600,8 +600,6 @@ def getfs( temperature weighting (see e.g., :meth:`~spectra.scan.FSScan.timeaverage`); None means uniform weighting. The default is "tsys". - fold: boolean, optional - The default is True bintable : int, optional Limit to the input binary table index. The default is None which means use all binary tables. observer_location : `~astropy.coordinates.EarthLocation` From ef7f405afbb8a1c8d4faab41131febe7728b0dba Mon Sep 17 00:00:00 2001 From: Marc Pound <22331890+mpound@users.noreply.github.com> Date: Wed, 8 May 2024 11:07:19 -0400 Subject: [PATCH 08/14] functionality and bug fixes --- docs/source/whatsnew/CHANGES.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/whatsnew/CHANGES.rst b/docs/source/whatsnew/CHANGES.rst index 87509111..a63902be 100644 --- a/docs/source/whatsnew/CHANGES.rst +++ b/docs/source/whatsnew/CHANGES.rst @@ -11,8 +11,8 @@ Functionality & Enhancements - The `Selection `_ class implements a very flexible way of selecting data rows from an SDFITS file using any column name. (Column name aliases are also supported). Multiple selection rules are logically combined to a final selection. - Data selection is implemented on `GBTFITSLoad `_ via delegation to a Selection attribute. - Frequency switching calibration - - GBTFITSLoad.getfs() implemented - - FSScan implemented + - FS data can be calibrated using `GBTFITSLoad.getfs() `_ with the option to fold the signal and reference spectra. + - The Scan class for calibrating frequency switching, `FSScan `_, has been implemented. Users should not need to create these directly, but rather through *getfs()*. - `ScanBlock `_ API change - `timeaverage() `_ now returns a Spectrum instead of a list. Previously the list contained the time average of each Scan within the ScanBlock. Now the time average across all Scans in the ScanBlock is returned. From 4c8ab3c11dde0a54314e107d2a7334f2d5f4f842 Mon Sep 17 00:00:00 2001 From: astrofle Date: Wed, 8 May 2024 13:44:19 -0400 Subject: [PATCH 09/14] Updated installation instructions and link to form --- docs/source/for_beta_testers/beta_testing.rst | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/docs/source/for_beta_testers/beta_testing.rst b/docs/source/for_beta_testers/beta_testing.rst index ce8c2ff5..96bd6495 100644 --- a/docs/source/for_beta_testers/beta_testing.rst +++ b/docs/source/for_beta_testers/beta_testing.rst @@ -16,7 +16,7 @@ Providing feedback If you encounter a problem with `dysh`, would like to request a new feature or enhancement or would like to leave feedback, please do so using `GitHub issues `_. There are some basic instructions of how to do this :ref:`here `. This requires `creating a free account `_ on GitHub if you do not have one. -If you prefer not to create a GitHub account, please provide your feedback to the `dysh-beta mailing list `_, or send an email to dysh-beta@googlegroups.com. Additionally, we will provide a `form for collecting feedback `_. +If you prefer not to create a GitHub account, please provide your feedback to the `dysh-beta mailing list `_, or send an email to dysh-beta@googlegroups.com. Additionally, we will provide a `form for collecting feedback `_. When providing feedback, please provide @@ -54,19 +54,19 @@ We provide steps for working in one of `GBO data reduction hosts `_ and `questionnaire `_. From ba2283ecd27581e2ea5b8a793c7cc1d03387e002 Mon Sep 17 00:00:00 2001 From: astrofle Date: Wed, 8 May 2024 13:57:53 -0400 Subject: [PATCH 10/14] Uses [nb] to install jupyterlab --- docs/source/for_beta_testers/beta_testing.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/source/for_beta_testers/beta_testing.rst b/docs/source/for_beta_testers/beta_testing.rst index 96bd6495..44e24315 100644 --- a/docs/source/for_beta_testers/beta_testing.rst +++ b/docs/source/for_beta_testers/beta_testing.rst @@ -46,7 +46,7 @@ Installing `dysh` ================= Here we provide additional installation steps that include creating a virtual environment to keep `dysh` isolated from your system `Python` version. -We provide steps for working in one of `GBO data reduction hosts `_ (e.g., fourier), and if you're working outside one of the GBO data reduction hosts. +We provide steps for working in one of `GBO data reduction hosts `_ (e.g., fourier), and if you're working outside one of the GBO data reduction hosts. The provided command will install `dysh` and `jupyterlab`, which can be used to run the example notebooks locally. .. tab:: At GBO @@ -66,7 +66,7 @@ We provide steps for working in one of `GBO data reduction hosts Date: Wed, 8 May 2024 13:58:51 -0400 Subject: [PATCH 11/14] Adds missing dot --- docs/source/whatsnew/0.3.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/whatsnew/0.3.rst b/docs/source/whatsnew/0.3.rst index cded5a0d..21dc4fb5 100644 --- a/docs/source/whatsnew/0.3.rst +++ b/docs/source/whatsnew/0.3.rst @@ -11,7 +11,7 @@ In this release, `dysh` has the following new or updated features: * Conversion between standard velocity frames: heliocentric, barycentric, geocentric, topcentric, local standard of rest (kinematic and dynamical), and galactocentric rest frames. * Conversion between the radio, optical, and relativistic velocity definitions. -* Data selection via any SDFITS column name +* Data selection via any SDFITS column name. * Frequency switching calibration. Full change log From b625e32399fec2830ed32e8b4c9fdc1c8bfcd564 Mon Sep 17 00:00:00 2001 From: Marc Pound <22331890+mpound@users.noreply.github.com> Date: Wed, 8 May 2024 14:59:09 -0400 Subject: [PATCH 12/14] fix up doc and example for gettp --- docs/source/examples/img/tp_153_eqweight.png | Bin 20268 -> 19329 bytes docs/source/examples/totalpower.rst | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/source/examples/img/tp_153_eqweight.png b/docs/source/examples/img/tp_153_eqweight.png index 744b253699d98f0fbe747f654c20893a5559188b..34d1bddffc8bd20cc62ae8d7c644cded0a1d32b1 100644 GIT binary patch literal 19329 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 NNnZ74-VM`-{}%{Ap_Kpt literal 20268 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 diff --git a/docs/source/examples/totalpower.rst b/docs/source/examples/totalpower.rst index 9c585356..7b4e38da 100644 --- a/docs/source/examples/totalpower.rst +++ b/docs/source/examples/totalpower.rst @@ -62,11 +62,11 @@ Retrieve a scan, selecting and IF number and polarization >>> tpscan = sdfits.gettp(scan=152, ifnum=0, plnum=0) -The `~dysh.spectra.scan.GBTTPScan` contains the individual integrations. The system temperatures per integration are calculated from the CALON and CALOFF data +Inside the returns `~dysh.spectra.scan.ScanBlock` is one `~dysh.spectra.scan.TPScan` that contains the individual integrations. The system temperatures per integration are calculated from the CALON and CALOFF data .. code:: python - >>> print('%s' % (np.array2string(tpscan.tsys, precision=2))) + >>> print('%s' % (np.array2string(tpscan[0].tsys, precision=2))) [17.46 17.47 17.51 17.48 17.27 17.24 17.43 17.51 17.36 17.41 17.27 17.36 17.28 17.31 17.15 17. 17.54 17.21 17.4 17.38 17.49 17.43 17.15 17.2 17.45 17.15 17.31 17.31 17.1 17.48 17.29 17.24 17.52 17.31 17.19 17.1 From 7f8be7ada767d88fdcc825901bc7af2746c39807 Mon Sep 17 00:00:00 2001 From: Marc Pound <22331890+mpound@users.noreply.github.com> Date: Thu, 9 May 2024 14:40:05 -0400 Subject: [PATCH 13/14] doc fixes --- docs/source/examples/subbeamnod.rst | 9 +++++---- docs/source/examples/totalpower.rst | 3 +-- .../tutorials/GBT/tutorial-positionswitch.rst | 8 ++------ src/dysh/fits/gbtfitsload.py | 18 +++++++++--------- src/dysh/spectra/scan.py | 9 ++++----- 5 files changed, 21 insertions(+), 26 deletions(-) diff --git a/docs/source/examples/subbeamnod.rst b/docs/source/examples/subbeamnod.rst index 48d20a01..9a40b2d9 100644 --- a/docs/source/examples/subbeamnod.rst +++ b/docs/source/examples/subbeamnod.rst @@ -48,7 +48,7 @@ You can also print a concise (or verbose if you choose `verbose=True`) :meth:`~d .. code:: python - >>> sdfits.summary(show_index=True) + >>> sdfits.summary() SCAN OBJECT VELOCITY PROC PROCSEQN RESTFREQ DOPFREQ # IF # POL # INT # FEED AZIMUTH ELEVATIO 0 32 1256-0547 0.0 Nod 1 26.5 26.5 1 2 60 2 160.975324 43.884984 1 33 1256-0547 0.0 Nod 2 26.5 26.5 1 2 60 2 161.174093 43.928449 @@ -72,11 +72,12 @@ You can also print a concise (or verbose if you choose `verbose=True`) :meth:`~d The SubBeamNod scans are 43, 46, and 54. Retrieve and calibrate a SubBeamNod scan, then plot it .. note:: - For each scan in the summary `dysh` shows the mean of the VELOCITY, RESTFREQ, DOPFREQ, AZIMUTH and ELEVATIO columns, while `GBTIDL` reports the value of the first integration for a scan. If you use `verbo - se=True` in `dysh` you get all the integrations. + For each scan in the summary `dysh` shows the mean of the VELOCITY, RESTFREQ, DOPFREQ, AZIMUTH and ELEVATIO columns, while `GBTIDL` reports the value of the first integration for a scan. If you use `verbose=True` in `dysh` you get all the integrations. .. code:: python >>> sbn = sdfits.subbeamnod(scan=43, fdnum=1, ifnum=0) >>> ta = sbn.timeaverage(weights="tsys") - >>> ta.plot() + >>> ta.plot(xaxis_unit="GHz") + +.. figure:: img/subbeamnod.png diff --git a/docs/source/examples/totalpower.rst b/docs/source/examples/totalpower.rst index 7b4e38da..1fe3cbed 100644 --- a/docs/source/examples/totalpower.rst +++ b/docs/source/examples/totalpower.rst @@ -55,8 +55,7 @@ You can also print a concise (or verbose if you choose `verbose=True`) summary : Retrieve a scan, selecting and IF number and polarization .. note:: - For each scan in the summary `dysh` shows the mean of the VELOCITY, RESTFREQ, DOPFREQ, AZIMUTH and ELEVATIO columns, while `GBTIDL` reports the value of the first integration for a scan. If you use `verbo - se=True` in `dysh` you get all the integrations. + For each scan in the summary `dysh` shows the mean of the VELOCITY, RESTFREQ, DOPFREQ, AZIMUTH and ELEVATIO columns, while `GBTIDL` reports the value of the first integration for a scan. If you use `verbose=True` in `dysh` you get all the integrations. .. code:: python diff --git a/docs/source/getting_started/tutorials/GBT/tutorial-positionswitch.rst b/docs/source/getting_started/tutorials/GBT/tutorial-positionswitch.rst index 054d4056..507d9cad 100644 --- a/docs/source/getting_started/tutorials/GBT/tutorial-positionswitch.rst +++ b/docs/source/getting_started/tutorials/GBT/tutorial-positionswitch.rst @@ -81,7 +81,7 @@ The following lines will let you calibrate and time average the position switche .. code:: python - >>> psscan = sdfits.getps(152, ifnum=0, plnum=0) + >>> psscan = sdfits.getps(scan=152, ifnum=0, plnum=0) >>> ta = psscan.timeaverage(weights='tsys') Plotting the calibrated data @@ -89,11 +89,7 @@ Plotting the calibrated data .. code:: python - >>> ta[0].plot(xaxis_unit="km/s", yaxis_unit="mK", ymin=-100, ymax=500, xmin=3000, xmax=4500) + >>> ta.plot(xaxis_unit="km/s", yaxis_unit="mK", ymin=-100, ymax=500, xmin=3000, xmax=4500) .. figure:: img/ps_152_zoom.png :alt: The spectrum plot zoomed in along both axes to frame a central emission line. - -.. WARNING:: - At this point, `dysh` does not handle Doppler corrections. - So the frequency and velocity information will be offset for observations requesting a reference frame other than Topocentric. diff --git a/src/dysh/fits/gbtfitsload.py b/src/dysh/fits/gbtfitsload.py index 0f4b1581..57696e81 100644 --- a/src/dysh/fits/gbtfitsload.py +++ b/src/dysh/fits/gbtfitsload.py @@ -560,7 +560,7 @@ def _create_index_if_needed(self): i = i + 1 def info(self): - """Return information on the HDUs contained in this object. See :meth:`~astropy.HDUList/info()""" + """Return information on the HDUs contained in this object. See :meth:`~astropy.HDUList/info()`""" for s in self._sdf: s.info() @@ -596,10 +596,10 @@ def getfs( Average the scans in polarization. The default is False. weights : str or None, optional - How to weight the spectral data when averaging. `tsys` means use system + How to weight the spectral data when averaging. 'tsys' means use system temperature weighting (see e.g., :meth:`~spectra.scan.FSScan.timeaverage`); None means uniform weighting. - The default is "tsys". + The default is 'tsys'. bintable : int, optional Limit to the input binary table index. The default is None which means use all binary tables. observer_location : `~astropy.coordinates.EarthLocation` @@ -608,7 +608,7 @@ def getfs( observation DATE-OBS or MJD-OBS in the SDFITS header. The default is the location of the GBT. **kwargs : dict - Optional additional selection (only?) keyword arguments, typically + Optional additional selection keyword arguments, typically given as key=value, though a dictionary works too. e.g., `ifnum=1, plnum=[2,3]` etc. @@ -720,14 +720,14 @@ def getps(self, calibrate=True, timeaverage=True, polaverage=False, weights="tsy polaverage : boolean, optional Average the scans in polarization. The default is False. weights : str or None, optional - How to weight the spectral data when averaging. `tsys` means use system + How to weight the spectral data when averaging. 'tsys' means use system temperature weighting (see e.g., :meth:`~spectra.scan.PSScan.timeaverage`); - None means uniform weighting. The default is "tsys". + None means uniform weighting. The default is 'tsys'. bintable : int, optional Limit to the input binary table index. The default is None which means use all binary tables. (This keyword should eventually go away) **kwargs : dict - Optional additional selection (only?) keyword arguments, typically + Optional additional selection keyword arguments, typically given as key=value, though a dictionary works too. e.g., `ifnum=1, plnum=[2,3]` etc. @@ -888,7 +888,7 @@ def gettp( bintable : int, optional Limit to the input binary table index. The default is None which means use all binary tables. **kwargs : dict - Optional additional selection (only?) keyword arguments, typically + Optional additional selection keyword arguments, typically given as key=value, though a dictionary works too. e.g., `ifnum=1, plnum=[2,3]` etc. @@ -997,7 +997,7 @@ def subbeamnod( bintable : int, optional Limit to the input binary table index. The default is None which means use all binary tables. **kwargs : dict - Optional additional selection (only?) keyword arguments, typically + Optional additional selection keyword arguments, typically given as key=value, though a dictionary works too. e.g., `ifnum=1, plnum=[2,3]` etc. diff --git a/src/dysh/spectra/scan.py b/src/dysh/spectra/scan.py index 6a43d23e..e3ec8c70 100644 --- a/src/dysh/spectra/scan.py +++ b/src/dysh/spectra/scan.py @@ -523,19 +523,17 @@ def timeaverage(self, weights="tsys"): return self._timeaveraged +# @todo 'scans' should become 'scan' class PSScan(ScanMixin): """GBT specific version of Position Switch Scan. A position switch scan object has one IF, one feed, and one or more polarizations. Parameters ---------- - - gbtfits : `~fit.gbtfitsload.GBFITSLoad` + gbtfits : `~fits.gbtfitsload.GBFITSLoad` input GBFITSLoad object scans : dict - dictionary with keys 'ON' and 'OFF' containing unique list of ON (signal) and OFF (reference) scan numbers - NOTE: there should be one ON and one OFF, a pair - @todo 'scans' should become 'scan' + dictionary with keys 'ON' and 'OFF' containing unique list of ON (signal) and OFF (reference) scan numbers NOTE: there should be one ON and one OFF, a pair scanrows : dict dictionary with keys 'ON' and 'OFF' containing the list of rows in `sdfits` corresponding to ON (signal) and OFF (reference) integrations calrows : dict @@ -609,6 +607,7 @@ def scans(self): """The dictionary of the ON and OFF scan numbers in the PSScan. Returns + ------- scans : dict The scan number dictionary """ From 6a4aa5b46f9244356c8419efcb04e042c501ef0b Mon Sep 17 00:00:00 2001 From: Marc Pound <22331890+mpound@users.noreply.github.com> Date: Thu, 9 May 2024 14:47:37 -0400 Subject: [PATCH 14/14] change full replacement to alternative until we arrive at our final messaging statement --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9e6ddad1..3f668653 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ # dysh -*dysh* is a Python spectral line data reduction and analysis program for singledish data with specific emphasis on data from the Green Bank Telescope. It is currently under development in collaboration between the [Green Bank Observatory](https:/greenbankobservatory.org) and the Laboratory for Millimeter-Wave Astronomy (LMA) at [University of Maryland (UMD)](https://www.astro.umd.edu). It is intended to be a full replacement for the GBO's current reduction package [GBTIDL](https://www.gb.nrao.edu/GBT/DA/gbtidl/users_guide/). +*dysh* is a Python spectral line data reduction and analysis program for singledish data with specific emphasis on data from the Green Bank Telescope. It is currently under development in collaboration between the [Green Bank Observatory](https:/greenbankobservatory.org) and the Laboratory for Millimeter-Wave Astronomy (LMA) at [University of Maryland (UMD)](https://www.astro.umd.edu). It is intended to be an alternative to the GBO's current reduction package [GBTIDL](https://www.gb.nrao.edu/GBT/DA/gbtidl/users_guide/). ## Getting Started ### Installation