// ____ ______ __ // / __ \ / ____// / // / /_/ // / / / // / ____// /___ / /___ PixInsight Class Library // /_/ \____//_____/ PCL 2.4.23 // ---------------------------------------------------------------------------- // pcl/GaiaDatabaseFile.h - Released 2022-03-12T18:59:29Z // ---------------------------------------------------------------------------- // This file is part of the PixInsight Class Library (PCL). // PCL is a multiplatform C++ framework for development of PixInsight modules. // // Copyright (c) 2003-2022 Pleiades Astrophoto S.L. All Rights Reserved. // // Redistribution and use in both source and binary forms, with or without // modification, is permitted provided that the following conditions are met: // // 1. All redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // 2. All redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // 3. Neither the names "PixInsight" and "Pleiades Astrophoto", nor the names // of their contributors, may be used to endorse or promote products derived // from this software without specific prior written permission. For written // permission, please contact info@pixinsight.com. // // 4. All products derived from this software, in any form whatsoever, must // reproduce the following acknowledgment in the end-user documentation // and/or other materials provided with the product: // // "This product is based on software from the PixInsight project, developed // by Pleiades Astrophoto and its contributors (https://pixinsight.com/)." // // Alternatively, if that is where third-party acknowledgments normally // appear, this acknowledgment must be reproduced in the product itself. // // THIS SOFTWARE IS PROVIDED BY PLEIADES ASTROPHOTO AND ITS CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED // TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PLEIADES ASTROPHOTO OR ITS // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, // EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, BUSINESS // INTERRUPTION; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; AND LOSS OF USE, // DATA OR PROFITS) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // ---------------------------------------------------------------------------- #ifndef __PCL_GaiaDatabaseFile_h #define __PCL_GaiaDatabaseFile_h /// \file pcl/GaiaDatabaseFile.h #include #include #include #include namespace pcl { // ---------------------------------------------------------------------------- /*! * \namespace pcl::GaiaStarFlag * \brief Data availability and quality flags for Gaia star data. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
GaiaStarFlag::NoPM No proper motions and parallax available.
GaiaStarFlag::NoGBPMag No G-BP magnitude available.
GaiaStarFlag::NoGRPMag No G-RP magnitude available.
GaiaStarFlag::LackingData Equivalent to NoPM|NoGBPMag|NoGRPMag.
GaiaStarFlag::GoldRA Standard error of right ascension < 0.13 mas.
GaiaStarFlag::GoldDec Standard error of declination < 0.12 mas.
GaiaStarFlag::GoldParx Standard error of parallax < 0.13 mas.
GaiaStarFlag::GoldPMRA Standard error of proper motion in right ascension < 0.14 mas/year.
GaiaStarFlag::GoldPMDec Standard error of proper motion in declination < 0.12 mas/year.
GaiaStarFlag::GoldAstrometry Equivalent to GoldRA|GoldDec|GoldParx|GoldPMRA|GoldPMDec.
GaiaStarFlag::SilverRA Standard error of right ascension in the range [0.13,1.43) mas.
GaiaStarFlag::SilverDec Standard error of declination in the range [0.12,1.28) mas.
GaiaStarFlag::SilverParx Standard error of parallax in the range [0.13,0.86) mas.
GaiaStarFlag::SilverPMRA Standard error of proper motion in right ascension in the range [0.14,0.97) mas/year.
GaiaStarFlag::SilverPMDec Standard error of proper motion in declination in the range [0.12,0.85) mas/year.
GaiaStarFlag::SilverAstrometry Equivalent to SilverRA|SilverDec|SilverParx|SilverPMRA|SilverPMDec.
GaiaStarFlag::BronzeRA Standard error of right ascension in the range [1.43,2.49) mas.
GaiaStarFlag::BronzeDec Standard error of declination in the range [1.28,2.22) mas.
GaiaStarFlag::BronzeParx Standard error of parallax in the range [0.86,1.38) mas.
GaiaStarFlag::BronzePMRA Standard error of proper motion in right ascension in the range [0.97,1.58) mas/year.
GaiaStarFlag::BronzePMDec Standard error of proper motion in declination in the range [0.85,1.38) mas/year.
GaiaStarFlag::BronzeAstrometry Equivalent to BronzeRA|BronzeDec|BronzeParx|BronzePMRA|BronzePMDec.
GaiaStarFlag::GoldGMag Error on G-band mean flux < 0.84 e-/s.
GaiaStarFlag::GoldGBPMag Error on the integrated BP mean flux < 4.94 e-/s.
GaiaStarFlag::GoldGRPMag Error on the integrated RP mean flux < 5.89 e-/s.
GaiaStarFlag::GoldPhotometry Equivalent to GoldGMag|GoldGBPMag|GoldGRPMag.
GaiaStarFlag::SilverGMag Error on G-band mean flux in the range [0.84,2.13) e-/s.
GaiaStarFlag::SilverGBPMag Error on the integrated BP mean flux in the range [4.94,12.61) e-/s.
GaiaStarFlag::SilverGRPMag Error on the integrated RP mean flux in the range [5.89,15.40) e-/s.
GaiaStarFlag::SilverPhotometry Equivalent to SilverGMag|SilverGBPMag|SilverGRPMag.
GaiaStarFlag::BronzeGMag Error on G-band mean flux in the range [2.13,3.08) e-/s.
GaiaStarFlag::BronzeGBPMag Error on the integrated BP mean flux in the range [12.61,18.04) e-/s.
GaiaStarFlag::BronzeGRPMag Error on the integrated RP mean flux in the range [15.40,22.35) e-/s.
GaiaStarFlag::BronzePhotometry Equivalent to BronzeGMag|BronzeGBPMag|BronzeGRPMag.
GaiaStarFlag::BPRPExcess BP-RP excess factor ≥ 2.0
GaiaStarFlag::BPRPExcessHigh BP-RP excess factor ≥ 5.0 (Gaia EDR3 only)
* * The above data quality ranges correspond to the Gaia EDR3 XPSD database * version 1.0.0, released December 4, 2020. * * \ingroup point_source_databases */ namespace GaiaStarFlag { enum mask_type { NoPM = 0x00000001, NoGBPMag = 0x00000002, NoGRPMag = 0x00000004, LackingData = 0x00000007, GoldRA = 0x00000010, GoldDec = 0x00000020, GoldPMRA = 0x00000040, GoldPMDec = 0x00000080, SilverRA = 0x00000100, SilverDec = 0x00000200, SilverPMRA = 0x00000400, SilverPMDec = 0x00000800, BronzeRA = 0x00001000, BronzeDec = 0x00002000, BronzePMRA = 0x00004000, BronzePMDec = 0x00008000, GoldGMag = 0x00010000, GoldGBPMag = 0x00020000, GoldGRPMag = 0x00040000, GoldParx = 0x00080000, SilverGMag = 0x00100000, SilverGBPMag = 0x00200000, SilverGRPMag = 0x00400000, SilverParx = 0x00800000, BronzeGMag = 0x01000000, BronzeGBPMag = 0x02000000, BronzeGRPMag = 0x04000000, BronzeParx = 0x08000000, BPRPExcess = 0x10000008, BPRPExcessHigh = 0x20000000, GoldAstrometry = 0x000800F0, SilverAstrometry = 0x00800F00, BronzeAstrometry = 0x0800F000, GoldPhotometry = 0x00070000, SilverPhotometry = 0x00700000, BronzePhotometry = 0x07000000 }; } // ---------------------------------------------------------------------------- /*! * \struct GaiaStarData * \brief Star data structure for Gaia catalog search operations. * * \ingroup point_source_databases */ struct PCL_CLASS GaiaStarData { double ra = 0; //!< Right ascension in degrees, in the range [0,360). double dec = 0; //!< Declination in degrees, in the range [-90,+90]. float parx = 0; //!< Parallax in mas. float pmra = 0; //!< Proper motion in right ascension * cos(dec), in mas/year. float pmdec = 0; //!< Proper motion in declination, in mas/year. float magG = 0; //!< Mean G magnitude. float magBP = 0; //!< Mean G_BP magnitude. float magRP = 0; //!< Mean G_RP magnitude. uint32 flags = 0u; //!< Data availability and quality flags. See the GaiaStarFlag namespace. }; // ---------------------------------------------------------------------------- /*! * \struct pcl::GaiaSearchData * \brief Data items and parameters for Gaia catalog search operations. * * \ingroup point_source_databases */ typedef XPSD::SearchData GaiaSearchData; // ---------------------------------------------------------------------------- /*! * \class GaiaDatabaseFile * \brief Gaia catalog star database file (XPSD format). * * This class implements an interface to XPSD files serializing encoded Gaia * star data. As of writing this documentation (December 2020), Gaia DR2 and * EDR3 are supported and have been implemented. * * The most important functionality of this class is performing fast indexed * search operations to retrieve point source data for Gaia stars matching a * set of user-defined criteria. See the GaiaDatabaseFile::Search() member * function and the GaiaSearchData structure for detailed information. * * This implementation provides the following data for the complete Gaia DR2 * and EDR3 catalogs: * * \li Source positions. * \li Parallaxes. * \li Proper motions. * \li Mean magnitudes on the G, GBP and GRP bands. * \li Data availability and quality flags. * * \b References * * \li Gaia Data Release 2 - online resources: * https://www.cosmos.esa.int/web/gaia/data-release-2 * * \li Gaia Data Release 2. Summary of the contents and survey * properties. Gaia Collaboration, Brown, A.G.A., et al.: * https://arxiv.org/abs/1804.09365v2 * * \li Gaia Data Release 2. Documentation release 1.2: * https://gea.esac.esa.int/archive/documentation/GDR2/index.html * * \li Gaia Early Data Release 3 - online resources: * https://www.cosmos.esa.int/web/gaia/early-data-release-3 * * \li Gaia Early Data Release 3. Summary of the contents and survey * properties. Gaia Collaboration, A.G.A. Brown, A. Vallenari, T. Prusti, * J.H.J. de Bruijne, et al.: * https://www.aanda.org/articles/aa/pdf/forth/aa39657-20.pdf * * \li Gaia Early Data Release 3. Documentation release 1.0: * https://gea.esac.esa.int/archive/documentation/GEDR3/index.html * * \b Credits * * This work has made use of data from the European Space Agency (ESA) mission * Gaia (https://www.cosmos.esa.int/gaia), processed by the Gaia Data * Processing and Analysis Consortium (DPAC, * https://www.cosmos.esa.int/web/gaia/dpac/consortium). Funding for the DPAC * has been provided by national institutions, in particular the institutions * participating in the Gaia Multilateral Agreement. * * \sa StarDatabaseFile, APASSDatabaseFile * \ingroup point_source_databases */ class PCL_CLASS GaiaDatabaseFile : public StarDatabaseFile { public: /*! * Default constructor. * * Constructs an invalid instance that cannot be used until initialized by * calling the Open() member function. */ GaiaDatabaseFile() = default; /*! * Constructs a &GaiaDatabaseFile instance initialized from the specified * point source database file in XPSD format. As of writing this * documentation (December 2020), The Gaia DR2 and EDR3 catalogs are * available. * * In the event of errors or invalid data, this constructor will throw the * appropriate Error exception. */ GaiaDatabaseFile( const String& filePath ) : StarDatabaseFile( filePath ) { static_assert( sizeof( EncodedStarData ) == 32, "Invalid sizeof( GaiaDatabaseFile::EncodedStarData )" ); if ( Metadata().databaseIdentifier == "GaiaEDR3" ) m_dr = "EDR3"; else if ( Metadata().databaseIdentifier == "GaiaDR2" ) { m_dr = "DR2"; StringList tokens; Metadata().databaseVersion.Break( tokens, '.' ); // Make sure we reject an unsupported DR2 version older than 1.0.2 if ( tokens.Length() < 3 || tokens[0].ToInt() < 1 || tokens[1].ToInt() < 0 || tokens[2].ToInt() < 2 ) throw Error( "Unsupported Gaia DR2 database version '" + Metadata().databaseVersion + "': " + filePath ); } else throw Error( "Invalid or unsupported Gaia database file with unknown identifier '" + Metadata().databaseIdentifier + "': " + filePath ); } /*! * Move assignment operator. Returns a reference to this object. */ GaiaDatabaseFile& operator =( GaiaDatabaseFile&& ) = default; /*! * Deleted copy constructor. %GaiaDatabaseFile instances are unique, * hence cannot be copied. */ GaiaDatabaseFile( const GaiaDatabaseFile& ) = delete; /*! * Deleted copy assignment operator. %GaiaDatabaseFile instances are * unique, hence cannot be copied. */ GaiaDatabaseFile& operator =( const GaiaDatabaseFile& ) = delete; /*! * Performs a search operation for point sources matching the specified * criteria. * * This member function performs a fast indexed search for point sources in * this database file matching the criteria defined in the specified \a data * structure. See the GaiaSearchData structure for detailed information on * search parameters and output data. * * Summarily, search criteria include: * * \li The region of the sky where point sources will be searched for. This * region is defined by the equatorial coordinates of a field center and a * field radius. * * \li An optional range of magnitudes. * * \li Optional inclusion/exclusion flags. * * \li An optional limit for the number of sources included in the search * result. * * The result of the search operation is also returned in the specified * \a data structure, including, among others, the following items: * * \li The list of point sources found. * * \li Instrumentation items for performance analysis, including: total * search time, time used for I/O operations, total I/O operations, time * used for data decoding, and time used for data decompression. */ void Search( GaiaSearchData& data ) const { ElapsedTime T; for ( const XPSD::IndexTree& tree : m_index ) tree.Search( data.centerRA, data.centerDec, data.radius, &data ); data.timeTotal += T(); } /*! * Returns the name of the Gaia data release corresponding to the data * available in this database file. As of writing this documentation * (December 2020), this member function can return either "DR2" or "EDR3". */ const IsoString& DataRelease() const { return m_dr; } private: IsoString m_dr; // data release, one of "DR2", "EDR3" #pragma pack(push, 1) /* * Encoded star record (32 bytes uncompressed). */ struct EncodedStarData { // Projected coordinates relative to the origin of the parent quadtree // node, in 0.002 mas units. uint32 dx; uint32 dy; // Parallax in mas units. float parx; // Proper motions, mas/yr. float pmra; float pmdec; // Mean magnitudes in 0.001 mag units, encoded as (mag + 1.5)*1000. uint16 magG; uint16 magBP; uint16 magRP; // Right ascension correction for high declinations, in 0.01 mas units. int16 dra; // Data availability and quality flags. uint32 flags; }; #pragma pack(pop) void LoadData( void* block, uint64 offset, uint32 size, void* searchData ) const override { ElapsedTime T; StarDatabaseFile::LoadData( block, offset, size, searchData ); reinterpret_cast( searchData )->timeIO += T(); ++reinterpret_cast( searchData )->countIO; } void Uncompress( ByteArray& block, uint32 uncompressedSize, void* searchData ) const override { ElapsedTime T; StarDatabaseFile::Uncompress( block, uncompressedSize, searchData ); reinterpret_cast( searchData )->timeUncompress += T(); } void GetEncodedData( const ByteArray& data, const XPSD::IndexTree& tree, const XPSD::IndexNode& node, void* searchData ) const override { ElapsedTime T; GaiaSearchData* search = reinterpret_cast( searchData ); double r = Rad( search->radius ); const EncodedStarData* S = reinterpret_cast( data.Begin() ); int count = int( data.Size() / sizeof( EncodedStarData ) ); int matched = 0; for ( int i = 0; i < count; ++i, ++S ) if ( search->requiredFlags == 0 || (S->flags & search->requiredFlags) == search->requiredFlags ) if ( search->inclusionFlags == 0 || (S->flags & search->inclusionFlags) != 0 ) if ( search->exclusionFlags == 0 || (S->flags & search->exclusionFlags) == 0 ) { float magG = 0.001*S->magG - 1.5; if ( magG >= search->magnitudeLow ) if ( magG <= search->magnitudeHigh ) { GaiaStarData star; double x = node.x0 + double( S->dx )/3600/1000/500; double y = node.y0 + double( S->dy )/3600/1000/500; tree.Unproject( star.ra, star.dec, x, y ); if ( unlikely( S->dra != 0 ) ) { star.ra += double( S->dra )/3600/1000/100; if ( star.ra < 0 ) star.ra += 360; else if ( star.ra >= 360 ) star.ra -= 360; } if ( Distance( search->centerRA, search->centerDec, star.ra, star.dec ) < r ) { if ( search->stars.Length() < size_type( search->sourceLimit ) ) { star.parx = S->parx; star.pmra = S->pmra; star.pmdec = S->pmdec; star.magG = magG; star.magBP = 0.001*S->magBP - 1.5; star.magRP = 0.001*S->magRP - 1.5; star.flags = S->flags; search->stars << star; } else ++search->excessCount; ++matched; } } } search->rejectCount += count - matched; search->timeDecode += T(); } friend class GaiaDR2DatabaseFileGenerator; friend class GaiaEDR3DatabaseFileGenerator; }; // ---------------------------------------------------------------------------- } // pcl #endif // __PCL_GaiaDatabaseFile_h // ---------------------------------------------------------------------------- // EOF pcl/GaiaDatabaseFile.h - Released 2022-03-12T18:59:29Z