From 88d6953b3c6f22a7db132c8120e0c8d9bbff24bc Mon Sep 17 00:00:00 2001 From: Dan F-M Date: Tue, 25 Jul 2023 15:23:35 -0400 Subject: [PATCH] edits to manuscript for JOSS review --- joss_paper/paper.bib | 11 +++---- joss_paper/paper.md | 74 +++++++++++++++++++++----------------------- 2 files changed, 41 insertions(+), 44 deletions(-) diff --git a/joss_paper/paper.bib b/joss_paper/paper.bib index 23f735682..b183131c0 100644 --- a/joss_paper/paper.bib +++ b/joss_paper/paper.bib @@ -15,7 +15,7 @@ @manual{ape14 @ARTICLE{astropy2013, author = {{Astropy Collaboration} and {Robitaille}, Thomas P. and {Tollerud}, Erik J. and {Greenfield}, Perry and {Droettboom}, Michael and {Bray}, Erik and {Aldcroft}, Tom and {Davis}, Matt and {Ginsburg}, Adam and {Price-Whelan}, Adrian M. and {Kerzendorf}, Wolfgang E. and {Conley}, Alexander and {Crighton}, Neil and {Barbary}, Kyle and {Muna}, Demitri and {Ferguson}, Henry and {Grollier}, Fr{\'e}d{\'e}ric and {Parikh}, Madhura M. and {Nair}, Prasanth H. and {Unther}, Hans M. and {Deil}, Christoph and {Woillez}, Julien and {Conseil}, Simon and {Kramer}, Roban and {Turner}, James E.~H. and {Singer}, Leo and {Fox}, Ryan and {Weaver}, Benjamin A. and {Zabalza}, Victor and {Edwards}, Zachary I. and {Azalee Bostroem}, K. and {Burke}, D.~J. and {Casey}, Andrew R. and {Crawford}, Steven M. and {Dencheva}, Nadia and {Ely}, Justin and {Jenness}, Tim and {Labrie}, Kathleen and {Lim}, Pey Lian and {Pierfederici}, Francesco and {Pontzen}, Andrew and {Ptak}, Andy and {Refsdal}, Brian and {Servillat}, Mathieu and {Streicher}, Ole}, title = "{Astropy: A community Python package for astronomy}", - journal = {\aap}, + journal = {Astronomy \& Astrophysics}, keywords = {methods: data analysis, methods: miscellaneous, virtual observatory tools, Astrophysics - Instrumentation and Methods for Astrophysics}, year = 2013, month = oct, @@ -34,7 +34,7 @@ @ARTICLE{astropy2013 @ARTICLE{astropy2018, author = {{Astropy Collaboration} and {Price-Whelan}, A.~M. and {Sip{\H{o}}cz}, B.~M. and {G{\"u}nther}, H.~M. and {Lim}, P.~L. and {Crawford}, S.~M. and {Conseil}, S. and {Shupe}, D.~L. and {Craig}, M.~W. and {Dencheva}, N. and {Ginsburg}, A. and {VanderPlas}, J.~T. and {Bradley}, L.~D. and {P{\'e}rez-Su{\'a}rez}, D. and {de Val-Borro}, M. and {Aldcroft}, T.~L. and {Cruz}, K.~L. and {Robitaille}, T.~P. and {Tollerud}, E.~J. and {Ardelean}, C. and {Babej}, T. and {Bach}, Y.~P. and {Bachetti}, M. and {Bakanov}, A.~V. and {Bamford}, S.~P. and {Barentsen}, G. and {Barmby}, P. and {Baumbach}, A. and {Berry}, K.~L. and {Biscani}, F. and {Boquien}, M. and {Bostroem}, K.~A. and {Bouma}, L.~G. and {Brammer}, G.~B. and {Bray}, E.~M. and {Breytenbach}, H. and {Buddelmeijer}, H. and {Burke}, D.~J. and {Calderone}, G. and {Cano Rodr{\'\i}guez}, J.~L. and {Cara}, M. and {Cardoso}, J.~V.~M. and {Cheedella}, S. and {Copin}, Y. and {Corrales}, L. and {Crichton}, D. and {D'Avella}, D. and {Deil}, C. and {Depagne}, {\'E}. and {Dietrich}, J.~P. and {Donath}, A. and {Droettboom}, M. and {Earl}, N. and {Erben}, T. and {Fabbro}, S. and {Ferreira}, L.~A. and {Finethy}, T. and {Fox}, R.~T. and {Garrison}, L.~H. and {Gibbons}, S.~L.~J. and {Goldstein}, D.~A. and {Gommers}, R. and {Greco}, J.~P. and {Greenfield}, P. and {Groener}, A.~M. and {Grollier}, F. and {Hagen}, A. and {Hirst}, P. and {Homeier}, D. and {Horton}, A.~J. and {Hosseinzadeh}, G. and {Hu}, L. and {Hunkeler}, J.~S. and {Ivezi{\'c}}, {\v{Z}}. and {Jain}, A. and {Jenness}, T. and {Kanarek}, G. and {Kendrew}, S. and {Kern}, N.~S. and {Kerzendorf}, W.~E. and {Khvalko}, A. and {King}, J. and {Kirkby}, D. and {Kulkarni}, A.~M. and {Kumar}, A. and {Lee}, A. and {Lenz}, D. and {Littlefair}, S.~P. and {Ma}, Z. and {Macleod}, D.~M. and {Mastropietro}, M. and {McCully}, C. and {Montagnac}, S. and {Morris}, B.~M. and {Mueller}, M. and {Mumford}, S.~J. and {Muna}, D. and {Murphy}, N.~A. and {Nelson}, S. and {Nguyen}, G.~H. and {Ninan}, J.~P. and {N{\"o}the}, M. and {Ogaz}, S. and {Oh}, S. and {Parejko}, J.~K. and {Parley}, N. and {Pascual}, S. and {Patil}, R. and {Patil}, A.~A. and {Plunkett}, A.~L. and {Prochaska}, J.~X. and {Rastogi}, T. and {Reddy Janga}, V. and {Sabater}, J. and {Sakurikar}, P. and {Seifert}, M. and {Sherbert}, L.~E. and {Sherwood-Taylor}, H. and {Shih}, A.~Y. and {Sick}, J. and {Silbiger}, M.~T. and {Singanamalla}, S. and {Singer}, L.~P. and {Sladen}, P.~H. and {Sooley}, K.~A. and {Sornarajah}, S. and {Streicher}, O. and {Teuben}, P. and {Thomas}, S.~W. and {Tremblay}, G.~R. and {Turner}, J.~E.~H. and {Terr{\'o}n}, V. and {van Kerkwijk}, M.~H. and {de la Vega}, A. and {Watkins}, L.~L. and {Weaver}, B.~A. and {Whitmore}, J.~B. and {Woillez}, J. and {Zabalza}, V. and {Astropy Contributors}}, title = "{The Astropy Project: Building an Open-science Project and Status of the v2.0 Core Package}", - journal = {\aj}, + journal = {Astronomical Journal}, keywords = {methods: data analysis, methods: miscellaneous, methods: statistical, reference systems, Astrophysics - Instrumentation and Methods for Astrophysics}, year = 2018, month = sep, @@ -53,7 +53,7 @@ @ARTICLE{astropy2018 @ARTICLE{astropy2022, author = {{Astropy Collaboration} and {Price-Whelan}, Adrian M. and {Lim}, Pey Lian and {Earl}, Nicholas and {Starkman}, Nathaniel and {Bradley}, Larry and {Shupe}, David L. and {Patil}, Aarya A. and {Corrales}, Lia and {Brasseur}, C.~E. and {N{\"o}the}, Maximilian and {Donath}, Axel and {Tollerud}, Erik and {Morris}, Brett M. and {Ginsburg}, Adam and {Vaher}, Eero and {Weaver}, Benjamin A. and {Tocknell}, James and {Jamieson}, William and {van Kerkwijk}, Marten H. and {Robitaille}, Thomas P. and {Merry}, Bruce and {Bachetti}, Matteo and {G{\"u}nther}, H. Moritz and {Aldcroft}, Thomas L. and {Alvarado-Montes}, Jaime A. and {Archibald}, Anne M. and {B{\'o}di}, Attila and {Bapat}, Shreyas and {Barentsen}, Geert and {Baz{\'a}n}, Juanjo and {Biswas}, Manish and {Boquien}, M{\'e}d{\'e}ric and {Burke}, D.~J. and {Cara}, Daria and {Cara}, Mihai and {Conroy}, Kyle E. and {Conseil}, Simon and {Craig}, Matthew W. and {Cross}, Robert M. and {Cruz}, Kelle L. and {D'Eugenio}, Francesco and {Dencheva}, Nadia and {Devillepoix}, Hadrien A.~R. and {Dietrich}, J{\"o}rg P. and {Eigenbrot}, Arthur Davis and {Erben}, Thomas and {Ferreira}, Leonardo and {Foreman-Mackey}, Daniel and {Fox}, Ryan and {Freij}, Nabil and {Garg}, Suyog and {Geda}, Robel and {Glattly}, Lauren and {Gondhalekar}, Yash and {Gordon}, Karl D. and {Grant}, David and {Greenfield}, Perry and {Groener}, Austen M. and {Guest}, Steve and {Gurovich}, Sebastian and {Handberg}, Rasmus and {Hart}, Akeem and {Hatfield-Dodds}, Zac and {Homeier}, Derek and {Hosseinzadeh}, Griffin and {Jenness}, Tim and {Jones}, Craig K. and {Joseph}, Prajwel and {Kalmbach}, J. Bryce and {Karamehmetoglu}, Emir and {Ka{\l}uszy{\'n}ski}, Miko{\l}aj and {Kelley}, Michael S.~P. and {Kern}, Nicholas and {Kerzendorf}, Wolfgang E. and {Koch}, Eric W. and {Kulumani}, Shankar and {Lee}, Antony and {Ly}, Chun and {Ma}, Zhiyuan and {MacBride}, Conor and {Maljaars}, Jakob M. and {Muna}, Demitri and {Murphy}, N.~A. and {Norman}, Henrik and {O'Steen}, Richard and {Oman}, Kyle A. and {Pacifici}, Camilla and {Pascual}, Sergio and {Pascual-Granado}, J. and {Patil}, Rohit R. and {Perren}, Gabriel I. and {Pickering}, Timothy E. and {Rastogi}, Tanuj and {Roulston}, Benjamin R. and {Ryan}, Daniel F. and {Rykoff}, Eli S. and {Sabater}, Jose and {Sakurikar}, Parikshit and {Salgado}, Jes{\'u}s and {Sanghi}, Aniket and {Saunders}, Nicholas and {Savchenko}, Volodymyr and {Schwardt}, Ludwig and {Seifert-Eckert}, Michael and {Shih}, Albert Y. and {Jain}, Anany Shrey and {Shukla}, Gyanendra and {Sick}, Jonathan and {Simpson}, Chris and {Singanamalla}, Sudheesh and {Singer}, Leo P. and {Singhal}, Jaladh and {Sinha}, Manodeep and {Sip{\H{o}}cz}, Brigitta M. and {Spitler}, Lee R. and {Stansby}, David and {Streicher}, Ole and {{\v{S}}umak}, Jani and {Swinbank}, John D. and {Taranu}, Dan S. and {Tewary}, Nikita and {Tremblay}, Grant R. and {de Val-Borro}, Miguel and {Van Kooten}, Samuel J. and {Vasovi{\'c}}, Zlatan and {Verma}, Shresth and {de Miranda Cardoso}, Jos{\'e} Vin{\'\i}cius and {Williams}, Peter K.~G. and {Wilson}, Tom J. and {Winkel}, Benjamin and {Wood-Vasey}, W.~M. and {Xue}, Rui and {Yoachim}, Peter and {Zhang}, Chen and {Zonca}, Andrea and {Astropy Project Contributors}}, title = "{The Astropy Project: Sustaining and Growing a Community-oriented Open-source Project and the Latest Major Release (v5.0) of the Core Package}", - journal = {\apj}, + journal = {Astrophysical Journal}, keywords = {Astronomy software, Open source software, Astronomy data analysis, 1855, 1866, 1858, Astrophysics - Instrumentation and Methods for Astrophysics}, year = 2022, month = aug, @@ -194,7 +194,7 @@ @article{ndcube title = "{A Unified Framework for Manipulating N-dimensional Astronomical Data and Coordinate Transformations in Python: The NDCube 2 & Astropy APE-14 WCS APIs}", year = 2023, - journal = {ApJ}, + journal = {Astrophysical Journal}, doi = {10.3847/1538-4357/ace0bd}, } @@ -240,7 +240,6 @@ @INPROCEEDINGS{punch eid = {1}, pages = {1-11}, doi = {10.1109/AERO53065.2022.9843340}, - adsurl = {https://eur03.safelinks.protection.outlook.com/?url=https%3A%2F%2Fui.adsabs.harvard.edu%2Fabs%2F2022aero.confE...1D&data=05%7C01%7Cdaniel.ryan%40fhnw.ch%7Cb7081a5c61bf4b75c1a508db10625f73%7C9d1a5fc8321e4101ae63530730711ac2%7C0%7C0%7C638121786933488209%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=d%2Bok8sOTJBMaeg4%2BT%2BlBvGYrUtTNEIbaPUqaomSfwAs%3D&reserved=0}, adsnote = {Provided by the SAO/NASA Astrophysics Data System} } @@ -274,7 +273,7 @@ @misc{specutils-code @ARTICLE{sunpy, author = {{Mumford}, Stuart and {Freij}, Nabil and {Christe}, Steven and {Ireland}, Jack and {Mayer}, Florian and {Hughitt}, V. and {Shih}, Albert and {Ryan}, Daniel and {Liedtke}, Simon and {P{\'e}rez-Su{\'a}rez}, David and {Chakraborty}, Pritish and {K}, Vishnunarayan and {Inglis}, Andrew and {Pattnaik}, Punyaslok and {Sip{\H{o}}cz}, Brigitta and {Sharma}, Rishabh and {Leonard}, Andrew and {Stansby}, David and {Hewett}, Russell and {Hamilton}, Alex and {Hayes}, Laura and {Panda}, Asish and {Earnshaw}, Matt and {Choudhary}, Nitin and {Kumar}, Ankit and {Chanda}, Prateek and {Haque}, Md and {Kirk}, Michael and {Mueller}, Michael and {Konge}, Sudarshan and {Srivastava}, Rajul and {Jain}, Yash and {Bennett}, Samuel and {Baruah}, Ankit and {Barnes}, Will and {Charlton}, Michael and {Maloney}, Shane and {Chorley}, Nicky and {Himanshu} and {Modi}, Sanskar and {Mason}, James and {Naman} and {Campos Rozo}, Jose Ivan and {Manley}, Larry and {Chatterjee}, Agneet and {Evans}, John and {Malocha}, Michael and {Bobra}, Monica and {Ghosh}, Sourav and {Airmansmith} and {Sta{\'n}czak}, Dominik and {De Visscher}, Ruben and {Verma}, Shresth and {Agrawal}, Ankit and {Buddhika}, Dumindu and {Sharma}, Swapnil and {Park}, Jongyeob and {Bates}, Matt and {Goel}, Dhruv and {Taylor}, Garrison and {Cetusic}, Goran and {Jacob} and {Inchaurrandieta}, Mateo and {Dacie}, Sally and {Dubey}, Sanjeev and {Sharma}, Deepankar and {Bray}, Erik and {Rideout}, Jai and {Zahniy}, Serge and {Meszaros}, Tomas and {Bose}, Abhigyan and {Chicrala}, Andr{\'e} and {Ankit} and {Guennou}, Chlo{\'e} and {D'Avella}, Daniel and {Williams}, Daniel and {Ballew}, Jordan and {Murphy}, Nick and {Lodha}, Priyank and {Robitaille}, Thomas and {Krishan}, Yash and {Hill}, Andrew and {Eigenbrot}, Arthur and {Mampaey}, Benjamin and {Wiedemann}, Bernhard and {Molina}, Carlos and {Ke{\c{s}}kek}, Duygu and {Habib}, Ishtyaq and {Letts}, Joseph and {Baz{\'a}n}, Juanjo and {Arbolante}, Quinn and {Gomillion}, Reid and {Kothari}, Yash and {Sharma}, Yash and {Stevens}, Abigail and {Price-Whelan}, Adrian and {Mehrotra}, Ambar and {Kustov}, Arseniy and {Stone}, Brandon and {Dang}, Trung and {Arias}, Emmanuel and {Dover}, Fionnlagh and {Verstringe}, Freek and {Kumar}, Gulshan and {Mathur}, Harsh and {Babuschkin}, Igor and {Wimbish}, Jaylen and {Buitrago-Casas}, Juan and {Krishna}, Kalpesh and {Hiware}, Kaustubh and {Mangaonkar}, Manas and {Mendero}, Matthew and {Schoentgen}, Micka{\"e}l and {Gyenge}, Norbert and {Streicher}, Ole and {Mekala}, Rajasekhar and {Mishra}, Rishabh and {Srikanth}, Shashank and {Jain}, Sarthak and {Yadav}, Tannmay and {Wilkinson}, Tessa and {Pereira}, Tiago and {Agrawal}, Yudhik and {Jamescalixto} and {Yasintoda} and {Murray}, Sophie}, title = "{SunPy: A Python package for Solar Physics}", - journal = {The Journal of Open Source Software}, + journal = {Journal of Open Source Software}, keywords = {Python, C, Astronomy, Solar physics, IDL}, year = 2020, month = feb, diff --git a/joss_paper/paper.md b/joss_paper/paper.md index 69a8b5006..9f63d54b8 100644 --- a/joss_paper/paper.md +++ b/joss_paper/paper.md @@ -100,10 +100,10 @@ analogous to how users handle coordinate-agnostic data with arrays. ndcube requires that coordinate transformations be expressed via the World Coordinate System (WCS), a coordinate framework commonly used throughout astronomy. -The WCS framework has multiple implementations, e.g. FITS-WCS, gWCS, etc., +The WCS framework has multiple implementations (e.g. FITS-WCS, gWCS, and others), each with a different incompatible API, which makes workflows and derived tools non-transferable between implementations. -ndcube overcomes this by leveraging AstroPy's WCS API [APE-14; @ape14] +ndcube overcomes this by leveraging Astropy's WCS API [APE-14, @ape14] which can be wrapped around any underlying WCS implementation. This enables ndcube to use the same API to interact with any set of WCS transformations. ndcube's data-WCS coupling allows users to analyze their data more easily and @@ -116,7 +116,7 @@ N-dimensional data sets are common in all areas of science and beyond. For example, a series of images taken sequentially with a CCD camera can be stored as a single 3-D array with two spatial axes and one temporal axis. In astronomy, the most commonly used framework for translating between array element -indices and the location, time, etc. in the Universe being observed is the World +indices, and the location or time in the Universe being observed is the World Coordinate System (WCS). WCS's ability to handle many different physical types of coordinates (e.g. spatial, temporal, spectral, etc.) and their projections onto a data array (e.g. right ascension @@ -125,14 +125,14 @@ standardized and powerful way to relate array axes to the physical coordinate ty they represent. There are mature Python packages for handling N-D array operations -- -e.g. numpy [@numpy], dask [@dask], etc. -- and others for supporting WCS coordinate -transformations -- e.g. astropy [@astropy2013; @astropy2018; @astropy2022], gWCS [@gwcs]. +for example, NumPy [@numpy], and Dask [@dask] -- and others for supporting WCS coordinate +transformations -- for example, Astropy [@astropy2013; @astropy2018; @astropy2022], and gWCS [@gwcs]. However, none treat data and coordinates in a combined, self-consistent way. -The closest alternative to ndcube is xarray [@xarray]. -However xarray has been developed for the requirements and conventions of the +The closest alternative to ndcube is Xarray [@xarray]. +However Xarray has been developed for the requirements and conventions of the geosciences which, although similar to those of astronomy in concept, are sufficiently different in construction to cause significant friction. -Crucially, xarray does not currently support WCS coordinate transformations. +Crucially, Xarray does not currently support WCS coordinate transformations. Tools that do support WCS-based coordinate-aware data analysis, such as the SunPy [@sunpy] Map class for 2-D images of the Sun, tend to have APIs specific to particular combinations of dimensions, physical types, coordinate systems and WCS implementations. @@ -143,8 +143,8 @@ astronomy. ndcube overcomes these challenges via its design policy that all functionalities and APIs must be agnostic to the number of dimensions and coordinate types they represent. -Moreover, ndcube's employment of the AstroPy WCS API makes it agnostic to the -underlying WCS implementation, e.g. FITS-WCS, gWCS, etc. +Moreover, ndcube's employment of the Astropy WCS API makes it agnostic to the +underlying WCS implementation. # The Role of ndcube and its Features @@ -154,7 +154,7 @@ First, it formalizes the NDCube 2 API in software via its abstract base classes (ABCs), `NDCubeABC`, `ExtraCoordsABC` and `GlobalCoordsABC`. The NDCube 2 API is a standardized framework for inspecting and manipulating coordinate-aware N-D astronomical data and is defined by 12th SunPy Enhancement -Proposal [SEP-12; @sep12]. +Proposal [SEP-12, @sep12]. A discussion of the philosophies underpinning the NDCube 2 API can be found in @ndcube. Second, the ndcube package implements the NDCube 2 API in corresponding data and @@ -177,8 +177,7 @@ Thus, ndcube can enhance the productivity of developers by centralizing the development and maintenance of the most useful and general functionalities. This leaves more time for developing a greater range of tools for the community and/or enables part-time developers to devote more effort to other aspects of their -jobs, e.g. scientific analysis. - +jobs. ## High-level Data Classes @@ -188,26 +187,26 @@ The three high-level data classes provided by the ndcube package are `NDCube`, a set of WCS transformations. The array can be any object that exposes `.dtype` and `.shape` attributes and can be sliced by the standard Python slicing API. -Thus `NDCube` not only supports numpy arrays but also others such as dask for -distributed computing [@dask], cupy for GPU operations [@cupy], etc. -`NDCube` leverages the AstroPy WCS API for interacting with and manipulating the WCS +Thus `NDCube` not only supports NumPy arrays but also others such as Dask for +distributed computing [@dask], CuPy for GPU operations [@cupy], and others. +`NDCube` leverages the Astropy WCS API for interacting with and manipulating the WCS transformations. -This means `NDCube` can support any WCS implementation, e.g. FITS-WCS, gWCS, etc., -so long as it's supplied in an AstroPy-WCS-API-compliant object. +This means `NDCube` can support any WCS implementation (e.g. FITS-WCS, gWCS, and others), +so long as it's supplied in an Astropy-WCS-API-compliant object. The components of an `NDCube` are supplied by the following keyword arguments and accessed via attributes of the same name. - `data`: The data array. (Required) - `wcs`: The primary set of coordinate transformations. (Required) -- `uncertainty`: an `astropy.nddata.NDUncertainty` object giving the uncertainty of each element in the data array., optional -- `mask`: a boolean array denoting which elements of the data array are reliable., optional A `True` value implies the data is masked, i.e. unreliable., optional -- `meta`: an object for storing metadata, e.g. a Python dictionary., optional -- `unit`: the unit of the data., optional +- `uncertainty`: an `astropy.nddata.NDUncertainty` object giving the uncertainty of each element in the data array. (Optional) +- `mask`: a boolean array denoting which elements of the data array are reliable. A `True` value implies the data is masked, or unreliable. (Optional) +- `meta`: an object for storing metadata, (e.g. a Python dictionary). (Optional) +- `unit`: the unit of the data. (Optional) `NDCube` also supports additional coordinate information. See the subsection on Coordinate Classes. `NDCube` provides several analysis methods such as slicing (by array indices), -cropping (by real world coordinates), reprojecting to new WCS transformations, +cropping (by real-world coordinates), reprojecting to new WCS transformations, visualization, rebinning data, arithmetic operations, and more. All these methods manipulate the data, coordinates, and supporting data (e.g. uncertainties) simultaneously and self-consistently. @@ -216,19 +215,18 @@ This relieves users of well-defined, but tedious and error-prone tasks. `NDCubeSequence` is designed to handle multiple `NDCube` instances that are arranged in some order. Cubes can be ordered along an additional axis to those represented by the cubes, -e.g. a sequence of 2-D spatial images arranged along a 3rd time axis. -In this case users can interact with the data as if it were a 3-D cube with a similar +for example, a sequence of 2-D spatial images arranged along a 3rd time axis. +In this case, users can interact with the data as if it were a 3-D cube with a similar API to `NDCube`. -Alternatively, the cubes can be ordered along one of the cubes' axes, e.g. a +Alternatively, the cubes can be ordered along one of the cubes' axes, for example, a sequence of tiles in an image mosaic where each cube represents an adjacent region of the sky. `NDCubeSequence` provides APIs for both the (N+1)-D and extended N-D paradigms, -that are simultanesouly available on each `NDCubeSequence` instance. +that are simultaneously available on each `NDCubeSequence` instance. This enables users to switch between the paradigms without reformatting or copying the underlying data. `NDCubeSequence` also provides various methods to help with data analysis. -These APIs are similar to `NDCube` wherever possible, e.g. slicing, visualization, -etc., to minimize friction between analyzing single and multiple cubes. +These APIs are similar to `NDCube` wherever possible (e.g. for slicing and visualization), to minimize friction between analyzing single and multiple cubes. `NDCollection` allows unordered but related `NDCube` and `NDCubeSequence` objects to be linked, similar to how a Python dictionary is used. @@ -236,7 +234,7 @@ However, in addition to dictionary-like features, `NDCollection` allows axes of different cubes with the same lengths to be marked as 'aligned'. This enables these axes on all constituent cubes to be sliced at the `NDCollection` level. -One application of this is linking derived data products, e.g. a spectral image cube +One application of this is linking derived data products, for example, a spectral image cube and a Doppler map derived from one of its spectral lines. Marking both cubes' spatial axes as 'aligned' and slicing the `NDCollection` rather than the two cubes separately, simplifies the extraction of regions of @@ -248,33 +246,33 @@ how to use them can be found in @ndcube and the ndcube documentation [@ndcube-do ## Coordinate Classes -The ndcube package provides two coordinates classes, `ExtraCoords` and +The ndcube package provides two coordinate classes, `ExtraCoords` and `GlobalCoords`. `ExtraCoords` provides a mechanism for storing coordinate transformations that are supplemental to the primary WCS transformations. This can be very useful if, say, we have a spectral image cube whose images were taken at slightly different times but whose WCS does not include time. -In this case `ExtraCoords` can be used to associate an `astropy.time.Time` object -with the spectral axis without having to manually construct a new WCS, +In this case, `ExtraCoords` can be used to associate an `astropy.time.Time` object +with the spectral axis without having to manually construct a new WCS which is a potentially complicated task even for experienced users. `ExtraCoords` supports both functional and lookup-table-based transformations. It can therefore also be used as an alternative set of coordinate transformations to those in the primary WCS and used interchangeably. By contrast, `GlobalCoords` supports scalar coordinates that apply to the whole -`NDCube` rather than any of its axes, e.g. the timestamp of a 2-D image. +`NDCube` rather than any of its axes, for example, the timestamp of a 2-D image. Scalar coordinates are not supported by WCS because it requires all coordinates to be associated with at least one array axis, hence the need for `GlobalCoords`. When an axis is dropped from an `NDCube` via slicing, the values of the dropped coordinates at the relevant location along the dropped axis are automatically -added to the associated `GlobalCoords` object, e.g. the timestamp of a 2-D image +added to the associated `GlobalCoords` object, for example, the timestamp of a 2-D image sliced from a 3-D space-space-time cube. Thus coordinate information is never lost due to slicing. `NDCube` objects are always instantiated with associated `ExtraCoords` and `GlobalCoords` objects, even if empty. Users can then add and remove coordinates subsequently. -For a more in depth dicussion of `ExtraCoords` and `GlobalCoords`, see @ndcube. +For a more in-depth discussion of `ExtraCoords` and `GlobalCoords`, see @ndcube. # Community Applications of ndcube @@ -289,7 +287,7 @@ specutils [@specutils-docs; @specutils-code], jdaviz [@jdaviz], sunraster [@sunr irispy-lmsal [@irispy-docs; @irispy-code], EISPAC [@eispac-docs; @eispac-code] and DKIST user tools packages which all depend on ndcube. ndcube is also used in the data pipeline of the PUNCH mission [Polarimeter to UNify -the Corona and Heliosphere; @punch], scheduled for launch in 2025. +the Corona and Heliosphere, @punch], scheduled for launch in 2025. In addition, individual researchers are using the ndcube package in their own analysis workflows. @@ -306,7 +304,7 @@ and promote scientific innovation. We acknowledge financial support for ndcube from NASA's Heliophysics Data Environment Enhancement program, the Daniel K. Inouye Solar Telescope, and Solar Orbiter/SPICE (grant 80NSSC19K1000). -We also acknowledge the SunPy, Python in Heliophysics, and AstroPy communities for +We also acknowledge the SunPy, Python in Heliophysics, and Astropy communities for their contributions and support. # References