From 6165b04c0dfab3dbb8c955f0c0081b62bb99c1e0 Mon Sep 17 00:00:00 2001 From: stvoutsin Date: Thu, 29 Feb 2024 15:43:39 +0200 Subject: [PATCH 1/2] Update Library_validation.json with new library versions --- notebooks/Library_validation.json | 242 +++++++++++++++++------------- 1 file changed, 137 insertions(+), 105 deletions(-) diff --git a/notebooks/Library_validation.json b/notebooks/Library_validation.json index c670a48..1aacd05 100644 --- a/notebooks/Library_validation.json +++ b/notebooks/Library_validation.json @@ -1,10 +1,9 @@ - -{ +{ "paragraphs": [ { - "text": "%pyspark\n\n# Check Numpy\n\nimport numpy\nassert numpy.__version__ == \"1.21.0\" ", + "text": "%pyspark\n\n# Check Numpy\n\nimport numpy\nassert numpy.__version__ == \"1.26.2\" ", "user": "gaiauser", - "dateUpdated": "2022-03-16T18:34:45+0000", + "dateUpdated": "2024-02-29T13:35:15+0000", "progress": 0, "config": { "editorSetting": { @@ -26,19 +25,19 @@ "apps": [], "runtimeInfos": {}, "progressUpdateIntervalMs": 500, - "jobName": "paragraph_1647455684908_816456362", + "jobName": "paragraph_1709213551209_563233748", "id": "paragraph_1647455684908_816456362", - "dateCreated": "2022-03-16T18:34:44+0000", - "dateStarted": "2022-03-16T18:34:45+0000", - "dateFinished": "2022-03-16T18:34:45+0000", + "dateCreated": "2024-02-29T13:32:31+0000", + "dateStarted": "2024-02-29T13:35:15+0000", + "dateFinished": "2024-02-29T13:35:15+0000", "status": "FINISHED", "focus": true, - "$$hashKey": "object:2622" + "$$hashKey": "object:2473" }, { - "text": "%pyspark\n\n# Check scipy\n\nimport scipy\nassert scipy.__version__ == \"1.7.3\" ", + "text": "%pyspark\n\n# Check scipy\n\nimport scipy\nassert scipy.__version__ == \"1.11.4\" ", "user": "gaiauser", - "dateUpdated": "2022-03-16T18:34:46+0000", + "dateUpdated": "2024-02-29T13:35:15+0000", "progress": 0, "config": { "editorSetting": { @@ -60,18 +59,18 @@ "apps": [], "runtimeInfos": {}, "progressUpdateIntervalMs": 500, - "jobName": "paragraph_1647455684909_1711122451", + "jobName": "paragraph_1709213551210_775363856", "id": "paragraph_1647455684909_1711122451", - "dateCreated": "2022-03-16T18:34:44+0000", - "dateStarted": "2022-03-16T18:34:46+0000", - "dateFinished": "2022-03-16T18:34:46+0000", + "dateCreated": "2024-02-29T13:32:31+0000", + "dateStarted": "2024-02-29T13:35:15+0000", + "dateFinished": "2024-02-29T13:35:15+0000", "status": "FINISHED", - "$$hashKey": "object:2623" + "$$hashKey": "object:2474" }, { "text": "%pyspark\n\n# Check jupyter\n\nimport jupyter\nassert jupyter.__version__ == \"1.0.0\"", "user": "gaiauser", - "dateUpdated": "2022-03-16T18:34:46+0000", + "dateUpdated": "2024-02-29T13:35:15+0000", "progress": 0, "config": { "editorSetting": { @@ -93,18 +92,18 @@ "apps": [], "runtimeInfos": {}, "progressUpdateIntervalMs": 500, - "jobName": "paragraph_1647455684910_338094694", + "jobName": "paragraph_1709213551210_1923104599", "id": "paragraph_1647455684910_338094694", - "dateCreated": "2022-03-16T18:34:44+0000", - "dateStarted": "2022-03-16T18:34:46+0000", - "dateFinished": "2022-03-16T18:34:46+0000", + "dateCreated": "2024-02-29T13:32:31+0000", + "dateStarted": "2024-02-29T13:35:15+0000", + "dateFinished": "2024-02-29T13:35:15+0000", "status": "FINISHED", - "$$hashKey": "object:2624" + "$$hashKey": "object:2475" }, { - "text": "%pyspark\n\n# Check Cython\n\nimport Cython\nassert Cython.__version__ == \"0.29.23\"", + "text": "%pyspark\n\n# Check Cython\n\nimport Cython\nassert Cython.__version__ == \"0.29.36\"", "user": "gaiauser", - "dateUpdated": "2022-03-16T18:34:46+0000", + "dateUpdated": "2024-02-29T13:35:15+0000", "progress": 0, "config": { "editorSetting": { @@ -126,18 +125,18 @@ "apps": [], "runtimeInfos": {}, "progressUpdateIntervalMs": 500, - "jobName": "paragraph_1647455684911_1073224810", + "jobName": "paragraph_1709213551210_1691296094", "id": "paragraph_1647455684911_1073224810", - "dateCreated": "2022-03-16T18:34:44+0000", - "dateStarted": "2022-03-16T18:34:46+0000", - "dateFinished": "2022-03-16T18:34:46+0000", + "dateCreated": "2024-02-29T13:32:31+0000", + "dateStarted": "2024-02-29T13:35:15+0000", + "dateFinished": "2024-02-29T13:35:15+0000", "status": "FINISHED", - "$$hashKey": "object:2625" + "$$hashKey": "object:2476" }, { - "text": "%pyspark\n\n# Check pandas\n\nimport pandas\nassert pandas.__version__ == \"1.2.4\"", + "text": "%pyspark\n\n# Check pandas\n\nimport pandas\nassert pandas.__version__ == \"2.1.3\"", "user": "gaiauser", - "dateUpdated": "2022-03-16T18:34:46+0000", + "dateUpdated": "2024-02-29T13:35:21+0000", "progress": 0, "config": { "editorSetting": { @@ -159,18 +158,18 @@ "apps": [], "runtimeInfos": {}, "progressUpdateIntervalMs": 500, - "jobName": "paragraph_1647455684911_986045671", + "jobName": "paragraph_1709213551210_1174652565", "id": "paragraph_1647455684911_986045671", - "dateCreated": "2022-03-16T18:34:44+0000", - "dateStarted": "2022-03-16T18:34:46+0000", - "dateFinished": "2022-03-16T18:34:47+0000", + "dateCreated": "2024-02-29T13:32:31+0000", + "dateStarted": "2024-02-29T13:35:15+0000", + "dateFinished": "2024-02-29T13:35:15+0000", "status": "FINISHED", - "$$hashKey": "object:2626" + "$$hashKey": "object:2477" }, { - "text": "%pyspark\n\n# Check healpy\n\nimport healpy\nassert healpy.__version__ == \"1.14.0\"", + "text": "%pyspark\n\n# Check healpy\n\nimport healpy\nassert healpy.__version__ == \"1.16.6\"", "user": "gaiauser", - "dateUpdated": "2022-03-16T18:34:48+0000", + "dateUpdated": "2024-02-29T13:36:13+0000", "progress": 0, "config": { "editorSetting": { @@ -192,18 +191,18 @@ "apps": [], "runtimeInfos": {}, "progressUpdateIntervalMs": 500, - "jobName": "paragraph_1647455684912_1080433776", + "jobName": "paragraph_1709213551210_658739171", "id": "paragraph_1647455684912_1080433776", - "dateCreated": "2022-03-16T18:34:44+0000", - "dateStarted": "2022-03-16T18:34:48+0000", - "dateFinished": "2022-03-16T18:34:48+0000", + "dateCreated": "2024-02-29T13:32:31+0000", + "dateStarted": "2024-02-29T13:35:49+0000", + "dateFinished": "2024-02-29T13:35:49+0000", "status": "FINISHED", - "$$hashKey": "object:2627" + "$$hashKey": "object:2478" }, { - "text": "%pyspark\n\n# Check astropy\n\nimport astropy\nassert astropy.__version__ == \"4.2.1\"", + "text": "%pyspark\n\n# Check astropy\n\nimport astropy\nassert astropy.__version__ == \"5.3.4\"", "user": "gaiauser", - "dateUpdated": "2022-03-16T18:34:48+0000", + "dateUpdated": "2024-02-29T13:36:17+0000", "progress": 0, "config": { "editorSetting": { @@ -225,18 +224,18 @@ "apps": [], "runtimeInfos": {}, "progressUpdateIntervalMs": 500, - "jobName": "paragraph_1647455684915_642714948", + "jobName": "paragraph_1709213551210_556960768", "id": "paragraph_1647455684915_642714948", - "dateCreated": "2022-03-16T18:34:44+0000", - "dateStarted": "2022-03-16T18:34:48+0000", - "dateFinished": "2022-03-16T18:34:48+0000", + "dateCreated": "2024-02-29T13:32:31+0000", + "dateStarted": "2024-02-29T13:36:08+0000", + "dateFinished": "2024-02-29T13:36:08+0000", "status": "FINISHED", - "$$hashKey": "object:2628" + "$$hashKey": "object:2479" }, { - "text": "%pyspark\n\n# Check astroquery\n\nimport astroquery\nassert astroquery.__version__ == \"0.4.1\"", + "text": "%pyspark\n\n# Check astroquery\n\nimport astroquery\nassert astroquery.__version__ == \"0.4.6\"", "user": "gaiauser", - "dateUpdated": "2022-03-16T18:34:49+0000", + "dateUpdated": "2024-02-29T13:36:43+0000", "progress": 0, "config": { "editorSetting": { @@ -258,18 +257,18 @@ "apps": [], "runtimeInfos": {}, "progressUpdateIntervalMs": 500, - "jobName": "paragraph_1647455684916_957320587", + "jobName": "paragraph_1709213551210_1540423475", "id": "paragraph_1647455684916_957320587", - "dateCreated": "2022-03-16T18:34:44+0000", - "dateStarted": "2022-03-16T18:34:49+0000", - "dateFinished": "2022-03-16T18:34:49+0000", + "dateCreated": "2024-02-29T13:32:31+0000", + "dateStarted": "2024-02-29T13:36:43+0000", + "dateFinished": "2024-02-29T13:36:43+0000", "status": "FINISHED", - "$$hashKey": "object:2629" + "$$hashKey": "object:2480" }, { - "text": "%pyspark\n\n# Check sklearn\n\nimport sklearn\nassert sklearn.__version__ == \"0.24.2\"", + "text": "%pyspark\n\n# Check sklearn\n\nimport sklearn\nassert sklearn.__version__ == \"1.3.2\"", "user": "gaiauser", - "dateUpdated": "2022-03-16T18:34:49+0000", + "dateUpdated": "2024-02-29T13:37:10+0000", "progress": 0, "config": { "editorSetting": { @@ -291,18 +290,18 @@ "apps": [], "runtimeInfos": {}, "progressUpdateIntervalMs": 500, - "jobName": "paragraph_1647455684916_1769665284", + "jobName": "paragraph_1709213551210_214071695", "id": "paragraph_1647455684916_1769665284", - "dateCreated": "2022-03-16T18:34:44+0000", - "dateStarted": "2022-03-16T18:34:49+0000", - "dateFinished": "2022-03-16T18:34:49+0000", + "dateCreated": "2024-02-29T13:32:31+0000", + "dateStarted": "2024-02-29T13:37:10+0000", + "dateFinished": "2024-02-29T13:37:10+0000", "status": "FINISHED", - "$$hashKey": "object:2630" + "$$hashKey": "object:2481" }, { "text": "%pyspark\n\n# Check hdbscan\n# Can't check version as hdbscan does not have a __version__ attribute. Perhaps there is another way?\n\nimport hdbscan\n", "user": "gaiauser", - "dateUpdated": "2022-03-16T18:34:50+0000", + "dateUpdated": "2024-02-29T13:37:13+0000", "progress": 0, "config": { "editorSetting": { @@ -324,18 +323,18 @@ "apps": [], "runtimeInfos": {}, "progressUpdateIntervalMs": 500, - "jobName": "paragraph_1647455684917_667822688", + "jobName": "paragraph_1709213551210_1041160099", "id": "paragraph_1647455684917_667822688", - "dateCreated": "2022-03-16T18:34:44+0000", - "dateStarted": "2022-03-16T18:34:50+0000", - "dateFinished": "2022-03-16T18:34:50+0000", + "dateCreated": "2024-02-29T13:32:31+0000", + "dateStarted": "2024-02-29T13:37:13+0000", + "dateFinished": "2024-02-29T13:37:13+0000", "status": "FINISHED", - "$$hashKey": "object:2631" + "$$hashKey": "object:2482" }, { - "text": "%pyspark\n\n# Check Pyvo\n\nimport pyvo\nassert pyvo.__version__ == \"1.1\"", + "text": "%pyspark\n\n# Check Pyvo\n\nimport pyvo\nassert pyvo.__version__ == \"1.5.1\"", "user": "gaiauser", - "dateUpdated": "2022-03-16T18:34:51+0000", + "dateUpdated": "2024-02-29T13:40:50+0000", "progress": 0, "config": { "editorSetting": { @@ -358,18 +357,18 @@ "apps": [], "runtimeInfos": {}, "progressUpdateIntervalMs": 500, - "jobName": "paragraph_1647455684917_39174970", + "jobName": "paragraph_1709213551210_383625193", "id": "paragraph_1647455684917_39174970", - "dateCreated": "2022-03-16T18:34:44+0000", - "dateStarted": "2022-03-16T18:34:51+0000", - "dateFinished": "2022-03-16T18:34:51+0000", - "status": "FINISHED", - "$$hashKey": "object:2632" + "dateCreated": "2024-02-29T13:32:31+0000", + "dateStarted": "2024-02-29T13:37:16+0000", + "dateFinished": "2024-02-29T13:37:16+0000", + "status": "ERROR", + "$$hashKey": "object:2483" }, { "text": "%pyspark\nassert spark.conf.get(\"spark.sql.execution.arrow.pyspark.enabled\") == 'true'", "user": "gaiauser", - "dateUpdated": "2022-03-17T14:55:20+0000", + "dateUpdated": "2024-02-29T13:37:42+0000", "progress": 0, "config": { "editorSetting": { @@ -391,18 +390,18 @@ "apps": [], "runtimeInfos": {}, "progressUpdateIntervalMs": 500, - "jobName": "paragraph_1647455753705_1743373765", + "jobName": "paragraph_1709213551210_1393433048", "id": "paragraph_1647455753705_1743373765", - "dateCreated": "2022-03-16T18:35:53+0000", - "dateStarted": "2022-03-17T14:55:20+0000", - "dateFinished": "2022-03-17T14:55:20+0000", + "dateCreated": "2024-02-29T13:32:31+0000", + "dateStarted": "2024-02-29T13:37:42+0000", + "dateFinished": "2024-02-29T13:37:43+0000", "status": "FINISHED", - "$$hashKey": "object:2953" + "$$hashKey": "object:2484" }, { "text": "%pyspark\nimport dustmaps\nassert hasattr(dustmaps, '__name__')", "user": "gaiauser", - "dateUpdated": "2023-11-28T12:38:30+0000", + "dateUpdated": "2024-02-29T13:37:46+0000", "progress": 0, "config": { "editorSetting": { @@ -424,18 +423,18 @@ "apps": [], "runtimeInfos": {}, "progressUpdateIntervalMs": 500, - "jobName": "paragraph_1701173836477_576614731", + "jobName": "paragraph_1709213551210_167897133", "id": "paragraph_1701173836477_576614731", - "dateCreated": "2023-11-28T12:17:16+0000", - "dateStarted": "2023-11-28T12:38:30+0000", - "dateFinished": "2023-11-28T12:38:30+0000", + "dateCreated": "2024-02-29T13:32:31+0000", + "dateStarted": "2024-02-29T13:37:46+0000", + "dateFinished": "2024-02-29T13:37:46+0000", "status": "FINISHED", - "$$hashKey": "object:2954" + "$$hashKey": "object:2485" }, { "text": "%pyspark\nimport mwdust\nassert mwdust.__version__ ==\"1.5.post0\"\n", "user": "gaiauser", - "dateUpdated": "2023-11-28T12:38:30+0000", + "dateUpdated": "2024-02-29T13:37:48+0000", "progress": 0, "config": { "editorSetting": { @@ -457,18 +456,18 @@ "apps": [], "runtimeInfos": {}, "progressUpdateIntervalMs": 500, - "jobName": "paragraph_1701173899224_1681448863", + "jobName": "paragraph_1709213551210_764483296", "id": "paragraph_1701173899224_1681448863", - "dateCreated": "2023-11-28T12:18:19+0000", - "dateStarted": "2023-11-28T12:38:30+0000", - "dateFinished": "2023-11-28T12:38:30+0000", + "dateCreated": "2024-02-29T13:32:31+0000", + "dateStarted": "2024-02-29T13:37:48+0000", + "dateFinished": "2024-02-29T13:37:48+0000", "status": "FINISHED", - "$$hashKey": "object:2955" + "$$hashKey": "object:2486" }, { "text": "%pyspark\nimport zero_point\nassert zero_point.__version__==\"0.0.1\"\n", "user": "gaiauser", - "dateUpdated": "2023-11-28T12:38:30+0000", + "dateUpdated": "2024-02-29T13:37:49+0000", "progress": 0, "config": { "editorSetting": { @@ -490,19 +489,50 @@ "apps": [], "runtimeInfos": {}, "progressUpdateIntervalMs": 500, - "jobName": "paragraph_1701173902865_519050887", + "jobName": "paragraph_1709213551210_971433668", "id": "paragraph_1701173902865_519050887", - "dateCreated": "2023-11-28T12:18:22+0000", - "dateStarted": "2023-11-28T12:38:30+0000", - "dateFinished": "2023-11-28T12:38:30+0000", + "dateCreated": "2024-02-29T13:32:31+0000", + "dateStarted": "2024-02-29T13:37:49+0000", + "dateFinished": "2024-02-29T13:37:49+0000", "status": "FINISHED", - "$$hashKey": "object:2956" + "$$hashKey": "object:2487" + }, + { + "text": "%pyspark\n", + "user": "gaiauser", + "dateUpdated": "2024-02-29T13:37:49+0000", + "progress": 0, + "config": { + "colWidth": 12, + "fontSize": 9, + "enabled": true, + "results": {}, + "editorSetting": { + "language": "python", + "editOnDblClick": false, + "completionKey": "TAB", + "completionSupport": true + }, + "editorMode": "ace/mode/python" + }, + "settings": { + "params": {}, + "forms": {} + }, + "apps": [], + "runtimeInfos": {}, + "progressUpdateIntervalMs": 500, + "jobName": "paragraph_1709213869904_798509532", + "id": "paragraph_1709213869904_798509532", + "dateCreated": "2024-02-29T13:37:49+0000", + "status": "READY", + "$$hashKey": "object:2488" } ], "name": "libraries.json", - "id": "2GZ96Z759", + "id": "2JR59NT51", "defaultInterpreterGroup": "spark", - "version": "0.10.0", + "version": "0.11.0-gaia-dmp-0.1", "noteParams": {}, "noteForms": {}, "angularObjects": {}, @@ -511,6 +541,8 @@ "looknfeel": "default", "personalizedMode": "false" }, - "info": {}, + "info": { + "isRunning": false + }, "path": "/tmp/libraries.json" } From 61dd00d516c9b53db3ccb989f44e0bf22990abf8 Mon Sep 17 00:00:00 2001 From: stvoutsin Date: Thu, 29 Feb 2024 17:22:23 +0200 Subject: [PATCH 2/2] Added Working_with_Gaia_XP_spectra.json notebook --- .../Working_with_Gaia_XP_spectra.json | 391 +++++++++--------- 1 file changed, 195 insertions(+), 196 deletions(-) diff --git a/notebooks/public_examples/Working_with_Gaia_XP_spectra.json b/notebooks/public_examples/Working_with_Gaia_XP_spectra.json index 2b6e0a2..893f1ae 100644 --- a/notebooks/public_examples/Working_with_Gaia_XP_spectra.json +++ b/notebooks/public_examples/Working_with_Gaia_XP_spectra.json @@ -2,12 +2,12 @@ "paragraphs": [ { "title": "Introduction", - "text": "%md\n\n\n \nThis notebook illustrates a simple usage of cross-matched survey data available on the platform. It uses Gaia catalogue data (parallaxes and optical photometry) along with cross-matched infrared photometry to plot a de-reddened optical/infrared colour-absolute magnitude diagram (CAMD, a.k.a. an observational Hertzsprung-Russell diagram) of all sources with appropriate measurements.\n\nPlease note:\n* only PanSTARRS DR1, 2MASS Point Sources and ALLWISE _cross-matches_ are hosted on this platform;\n* cross-matched data consist of the 'best' neighbour (where that exists) along with original catalogue records (all columns) from the cross-matched survey; \n* if an external survey source has no Gaia cross-match counterpart then it does not exist here;\n* the best neighbour and external catalogue records are concatenated into single rows in the cross-matched resources presented here.\n", - "user": "NHambly", - "dateUpdated": "2022-08-26T15:05:12+0000", + "text": "%md\n\n\n \nThe bulk of Gaia XP spectra at Gaia DR3 are provided in a parametric \"continuous\" representational form (as opposed to conventional sampled form, i.e. fluxes in wavelength bins) in table `gaiadr3.xp_continuous_mean_spectrum`. Utilities for handling this form, including conversion to sampled form and plotting, are provided in a bespoke Python package [GaiaXPy](https://gaia-dpci.github.io/GaiaXPy-website/) which is available on this platform. A small subset of the XP spectra are provided also in sampled form in table `gaiadr3.xp_sampled_mean_spectrum` but these are for illustrative purposes only: users are strongly encouraged to familiarise themselves and work with the continuous representation, not least in order to handle correctly the statistical uncertainties inherent to the data.\n\nTo access GaiaXPy on this platform simply import the package as follows:\n\n import gaiaxpy\n\nthen all classes and utility functions etc. will be available.\n", + "user": "gaiauser", + "dateUpdated": "2024-02-29T15:20:38+0000", "progress": 0, "config": { - "tableHide": false, + "tableHide": true, "editorSetting": { "language": "markdown", "editOnDblClick": true, @@ -17,7 +17,7 @@ "colWidth": 12, "editorMode": "ace/mode/markdown", "fontSize": 9, - "editorHide": true, + "editorHide": false, "title": true, "results": {}, "enabled": true @@ -29,29 +29,20 @@ "apps": [], "runtimeInfos": {}, "progressUpdateIntervalMs": 500, - "jobName": "paragraph_1646992513304_653265144", - "id": "paragraph_1646992513304_653265144", - "dateCreated": "2022-03-11T09:55:13+0000", - "dateStarted": "2022-08-26T15:05:12+0000", - "dateFinished": "2022-08-26T15:05:12+0000", + "jobName": "paragraph_1674655553427_1722843556", + "id": "paragraph_1650981001262_1093264483", + "dateCreated": "2023-01-25T14:05:53+0000", + "dateStarted": "2024-02-29T13:53:08+0000", + "dateFinished": "2024-02-29T13:53:08+0000", "status": "FINISHED", "focus": true, - "$$hashKey": "object:13965", - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "HTML", - "data": "
\n\n

This notebook illustrates a simple usage of cross-matched survey data available on the platform. It uses Gaia catalogue data (parallaxes and optical photometry) along with cross-matched infrared photometry to plot a de-reddened optical/infrared colour-absolute magnitude diagram (CAMD, a.k.a. an observational Hertzsprung-Russell diagram) of all sources with appropriate measurements.

\n

Please note:

\n
    \n
  • only PanSTARRS DR1, 2MASS Point Sources and ALLWISE cross-matches are hosted on this platform;
  • \n
  • cross-matched data consist of the ‘best’ neighbour (where that exists) along with original catalogue records (all columns) from the cross-matched survey;
  • \n
  • if an external survey source has no Gaia cross-match counterpart then it does not exist here;
  • \n
  • the best neighbour and external catalogue records are concatenated into single rows in the cross-matched resources presented here.
  • \n
\n\n
" - } - ] - } + "$$hashKey": "object:25230" }, { - "title": "Standard platform set-up", - "text": "%pyspark\n\nimport gaiadmpsetup\n", - "user": "NHambly", - "dateUpdated": "2022-08-26T15:05:13+0000", + "title": "Sampling and plotting spectra (continuous representation)", + "text": "%pyspark\n\n# standard platform set-up\nimport gaiadmpsetup\n\n# utility code set-up\nfrom gaiaxpy import plot_spectra, convert\n\n# XP products available in Gaia DR3, so set the default database context accordingly for convenience\nspark.sql('USE gaiadr3')\n\n# grab an example spectrum from the table\ncontinuous_df = spark.sql('SELECT * FROM gaiadr3.xp_continuous_mean_spectrum WHERE source_id = 5853498713190525696')\n# ... this source identifier corresponds to Proxima Cen (= Alpha Cen C, spectral type M5.5V i.e. a mid-M dwarf)\n\n# convert to a Pandas dataframe for GaiaXPy\ncontinuous_spectrum = continuous_df.toPandas()\n\n# convert to sampled form:\nsampled_spectrum, sampling = convert(continuous_spectrum, save_file = False)\n \n# plot to sanity check:\nplot_spectra(sampled_spectrum, sampling = sampling, multi=False, show_plot=True, output_path=None, legend=True)\n\n", + "user": "gaiauser", + "dateUpdated": "2024-02-29T13:53:08+0000", "progress": 0, "config": { "tableHide": false, @@ -74,28 +65,37 @@ "forms": {} }, "apps": [], - "runtimeInfos": {}, + "runtimeInfos": { + "jobUrl": { + "propertyName": "jobUrl", + "label": "SPARK JOB", + "tooltip": "View in Spark web UI", + "group": "spark", + "values": [ + { + "jobUrl": "http://zeppelin:4041/jobs/job?id=134", + "$$hashKey": "object:25581" + } + ], + "interpreterSettingId": "spark" + } + }, "progressUpdateIntervalMs": 500, - "jobName": "paragraph_1647250636508_2082384671", - "id": "paragraph_1647250636508_2082384671", - "dateCreated": "2022-03-14T09:37:16+0000", - "dateStarted": "2022-08-26T15:05:13+0000", - "dateFinished": "2022-08-26T15:05:13+0000", + "jobName": "paragraph_1674655553427_445437086", + "id": "paragraph_1650981269844_2057939329", + "dateCreated": "2023-01-25T14:05:53+0000", + "dateStarted": "2024-02-29T13:53:08+0000", + "dateFinished": "2024-02-29T13:53:10+0000", "status": "FINISHED", - "$$hashKey": "object:13966", - "results": { - "code": "SUCCESS", - "msg": [] - } + "$$hashKey": "object:25231" }, { - "title": "Utility function definitions", - "text": "%pyspark\n\nimport math\n\n# range and resolution of the rasterized colour-magnitude diagram - configure to suit\nbrightest_abs_mag = -5.0\nfaintest_abs_mag = 15.0\nbluest_colour = -2.0\nreddest_colour = +6.0\nmag_resolution = 0.02\n\n# global constant given the above configuration\nabs_mag_range = faintest_abs_mag - brightest_abs_mag\ncolour_range = reddest_colour - bluest_colour\nxmax_idx = int((colour_range) / mag_resolution)\nymax_idx = int((abs_mag_range) / mag_resolution)\n\n# raster function\ndef cmd_raster_index(magnitude, colour, parallax):\n '''\n Computes an arbitrary, unique raster index in the 2d absolute-magnitude / colour space given the \n apparent magnitude, colour and parallax of a source and fixed configuration.\n '''\n \n # distance modulus assuming zero reddening and hence absolute magnitude\n mmm = 5.0 * math.log10(1000.0 / parallax) - 5.0\n abs_mag = magnitude - mmm\n \n # create the 2d raster unique index as a combination of those of colour and absolute mag\n xidx = int(round((colour - bluest_colour) * xmax_idx / colour_range))\n yidx = int(round((abs_mag - brightest_abs_mag) * ymax_idx / abs_mag_range))\n \n # check if outside the defined boundaries\n if xidx >= xmax_idx or yidx >= ymax_idx: return 0\n \n # return the index\n return xidx + (xmax_idx * yidx)\n\n# wrap up the rasterization function as a user-defined function for use via the PySpark SQL API\nfrom pyspark.sql.types import IntegerType\nspark.udf.register('rasterize', cmd_raster_index, IntegerType())\n\n# define vectorized functions that reverse the encoded raster index into colour and absolute magnitude\n# based on the same configuration\nimport numpy as np\n\ndef xidx(ridx_array: np.array) -> np.array:\n '''\n Given the vector raster index compute the x (colour) indices of the bins.\n '''\n return np.mod(ridx_array, xmax_idx)\n\ndef yidx(ridx_array: np.array) -> np.array:\n '''\n Given the vector raster index compute the y (absolute magnitude) indices of the bins.\n '''\n return np.trunc(ridx_array / xmax_idx)\n\n", - "user": "NHambly", - "dateUpdated": "2022-08-26T15:05:13+0000", + "title": "Creating a single, externally calibrated spectrum from BP and RP", + "text": "%pyspark\n\nfrom gaiaxpy import calibrate\n\n# GaiaXPy provides classes and methods to create an externally calibrated single spectrum from the internal XP continuous representation:\ncalibrated_spectrum, sampling = calibrate(continuous_spectrum, save_file = False)\n\n# plot it\nplot_spectra(calibrated_spectrum, sampling = sampling, legend = False)\n", + "user": "gaiauser", + "dateUpdated": "2024-02-29T13:53:11+0000", "progress": 0, "config": { - "lineNumbers": false, "editorSetting": { "language": "python", "editOnDblClick": false, @@ -105,7 +105,6 @@ "colWidth": 12, "editorMode": "ace/mode/python", "fontSize": 9, - "editorHide": false, "title": true, "results": {}, "enabled": true @@ -117,23 +116,56 @@ "apps": [], "runtimeInfos": {}, "progressUpdateIntervalMs": 500, - "jobName": "paragraph_1646992632242_1534494301", - "id": "paragraph_1646992632242_1534494301", - "dateCreated": "2022-03-11T09:57:12+0000", - "dateStarted": "2022-08-26T15:05:13+0000", - "dateFinished": "2022-08-26T15:05:13+0000", + "jobName": "paragraph_1674655553428_261889787", + "id": "paragraph_1662044943200_953477984", + "dateCreated": "2023-01-25T14:05:53+0000", + "dateStarted": "2024-02-29T13:53:11+0000", + "dateFinished": "2024-02-29T13:53:11+0000", + "status": "FINISHED", + "$$hashKey": "object:25232" + }, + { + "title": "Searching for similar spectra", + "text": "%md\n\nThe code in the following cells illustrates a workflow where we trawl through the a large XP spectral data looking for spectra similar to a high signal-to-noise template example. The implementation takes advantage of the end-user programmability of the distributed query execution engine to return results in a reasonable time. The approach is to look for spectra having the same spectral shape, as expressed in the coefficients of the continuous representation.", + "user": "gaiauser", + "dateUpdated": "2024-02-29T13:53:11+0000", + "progress": 0, + "config": { + "tableHide": false, + "editorSetting": { + "language": "markdown", + "editOnDblClick": true, + "completionKey": "TAB", + "completionSupport": false + }, + "colWidth": 12, + "editorMode": "ace/mode/markdown", + "fontSize": 9, + "editorHide": true, + "title": true, + "results": {}, + "enabled": true + }, + "settings": { + "params": {}, + "forms": {} + }, + "apps": [], + "runtimeInfos": {}, + "progressUpdateIntervalMs": 500, + "jobName": "paragraph_1674655553429_618979145", + "id": "paragraph_1662045004984_1851487345", + "dateCreated": "2023-01-25T14:05:53+0000", + "dateStarted": "2024-02-29T13:53:11+0000", + "dateFinished": "2024-02-29T13:53:11+0000", "status": "FINISHED", - "$$hashKey": "object:13967", - "results": { - "code": "SUCCESS", - "msg": [] - } + "$$hashKey": "object:25233" }, { - "title": "Define a data aggregation", - "text": "%pyspark\n\n# aggregate query employing the rasterization UDF \nquery = 'SELECT rasterize(g.phot_g_mean_mag - ag_gspphot, g.phot_g_mean_mag - ag_gspphot - t.k_m, g.parallax) AS ridx, COUNT(*) AS count_in_pixel ' + \\\n 'FROM gaiadr3.gaia_source AS g INNER JOIN gaiaedr3.gaia_source_tmasspsc_best_neighbours AS t ON g.source_id = t.source_id ' + \\\n 'WHERE g.ruwe < 1.4 AND g.parallax_over_error > 10.0 AND t.k_m IS NOT NULL AND g.ag_gspphot IS NOT NULL ' + \\\n 'GROUP BY ridx HAVING ridx >= 0'\n\n# define the data frame via the aggregate query\ndf = spark.sql(query)\n", - "user": "NHambly", - "dateUpdated": "2022-08-26T15:05:13+0000", + "title": "Utility code", + "text": "%pyspark\n\nimport numpy as np\nimport pandas as pd\nfrom pyspark.sql.functions import pandas_udf\nfrom pyspark.sql import DataFrame\n#from scipy.stats import chi\n\n# static constants for use when reconstructing a covariance matrix from the flattened upper-triangular correlation matrix stored in xp_continuous_mean_spectrum\nNUM_XP_COEFFS = 55\n# these indexes define the column-major positions of the correlation vector elements in the lower triangle of the 2d correlation matrix ...\nlower_index = np.tril_indices(NUM_XP_COEFFS,-1)\n# ... note that numpy indexing is row-major. The upper triangular index is created from the lower, reflecting across the diagonal,\n# by transposing the axes - this results in the required column-major indexing for the upper part\nupper_index = (lower_index[1], lower_index[0])\n# correlation matrix, empty apart from unity on the diagonal (off-diagonal elements to be filled in on a case-by-case basis)\ncorrelation_matrix = np.diag(np.ones(NUM_XP_COEFFS))\n\ndef make_correlation_matrix(correlation_vector : np.ndarray) -> np.ndarray:\n '''\n Returns the fully populated 2d correlation matrix given the flattened, 1d upper-triangular off-diagonal\n elements of the same as persisted in the table of XP continuous representation spectra.\n '''\n # copy in unique, off-diagonal elements from the flattened correlation vector into the 2d-indexed positions\n correlation_matrix[upper_index] = correlation_vector\n correlation_matrix[lower_index] = correlation_vector\n \n # give back the complete correlation matrix\n return correlation_matrix\n\ndef make_covariance_matrix(complete_correlation_matrix : np.ndarray, coefficient_error_vector : np.ndarray) -> np.ndarray:\n '''\n Creates the fully reconstructed 2d covariance matrix of an XP continuous representation spectrum given the\n complete 2d correlation matrix and the vector of formal errors on the coefficients. Note that Gaia DPAC CU5 scale \n predicted coefficient errors by the standard deviation as a post-hoc correction to the formal (sqrt) variances.\n GaiaXPy actually reverses this scaling in computation of the covariance matrix to return the latter as exactly\n that produced as a result of the least-squares solution for the coefficients. Such a de-scaling of the errors\n is not applied here: we assume that the uncertainties are best represented with this scaling intact.\n '''\n # 2d matrix with the errors on the diagonal\n error_matrix = np.diag(coefficient_error_vector)\n \n # from the standard relationship between covariance and correlation\n return error_matrix @ (error_matrix @ complete_correlation_matrix)\n \ndef xp_mahalanobis_distance(coeff_vector_1 : np.ndarray, covariance_1 : np.ndarray,\n coeff_vector_2 : np.ndarray, error_vector_2 : np.ndarray, correlation_vector_2 : np.ndarray) -> float:\n '''\n Computes the Mahalanobis distance between two XP spectra given template coefficients and fully populated\n covariance for the first, and the data record of the second candidate spectrum, i.e. coefficients, errors and \n upper-triangular part of the correlation matrix in the continuous representation. The second set of\n coefficients and errors should be scaled to the same flux level as the template spectrum. This means that\n the distance returned quantifies how close the candidate SED shape is to that of the template regardless any\n difference in intrinsic luminosity.\n \n This function uses plain matrix inversion of the combined covariance matrix. This can be numerically unstable\n and result in a negative squared distance resulting in turn in a return value of not-a-number. It is up to \n the calling application to handle this condition.\n '''\n # second covariance matrix\n corr2 = make_correlation_matrix(correlation_vector_2)\n covariance_2 = make_covariance_matrix(corr2, error_vector_2)\n \n # form covariance of the coefficient difference vector as sum of individual covariance \n cocovar = covariance_1 + covariance_2\n \n # inverse of combined, scaled covariance\n cocovar_inv = np.linalg.inv(cocovar)\n\n # use these in the computation of the square of the Mahalanobis distance, e.g. see source linked from\n # https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.mahalanobis.html\n delta = coeff_vector_1 - coeff_vector_2\n d = np.sqrt(np.dot(np.dot(delta, cocovar_inv), delta))\n \n # resulting Mahalanobs distance follows chi distribution with NUM_XP_COEFFS degrees of freedom (M. Weiler, personal communication)\n # for identical spectra\n return d\n \ndef find_similar_continuous_spectra(data_frame : DataFrame, template_df : DataFrame) -> DataFrame:\n '''\n Given data frames defining a large set of XP spectra in continuous representation, \n and a single template example also in continuous representation, search the former for cases\n similar to the latter. The data frame of the set of spectra being\n searched is annotated with a dissimilarity statistic: the greater the value the more\n dissimilar is the candidate spectrum to the template given. By definition this statistic\n will be zero for the template spectrum if it is present in the set of candidates.\n \n Parameters:\n -----------\n data_frame : DataFrame()\n the data frame encapsulating the set of XP continuous representation spectra to be searched\n template_df : DataFrame()\n the template, also in XP continuous representation encapsulated in a data frame.\n \n return : DataFrame()\n a new data frame annotated with a dissimilarity (increasingly positive) statistic where \n zero indicates a perfect match.\n '''\n \n # convenience reference to template as a Row object:\n template_row = template_df.collect()[0]\n \n # extract the template arrays \n template_bp_coefficients = np.array(template_row['bp_coefficients']).reshape(-1)\n template_bp_coefficient_errors = np.array(template_row['bp_coefficient_errors']).reshape(-1)\n template_bp_correlations = np.array(template_row['bp_coefficient_correlations']).reshape(-1)\n template_rp_coefficients = np.array(template_row['rp_coefficients']).reshape(-1)\n template_rp_coefficient_errors = np.array(template_row['rp_coefficient_errors']).reshape(-1)\n template_rp_correlations = np.array(template_row['rp_coefficient_correlations']).reshape(-1)\n template_gmag = template_row['phot_g_mean_mag']\n\n # precompute the required vectors and matrices for the template\n bp_correl_mat = make_correlation_matrix(template_bp_correlations)\n template_bp_covariance = make_covariance_matrix(bp_correl_mat, template_bp_coefficient_errors)\n rp_correl_mat = make_correlation_matrix(template_rp_correlations)\n template_rp_covariance = make_covariance_matrix(rp_correl_mat, template_rp_coefficient_errors)\n \n # define a vectorised Pandas UDF against the template for comparison of other spectra against it\n @pandas_udf('float')\n def xp_is_similar(bp_coeffs:pd.Series, bp_coeff_errors:pd.Series, bp_correlations:pd.Series, \n rp_coeffs:pd.Series, rp_coeff_errors:pd.Series, rp_correlations:pd.Series,\n gmags:pd.Series) -> pd.Series:\n '''\n Create a similarity metric for the XP continuous representation coefficients with respect \n to those of a predefined template. Similarity is based on a combined BP and RP Mahalanobis\n distance between the coefficient sets with full accounting for covariance. Input arguments\n are series of the BP and RP coefficients, errors and correlation vectors as stored in table\n xp_continuous_mean_spectrum. The returned object is a corresponding series of floats of the\n quadrature sum of the BP and RP Mahalanobis distances between each candidate spectrum and\n the static template defined above.\n '''\n \n # initialise the results series\n results = pd.Series(np.full(bp_coeffs.size, 0.0))\n\n # iterate over the data series\n for i in range(bp_coeffs.size):\n \n # normalise the candidate flux coefficients and uncertainties to that of the template\n norm = 10.0**(0.4 * (template_gmag - gmags.iloc[i]))\n bp_coeffs_norm = bp_coeffs.iloc[i] / norm\n bp_coeff_errors_norm = bp_coeff_errors.iloc[i] / norm\n rp_coeffs_norm = rp_coeffs.iloc[i] / norm\n rp_coeff_errors_norm = rp_coeff_errors.iloc[i] / norm\n \n # Mahalanobis distances for the individual BP and RP coefficient sets normalised to the flux level of the template\n bp_mdist = xp_mahalanobis_distance(template_bp_coefficients, template_bp_covariance, bp_coeffs_norm, bp_coeff_errors_norm, bp_correlations.iloc[i])\n rp_mdist = xp_mahalanobis_distance(template_rp_coefficients, template_rp_covariance, rp_coeffs_norm, rp_coeff_errors_norm, rp_correlations.iloc[i])\n \n # combined Mahalanobis distance\n results.iloc[i] = np.sqrt(bp_mdist * bp_mdist + rp_mdist * rp_mdist)\n \n return results\n\n # add in the similarity statistic\n data_frame = data_frame.withColumn('xp_similar', xp_is_similar(\n data_frame.bp_coefficients, data_frame.bp_coefficient_errors, data_frame.bp_coefficient_correlations, \n data_frame.rp_coefficients, data_frame.rp_coefficient_errors, data_frame.rp_coefficient_correlations, data_frame.phot_g_mean_mag))\n \n # give back the full set filtering out any nulls (which may result from NaN individual Mahalanobis distances)\n return data_frame.filter(data_frame.xp_similar.isNotNull())\n\n", + "user": "gaiauser", + "dateUpdated": "2024-02-29T13:53:11+0000", "progress": 0, "config": { "editorSetting": { @@ -157,23 +189,19 @@ "apps": [], "runtimeInfos": {}, "progressUpdateIntervalMs": 500, - "jobName": "paragraph_1646996320283_812479873", - "id": "paragraph_1646996320283_812479873", - "dateCreated": "2022-03-11T10:58:40+0000", - "dateStarted": "2022-08-26T15:05:13+0000", - "dateFinished": "2022-08-26T15:05:13+0000", + "jobName": "paragraph_1674655553429_535120608", + "id": "paragraph_1662045098333_1096300336", + "dateCreated": "2023-01-25T14:05:53+0000", + "dateStarted": "2024-02-29T13:53:11+0000", + "dateFinished": "2024-02-29T13:53:11+0000", "status": "FINISHED", - "$$hashKey": "object:13968", - "results": { - "code": "SUCCESS", - "msg": [] - } + "$$hashKey": "object:25234" }, { - "title": "Collect the results and process in preparation for visualisation", - "text": "%pyspark\n\n# collect the counts as a Pandas data frame\npdf = df.toPandas()\n# ... this will action the distributed spark job and then merge the individual worker aggregations.\n# It \"collects\" all the data to the driver executor as a monolithic in-memory data set - always use with care!\n\n# compute the colour/magnitude bin centres from the raster index via vectorized functions defined above\n#pdf['colour'] = colours(pdf['ridx'].values)\n#pdf['abs_mag'] = abs_mags(pdf['ridx'].values)\npdf['xidx'] = xidx(pdf['ridx'].values)\npdf['yidx'] = yidx(pdf['ridx'].values)\n\n# quick-look sanity check (and optional download of results set)\nz.show(pdf)\n\n", - "user": "NHambly", - "dateUpdated": "2022-08-26T15:05:13+0000", + "title": "Set up the template and selection for the trawl", + "text": "%pyspark\n\n# select a high s/n template for the search, e.g. Proxima Cen\nsid = 5853498713190525696\n\n# defined the template data frame\ntemplate_df = spark.sql('SELECT xp.*, g.phot_g_mean_mag FROM xp_continuous_mean_spectrum AS xp INNER JOIN gaia_source AS g ON g.source_id = xp.source_id WHERE g.source_id = %d'%(sid))\n\n# define a query over the entire dataset, restricting to low reddening for simplicity\nquery = 'SELECT xp.*, g.phot_g_mean_mag ' + \\\n 'FROM xp_continuous_mean_spectrum AS xp INNER JOIN gaia_source AS g ON g.source_id = xp.source_id ' + \\\n 'WHERE g.ag_gspphot < 0.1 AND MOD(g.random_index, 20) = 0'\n# TEST: give the template only in the df\n#query = 'SELECT * FROM xp_continuous_mean_spectrum WHERE source_id = %d'%(sid)\n\n# sanity check the formatted query\n#print(query)\n\n# define a data frame via the query\ndf = spark.sql(query)\n\n# get any that are similar and show them\nsimilar_df = find_similar_continuous_spectra(df, template_df)\n\n# results quick-look\n#similar_df.show()\n", + "user": "gaiauser", + "dateUpdated": "2024-02-29T13:53:11+0000", "progress": 0, "config": { "editorSetting": { @@ -187,38 +215,56 @@ "fontSize": 9, "editorHide": false, "title": true, - "results": { - "0": { - "graph": { - "mode": "table", - "height": 300, - "optionOpen": false, - "setting": { - "table": { - "tableGridState": {}, - "tableColumnTypeState": { - "names": { - "ridx": "string", - "count_in_pixel": "string", - "xidx": "string", - "yidx": "string" - }, - "updated": false - }, - "tableOptionSpecHash": "[{\"name\":\"useFilter\",\"valueType\":\"boolean\",\"defaultValue\":false,\"widget\":\"checkbox\",\"description\":\"Enable filter for columns\"},{\"name\":\"showPagination\",\"valueType\":\"boolean\",\"defaultValue\":false,\"widget\":\"checkbox\",\"description\":\"Enable pagination for better navigation\"},{\"name\":\"showAggregationFooter\",\"valueType\":\"boolean\",\"defaultValue\":false,\"widget\":\"checkbox\",\"description\":\"Enable a footer for displaying aggregated values\"}]", - "tableOptionValue": { - "useFilter": false, - "showPagination": false, - "showAggregationFooter": false - }, - "updated": false, - "initialized": false - } - }, - "commonSetting": {} + "results": {}, + "enabled": true + }, + "settings": { + "params": {}, + "forms": {} + }, + "apps": [], + "runtimeInfos": { + "jobUrl": { + "propertyName": "jobUrl", + "label": "SPARK JOB", + "tooltip": "View in Spark web UI", + "group": "spark", + "values": [ + { + "jobUrl": "http://zeppelin:4041/jobs/job?id=135", + "$$hashKey": "object:25753" } - } + ], + "interpreterSettingId": "spark" + } + }, + "progressUpdateIntervalMs": 500, + "jobName": "paragraph_1674655553429_1147158826", + "id": "paragraph_1662045989203_497219070", + "dateCreated": "2023-01-25T14:05:53+0000", + "dateStarted": "2024-02-29T13:53:11+0000", + "dateFinished": "2024-02-29T13:53:14+0000", + "status": "FINISHED", + "$$hashKey": "object:25235" + }, + { + "title": "Action the trawl and collect the top 3 (for example) matches", + "text": "%pyspark\n\n# collecting the results to a Pandas data frame collects the results to the driver interpreter process\n# so this cell will actually action the trawl on the Spark worker cluster. Be prepared to sit back and wait...\ntop3_pdf = similar_df.sort(similar_df.xp_similar.asc()).limit(3).toPandas()\n\n# sanity check as required\n# z.show(top3_pdf)", + "user": "gaiauser", + "dateUpdated": "2024-02-29T13:53:14+0000", + "progress": 0, + "config": { + "editorSetting": { + "language": "python", + "editOnDblClick": false, + "completionKey": "TAB", + "completionSupport": true }, + "colWidth": 12, + "editorMode": "ace/mode/python", + "fontSize": 9, + "title": true, + "results": {}, "enabled": true }, "settings": { @@ -234,40 +280,27 @@ "group": "spark", "values": [ { - "jobUrl": "http://zeppelin:4041/jobs/job?id=45", - "$$hashKey": "object:15008" + "jobUrl": "http://zeppelin:4041/jobs/job?id=136", + "$$hashKey": "object:25801" } ], "interpreterSettingId": "spark" } }, "progressUpdateIntervalMs": 500, - "jobName": "paragraph_1646996892901_1183551489", - "id": "paragraph_1646996892901_1183551489", - "dateCreated": "2022-03-11T11:08:12+0000", - "dateStarted": "2022-08-26T15:05:13+0000", - "dateFinished": "2022-08-26T15:07:05+0000", - "status": "FINISHED", - "$$hashKey": "object:13969", - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "TABLE", - "data": "ridx\tcount_in_pixel\txidx\tyidx\n180155.0\t6048.0\t155.0\t450.0\n208595.0\t5514.0\t195.0\t521.0\n164962.0\t5520.0\t162.0\t412.0\n212175.0\t1781.0\t175.0\t530.0\n205392.0\t5774.0\t192.0\t513.0\n207398.0\t3414.0\t198.0\t518.0\n68202.0\t260.0\t202.0\t170.0\n170948.0\t4018.0\t148.0\t427.0\n283456.0\t3312.0\t256.0\t708.0\n190174.0\t13338.0\t174.0\t475.0\n235814.0\t14815.0\t214.0\t589.0\n156156.0\t2751.0\t156.0\t390.0\n208187.0\t13406.0\t187.0\t520.0\n166558.0\t5989.0\t158.0\t416.0\n178564.0\t12674.0\t164.0\t446.0\n166150.0\t5151.0\t150.0\t415.0\n130544.0\t348.0\t144.0\t326.0\n119813.0\t244.0\t213.0\t299.0\n313059.0\t979.0\t259.0\t782.0\n146581.0\t706.0\t181.0\t366.0\n176948.0\t1882.0\t148.0\t442.0\n92959.0\t217.0\t159.0\t232.0\n130995.0\t655.0\t195.0\t327.0\n226615.0\t4170.0\t215.0\t566.0\n243022.0\t8188.0\t222.0\t607.0\n241012.0\t5886.0\t212.0\t602.0\n249423.0\t5995.0\t223.0\t623.0\n194974.0\t15330.0\t174.0\t487.0\n158593.0\t1146.0\t193.0\t396.0\n237019.0\t9038.0\t219.0\t592.0\n304681.0\t364.0\t281.0\t761.0\n255040.0\t2684.0\t240.0\t637.0\n102594.0\t1700.0\t194.0\t256.0\n204974.0\t8524.0\t174.0\t512.0\n200166.0\t3279.0\t166.0\t500.0\n240209.0\t3047.0\t209.0\t600.0\n205371.0\t3779.0\t171.0\t513.0\n247014.0\t2640.0\t214.0\t617.0\n276652.0\t3627.0\t252.0\t691.0\n218603.0\t6232.0\t203.0\t546.0\n184976.0\t8452.0\t176.0\t462.0\n172959.0\t8918.0\t159.0\t432.0\n160563.0\t3679.0\t163.0\t401.0\n235408.0\t5992.0\t208.0\t588.0\n263031.0\t1874.0\t231.0\t657.0\n231421.0\t3537.0\t221.0\t578.0\n222605.0\t8469.0\t205.0\t556.0\n198573.0\t14559.0\t173.0\t496.0\n195367.0\t10577.0\t167.0\t488.0\n144991.0\t979.0\t191.0\t362.0\n105796.0\t2297.0\t196.0\t264.0\n219798.0\t12676.0\t198.0\t549.0\n323084.0\t287.0\t284.0\t807.0\n265843.0\t4723.0\t243.0\t664.0\n140541.0\t1018.0\t141.0\t351.0\n251814.0\t916.0\t214.0\t629.0\n304276.0\t617.0\t276.0\t760.0\n92182.0\t370.0\t182.0\t230.0\n198173.0\t14549.0\t173.0\t495.0\n221808.0\t4854.0\t208.0\t554.0\n157384.0\t1028.0\t184.0\t393.0\n238623.0\t5743.0\t223.0\t596.0\n278646.0\t3598.0\t246.0\t696.0\n249443.0\t1189.0\t243.0\t623.0\n100986.0\t1525.0\t186.0\t252.0\n188986.0\t2541.0\t186.0\t472.0\n237810.0\t6351.0\t210.0\t594.0\n233799.0\t945.0\t199.0\t584.0\n259849.0\t2391.0\t249.0\t649.0\n146988.0\t862.0\t188.0\t367.0\n227408.0\t11552.0\t208.0\t568.0\n325894.0\t135.0\t294.0\t814.0\n178576.0\t6254.0\t176.0\t446.0\n80579.0\t80.0\t179.0\t201.0\n191350.0\t277.0\t150.0\t478.0\n128131.0\t501.0\t131.0\t320.0\n155350.0\t2788.0\t150.0\t388.0\n176152.0\t4945.0\t152.0\t440.0\n156941.0\t3033.0\t141.0\t392.0\n109800.0\t2340.0\t200.0\t274.0\n170542.0\t1581.0\t142.0\t426.0\n70863.0\t11.0\t63.0\t177.0\n236636.0\t449.0\t236.0\t591.0\n243018.0\t9680.0\t218.0\t607.0\n287874.0\t239.0\t274.0\t719.0\n280659.0\t2007.0\t259.0\t701.0\n228622.0\t1924.0\t222.0\t571.0\n179749.0\t1524.0\t149.0\t449.0\n126191.0\t459.0\t191.0\t315.0\n81410.0\t221.0\t210.0\t203.0\n238193.0\t91.0\t193.0\t595.0\n263419.0\t209.0\t219.0\t658.0\n139335.0\t1011.0\t135.0\t348.0\n150174.0\t679.0\t174.0\t375.0\n91784.0\t303.0\t184.0\t229.0\n166160.0\t5920.0\t160.0\t415.0\n135000.0\t634.0\t200.0\t337.0\n249022.0\t6052.0\t222.0\t622.0\n139747.0\t868.0\t147.0\t349.0\n166194.0\t960.0\t194.0\t415.0\n85332.0\t40.0\t132.0\t213.0\n144522.0\t1216.0\t122.0\t361.0\n261041.0\t4149.0\t241.0\t652.0\n150181.0\t784.0\t181.0\t375.0\n110081.0\t97.0\t81.0\t275.0\n62985.0\t85.0\t185.0\t157.0\n198591.0\t3369.0\t191.0\t496.0\n244629.0\t3175.0\t229.0\t611.0\n143737.0\t1354.0\t137.0\t359.0\n337873.0\t162.0\t273.0\t844.0\n228233.0\t222.0\t233.0\t570.0\n156527.0\t1425.0\t127.0\t391.0\n129345.0\t273.0\t145.0\t323.0\n210175.0\t3117.0\t175.0\t525.0\n128935.0\t400.0\t135.0\t322.0\n250235.0\t2049.0\t235.0\t625.0\n192988.0\t2827.0\t188.0\t482.0\n97004.0\t398.0\t204.0\t242.0\n243856.0\t78.0\t256.0\t609.0\n320680.0\t392.0\t280.0\t801.0\n93407.0\t249.0\t207.0\t233.0\n138920.0\t926.0\t120.0\t347.0\n226193.0\t2145.0\t193.0\t565.0\n136924.0\t852.0\t124.0\t342.0\n295048.0\t1595.0\t248.0\t737.0\n230596.0\t1216.0\t196.0\t576.0\n253846.0\t1789.0\t246.0\t634.0\n114206.0\t1029.0\t206.0\t285.0\n164603.0\t158.0\t203.0\t411.0\n139379.0\t535.0\t179.0\t348.0\n180981.0\t3362.0\t181.0\t452.0\n191355.0\t1076.0\t155.0\t478.0\n141737.0\t1189.0\t137.0\t354.0\n286670.0\t462.0\t270.0\t716.0\n134924.0\t740.0\t124.0\t337.0\n118989.0\t470.0\t189.0\t297.0\n111381.0\t465.0\t181.0\t278.0\n65408.0\t108.0\t208.0\t163.0\n157793.0\t1101.0\t193.0\t394.0\n120988.0\t475.0\t188.0\t302.0\n168987.0\t1583.0\t187.0\t422.0\n266215.0\t54.0\t215.0\t665.0\n186588.0\t1395.0\t188.0\t466.0\n230634.0\t289.0\t234.0\t576.0\n269460.0\t579.0\t260.0\t673.0\n154202.0\t346.0\t202.0\t385.0\n150956.0\t1634.0\t156.0\t377.0\n165310.0\t60.0\t110.0\t413.0\n227038.0\t122.0\t238.0\t567.0\n149761.0\t1282.0\t161.0\t374.0\n124967.0\t114.0\t167.0\t312.0\n134205.0\t263.0\t205.0\t335.0\n149764.0\t1086.0\t164.0\t374.0\n92188.0\t368.0\t188.0\t230.0\n223021.0\t938.0\t221.0\t557.0\n211335.0\t22.0\t135.0\t528.0\n192545.0\t71.0\t145.0\t481.0\n149785.0\t807.0\t185.0\t374.0\n333479.0\t187.0\t279.0\t833.0\n143778.0\t596.0\t178.0\t359.0\n224663.0\t22.0\t263.0\t561.0\n77803.0\t303.0\t203.0\t194.0\n243440.0\t595.0\t240.0\t608.0\n187027.0\t31.0\t227.0\t467.0\n113000.0\t1110.0\t200.0\t282.0\n99786.0\t1312.0\t186.0\t249.0\n100170.0\t558.0\t170.0\t250.0\n97419.0\t116.0\t219.0\t243.0\n181399.0\t124.0\t199.0\t453.0\n225430.0\t227.0\t230.0\t563.0\n189488.0\t6.0\t288.0\t473.0\n101775.0\t810.0\t175.0\t254.0\n64590.0\t125.0\t190.0\t161.0\n137793.0\t834.0\t193.0\t344.0\n78120.0\t23.0\t120.0\t195.0\n115741.0\t57.0\t141.0\t289.0\n110904.0\t227.0\t104.0\t277.0\n215820.0\t304.0\t220.0\t539.0\n111300.0\t436.0\t100.0\t278.0\n316662.0\t835.0\t262.0\t791.0\n205013.0\t134.0\t213.0\t512.0\n192952.0\t381.0\t152.0\t482.0\n103357.0\t79.0\t157.0\t258.0\n238233.0\t901.0\t233.0\t595.0\n268622.0\t140.0\t222.0\t671.0\n33722.0\t5.0\t122.0\t84.0\n227044.0\t45.0\t244.0\t567.0\n225755.0\t41.0\t155.0\t564.0\n75294.0\t11.0\t94.0\t188.0\n72578.0\t55.0\t178.0\t181.0\n145011.0\t58.0\t211.0\t362.0\n202641.0\t31.0\t241.0\t506.0\n70097.0\t6.0\t97.0\t175.0\n129791.0\t518.0\t191.0\t324.0\n314281.0\t410.0\t281.0\t785.0\n133730.0\t722.0\t130.0\t334.0\n39285.0\t3.0\t85.0\t98.0\n303886.0\t164.0\t286.0\t759.0\n156197.0\t731.0\t197.0\t390.0\n142545.0\t1287.0\t145.0\t356.0\n86082.0\t63.0\t82.0\t215.0\n130557.0\t162.0\t157.0\t326.0\n218175.0\t414.0\t175.0\t545.0\n147711.0\t649.0\t111.0\t369.0\n150604.0\t220.0\t204.0\t376.0\n175394.0\t565.0\t194.0\t438.0\n141299.0\t357.0\t99.0\t353.0\n152600.0\t523.0\t200.0\t381.0\n175738.0\t502.0\t138.0\t439.0\n97413.0\t193.0\t213.0\t243.0\n245074.0\t11.0\t274.0\t612.0\n128589.0\t510.0\t189.0\t321.0\n249376.0\t14.0\t176.0\t623.0\n333891.0\t127.0\t291.0\t834.0\n203429.0\t53.0\t229.0\t508.0\n247396.0\t40.0\t196.0\t618.0\n88599.0\t273.0\t199.0\t221.0\n132171.0\t272.0\t171.0\t330.0\n328279.0\t266.0\t279.0\t820.0\n256117.0\t1.0\t117.0\t640.0\n57380.0\t38.0\t180.0\t143.0\n220674.0\t21.0\t274.0\t551.0\n242249.0\t206.0\t249.0\t605.0\n82582.0\t137.0\t182.0\t206.0\n68579.0\t50.0\t179.0\t171.0\n137377.0\t452.0\t177.0\t343.0\n120899.0\t706.0\t99.0\t302.0\n325471.0\t398.0\t271.0\t813.0\n57020.0\t20.0\t220.0\t142.0\n134138.0\t613.0\t138.0\t335.0\n171723.0\t147.0\t123.0\t429.0\n235447.0\t94.0\t247.0\t588.0\n299487.0\t84.0\t287.0\t748.0\n217114.0\t6.0\t314.0\t542.0\n327888.0\t202.0\t288.0\t819.0\n216619.0\t416.0\t219.0\t541.0\n290634.0\t141.0\t234.0\t726.0\n296688.0\t57.0\t288.0\t741.0\n99817.0\t184.0\t217.0\t249.0\n68090.0\t10.0\t90.0\t170.0\n162105.0\t55.0\t105.0\t405.0\n104880.0\t84.0\t80.0\t262.0\n233044.0\t85.0\t244.0\t582.0\n91299.0\t79.0\t99.0\t228.0\n91367.0\t183.0\t167.0\t228.0\n202242.0\t24.0\t242.0\t505.0\n196628.0\t50.0\t228.0\t491.0\n180191.0\t414.0\t191.0\t450.0\n202627.0\t59.0\t227.0\t506.0\n319884.0\t315.0\t284.0\t799.0\n185795.0\t226.0\t195.0\t464.0\n118185.0\t429.0\t185.0\t295.0\n78478.0\t45.0\t78.0\t196.0\n255862.0\t81.0\t262.0\t639.0\n323090.0\t205.0\t290.0\t807.0\n216627.0\t114.0\t227.0\t541.0\n325056.0\t121.0\t256.0\t812.0\n155510.0\t3.0\t310.0\t388.0\n96488.0\t112.0\t88.0\t241.0\n147280.0\t7.0\t80.0\t368.0\n253457.0\t197.0\t257.0\t633.0\n114503.0\t341.0\t103.0\t286.0\n69048.0\t6.0\t248.0\t172.0\n187341.0\t77.0\t141.0\t468.0\n73048.0\t7.0\t248.0\t182.0\n182945.0\t421.0\t145.0\t457.0\n252206.0\t122.0\t206.0\t630.0\n91785.0\t319.0\t185.0\t229.0\n219352.0\t17.0\t152.0\t548.0\n87724.0\t41.0\t124.0\t219.0\n283980.0\t1.0\t380.0\t709.0\n167316.0\t115.0\t116.0\t418.0\n266617.0\t71.0\t217.0\t666.0\n232647.0\t74.0\t247.0\t581.0\n367125.0\t4.0\t325.0\t917.0\n336694.0\t92.0\t294.0\t841.0\n202253.0\t26.0\t253.0\t505.0\n121749.0\t76.0\t149.0\t304.0\n145007.0\t137.0\t207.0\t362.0\n205837.0\t39.0\t237.0\t514.0\n268687.0\t15.0\t287.0\t671.0\n134607.0\t193.0\t207.0\t336.0\n162203.0\t161.0\t203.0\t405.0\n133018.0\t25.0\t218.0\t332.0\n68610.0\t117.0\t210.0\t171.0\n195413.0\t72.0\t213.0\t488.0\n359508.0\t17.0\t308.0\t898.0\n244597.0\t71.0\t197.0\t611.0\n57370.0\t17.0\t170.0\t143.0\n331484.0\t192.0\t284.0\t828.0\n340673.0\t96.0\t273.0\t851.0\n210736.0\t2.0\t336.0\t526.0\n103011.0\t439.0\t211.0\t257.0\n342674.0\t63.0\t274.0\t856.0\n172523.0\t152.0\t123.0\t431.0\n276338.0\t2.0\t338.0\t690.0\n312703.0\t21.0\t303.0\t781.0\n108460.0\t5.0\t60.0\t271.0\n108560.0\t67.0\t160.0\t271.0\n221743.0\t18.0\t143.0\t554.0\n214547.0\t20.0\t147.0\t536.0\n64859.0\t8.0\t59.0\t162.0\n327076.0\t372.0\t276.0\t817.0\n298705.0\t6.0\t305.0\t746.0\n144907.0\t518.0\t107.0\t362.0\n41409.0\t21.0\t209.0\t103.0\n195004.0\t160.0\t204.0\t487.0\n239049.0\t123.0\t249.0\t597.0\n225359.0\t42.0\t159.0\t563.0\n154077.0\t1.0\t77.0\t385.0\n241533.0\t5.0\t333.0\t603.0\n215828.0\t83.0\t228.0\t539.0\n262215.0\t110.0\t215.0\t655.0\n255806.0\t58.0\t206.0\t639.0\n142084.0\t48.0\t84.0\t355.0\n323095.0\t107.0\t295.0\t807.0\n216635.0\t52.0\t235.0\t541.0\n271109.0\t6.0\t309.0\t677.0\n66176.0\t40.0\t176.0\t165.0\n252259.0\t86.0\t259.0\t630.0\n32855.0\t4.0\t55.0\t82.0\n106535.0\t41.0\t135.0\t266.0\n131811.0\t110.0\t211.0\t329.0\n265863.0\t157.0\t263.0\t664.0\n122128.0\t281.0\t128.0\t305.0\n214163.0\t74.0\t163.0\t535.0\n112971.0\t137.0\t171.0\t282.0\n90550.0\t75.0\t150.0\t226.0\n122484.0\t130.0\t84.0\t306.0\n296288.0\t52.0\t288.0\t740.0\n54190.0\t104.0\t190.0\t135.0\n85749.0\t47.0\t149.0\t214.0\n59384.0\t64.0\t184.0\t148.0\n100884.0\t122.0\t84.0\t252.0\n94950.0\t76.0\t150.0\t237.0\n66166.0\t20.0\t166.0\t165.0\n309434.0\t9.0\t234.0\t773.0\n51393.0\t89.0\t193.0\t128.0\n90228.0\t30.0\t228.0\t225.0\n325102.0\t39.0\t302.0\t812.0\n51415.0\t21.0\t215.0\t128.0\n226243.0\t46.0\t243.0\t565.0\n200625.0\t49.0\t225.0\t501.0\n82529.0\t32.0\t129.0\t206.0\n61793.0\t162.0\t193.0\t154.0\n44596.0\t74.0\t196.0\t111.0\n42468.0\t11.0\t68.0\t106.0\n58061.0\t19.0\t61.0\t145.0\n213021.0\t155.0\t221.0\t532.0\n89385.0\t213.0\t185.0\t223.0\n225333.0\t22.0\t133.0\t563.0\n102524.0\t53.0\t124.0\t256.0\n249802.0\t81.0\t202.0\t624.0\n178199.0\t151.0\t199.0\t445.0\n231350.0\t13.0\t150.0\t578.0\n4519.0\t2.0\t119.0\t11.0\n162263.0\t4.0\t263.0\t405.0\n225877.0\t14.0\t277.0\t564.0\n322700.0\t61.0\t300.0\t806.0\n218934.0\t33.0\t134.0\t547.0\n325902.0\t51.0\t302.0\t814.0\n81349.0\t22.0\t149.0\t203.0\n330299.0\t60.0\t299.0\t825.0\n182237.0\t13.0\t237.0\t455.0\n102119.0\t55.0\t119.0\t255.0\n171006.0\t61.0\t206.0\t427.0\n153409.0\t62.0\t209.0\t383.0\n85349.0\t40.0\t149.0\t213.0\n69454.0\t8.0\t254.0\t173.0\n49717.0\t9.0\t117.0\t124.0\n81734.0\t36.0\t134.0\t204.0\n87338.0\t55.0\t138.0\t218.0\n73305.0\t19.0\t105.0\t183.0\n317983.0\t1.0\t383.0\t794.0\n92080.0\t79.0\t80.0\t230.0\n46994.0\t72.0\t194.0\t117.0\n63271.0\t28.0\t71.0\t158.0\n26583.0\t11.0\t183.0\t66.0\n157426.0\t18.0\t226.0\t393.0\n211126.0\t2.0\t326.0\t527.0\n206144.0\t16.0\t144.0\t515.0\n73683.0\t23.0\t83.0\t184.0\n96224.0\t60.0\t224.0\t240.0\n56987.0\t106.0\t187.0\t142.0\n122555.0\t70.0\t155.0\t306.0\n46465.0\t13.0\t65.0\t116.0\n67782.0\t70.0\t182.0\t169.0\n188264.0\t6.0\t264.0\t470.0\n121763.0\t99.0\t163.0\t304.0\n221858.0\t23.0\t258.0\t554.0\n104064.0\t10.0\t64.0\t260.0\n12940.0\t6.0\t140.0\t32.0\n150087.0\t25.0\t87.0\t375.0\n190227.0\t41.0\t227.0\t475.0\n201031.0\t29.0\t231.0\t502.0\n212297.0\t8.0\t297.0\t530.0\n85321.0\t46.0\t121.0\t213.0\n35820.0\t5.0\t220.0\t89.0\n309439.0\t42.0\t239.0\t773.0\n29719.0\t3.0\t119.0\t74.0\n32592.0\t31.0\t192.0\t81.0\n140081.0\t32.0\t81.0\t350.0\n227763.0\t43.0\t163.0\t569.0\n232643.0\t96.0\t243.0\t581.0\n79361.0\t32.0\t161.0\t198.0\n282680.0\t49.0\t280.0\t706.0\n93319.0\t24.0\t119.0\t233.0\n67753.0\t11.0\t153.0\t169.0\n172616.0\t32.0\t216.0\t431.0\n103747.0\t22.0\t147.0\t259.0\n108221.0\t95.0\t221.0\t270.0\n274280.0\t19.0\t280.0\t685.0\n253948.0\t2.0\t348.0\t634.0\n11317.0\t2.0\t117.0\t28.0\n352731.0\t2.0\t331.0\t881.0\n35361.0\t4.0\t161.0\t88.0\n360710.0\t13.0\t310.0\t901.0\n299559.0\t2.0\t359.0\t748.0\n243356.0\t4.0\t156.0\t608.0\n37263.0\t11.0\t63.0\t93.0\n35351.0\t4.0\t151.0\t88.0\n310296.0\t48.0\t296.0\t775.0\n311101.0\t22.0\t301.0\t777.0\n275481.0\t23.0\t281.0\t688.0\n239370.0\t42.0\t170.0\t598.0\n228653.0\t33.0\t253.0\t571.0\n102960.0\t126.0\t160.0\t257.0\n222556.0\t22.0\t156.0\t556.0\n55265.0\t31.0\t65.0\t138.0\n69478.0\t7.0\t278.0\t173.0\n170096.0\t8.0\t96.0\t425.0\n321932.0\t3.0\t332.0\t804.0\n45341.0\t2.0\t141.0\t113.0\n167881.0\t1.0\t281.0\t419.0\n263013.0\t69.0\t213.0\t657.0\n105665.0\t16.0\t65.0\t264.0\n214660.0\t29.0\t260.0\t536.0\n196615.0\t51.0\t215.0\t491.0\n50223.0\t6.0\t223.0\t125.0\n45011.0\t12.0\t211.0\t112.0\n33717.0\t8.0\t117.0\t84.0\n182678.0\t6.0\t278.0\t456.0\n296327.0\t8.0\t327.0\t740.0\n343903.0\t47.0\t303.0\t859.0\n300282.0\t250.0\t282.0\t750.0\n40574.0\t16.0\t174.0\t101.0\n344693.0\t62.0\t293.0\t861.0\n203894.0\t13.0\t294.0\t509.0\n176213.0\t37.0\t213.0\t440.0\n67376.0\t48.0\t176.0\t168.0\n341504.0\t50.0\t304.0\t853.0\n281809.0\t5.0\t209.0\t704.0\n98143.0\t14.0\t143.0\t245.0\n245390.0\t34.0\t190.0\t613.0\n106544.0\t36.0\t144.0\t266.0\n193733.0\t9.0\t133.0\t484.0\n61051.0\t9.0\t251.0\t152.0\n353501.0\t35.0\t301.0\t883.0\n174229.0\t14.0\t229.0\t435.0\n213089.0\t11.0\t289.0\t532.0\n104508.0\t92.0\t108.0\t261.0\n162260.0\t3.0\t260.0\t405.0\n93341.0\t32.0\t141.0\t233.0\n175842.0\t11.0\t242.0\t439.0\n69352.0\t5.0\t152.0\t173.0\n330706.0\t29.0\t306.0\t826.0\n14832.0\t1.0\t32.0\t37.0\n286699.0\t8.0\t299.0\t716.0\n323027.0\t3.0\t227.0\t807.0\n234179.0\t60.0\t179.0\t585.0\n236689.0\t11.0\t289.0\t591.0\n269421.0\t100.0\t221.0\t673.0\n160492.0\t11.0\t92.0\t401.0\n188614.0\t57.0\t214.0\t471.0\n18866.0\t4.0\t66.0\t47.0\n255394.0\t12.0\t194.0\t638.0\n198218.0\t58.0\t218.0\t495.0\n211048.0\t19.0\t248.0\t527.0\n271086.0\t9.0\t286.0\t677.0\n231502.0\t9.0\t302.0\t578.0\n285499.0\t6.0\t299.0\t713.0\n270200.0\t3.0\t200.0\t675.0\n76143.0\t11.0\t143.0\t190.0\n229071.0\t22.0\t271.0\t572.0\n185494.0\t5.0\t294.0\t463.0\n76885.0\t34.0\t85.0\t192.0\n354686.0\t8.0\t286.0\t886.0\n166624.0\t15.0\t224.0\t416.0\n65867.0\t11.0\t267.0\t164.0\n210661.0\t23.0\t261.0\t526.0\n68135.0\t7.0\t135.0\t170.0\n236314.0\t5.0\t314.0\t590.0\n17389.0\t4.0\t189.0\t43.0\n28577.0\t10.0\t177.0\t71.0\n250299.0\t11.0\t299.0\t625.0\n83693.0\t40.0\t93.0\t209.0\n171094.0\t3.0\t294.0\t427.0\n31261.0\t4.0\t61.0\t78.0\n304322.0\t5.0\t322.0\t760.0\n35071.0\t2.0\t271.0\t87.0\n30970.0\t8.0\t170.0\t77.0\n189310.0\t1.0\t110.0\t473.0\n165829.0\t19.0\t229.0\t414.0\n216941.0\t24.0\t141.0\t542.0\n234983.0\t65.0\t183.0\t587.0\n54264.0\t9.0\t264.0\t135.0\n325848.0\t19.0\t248.0\t814.0\n291501.0\t10.0\t301.0\t728.0\n38868.0\t6.0\t68.0\t97.0\n222730.0\t4.0\t330.0\t556.0\n342305.0\t33.0\t305.0\t855.0\n299003.0\t2.0\t203.0\t747.0\n181524.0\t1.0\t324.0\t453.0\n330720.0\t4.0\t320.0\t826.0\n245857.0\t64.0\t257.0\t614.0\n64519.0\t6.0\t119.0\t161.0\n76493.0\t19.0\t93.0\t191.0\n234973.0\t62.0\t173.0\t587.0\n95715.0\t33.0\t115.0\t239.0\n362324.0\t4.0\t324.0\t905.0\n135867.0\t3.0\t267.0\t339.0\n255890.0\t14.0\t290.0\t639.0\n351086.0\t32.0\t286.0\t877.0\n178254.0\t13.0\t254.0\t445.0\n355495.0\t16.0\t295.0\t888.0\n28170.0\t5.0\t170.0\t70.0\n144475.0\t3.0\t75.0\t361.0\n222543.0\t12.0\t143.0\t556.0\n243476.0\t14.0\t276.0\t608.0\n209029.0\t31.0\t229.0\t522.0\n145038.0\t8.0\t238.0\t362.0\n166648.0\t9.0\t248.0\t416.0\n262183.0\t4.0\t183.0\t655.0\n243392.0\t56.0\t192.0\t608.0\n27760.0\t6.0\t160.0\t69.0\n64628.0\t8.0\t228.0\t161.0\n352674.0\t2.0\t274.0\t881.0\n235096.0\t8.0\t296.0\t587.0\n75039.0\t10.0\t239.0\t187.0\n55283.0\t2.0\t83.0\t138.0\n363904.0\t8.0\t304.0\t909.0\n203504.0\t3.0\t304.0\t508.0\n187525.0\t6.0\t325.0\t468.0\n35694.0\t2.0\t94.0\t89.0\n186314.0\t5.0\t314.0\t465.0\n141422.0\t4.0\t222.0\t353.0\n74904.0\t8.0\t104.0\t187.0\n119432.0\t1.0\t232.0\t298.0\n30903.0\t1.0\t103.0\t77.0\n77422.0\t45.0\t222.0\t193.0\n160264.0\t6.0\t264.0\t400.0\n165495.0\t2.0\t295.0\t413.0\n143032.0\t1.0\t232.0\t357.0\n39432.0\t5.0\t232.0\t98.0\n62680.0\t6.0\t280.0\t156.0\n33412.0\t3.0\t212.0\t83.0\n201148.0\t4.0\t348.0\t502.0\n173059.0\t8.0\t259.0\t432.0\n214739.0\t6.0\t339.0\t536.0\n243119.0\t6.0\t319.0\t607.0\n269796.0\t1.0\t196.0\t674.0\n200687.0\t17.0\t287.0\t501.0\n24663.0\t1.0\t263.0\t61.0\n124861.0\t3.0\t61.0\t312.0\n268695.0\t5.0\t295.0\t671.0\n76110.0\t12.0\t110.0\t190.0\n67492.0\t1.0\t292.0\t168.0\n228725.0\t5.0\t325.0\t571.0\n273916.0\t6.0\t316.0\t684.0\n107032.0\t6.0\t232.0\t267.0\n284722.0\t6.0\t322.0\t711.0\n18979.0\t5.0\t179.0\t47.0\n257891.0\t5.0\t291.0\t644.0\n136625.0\t1.0\t225.0\t341.0\n56640.0\t8.0\t240.0\t141.0\n74251.0\t7.0\t251.0\t185.0\n287495.0\t12.0\t295.0\t718.0\n75705.0\t12.0\t105.0\t189.0\n230690.0\t9.0\t290.0\t576.0\n149688.0\t29.0\t88.0\t374.0\n74058.0\t3.0\t58.0\t185.0\n235476.0\t10.0\t276.0\t588.0\n223475.0\t9.0\t275.0\t558.0\n293418.0\t3.0\t218.0\t733.0\n188125.0\t3.0\t125.0\t470.0\n92235.0\t9.0\t235.0\t230.0\n360324.0\t6.0\t324.0\t900.0\n309510.0\t7.0\t310.0\t773.0\n173898.0\t2.0\t298.0\t434.0\n234778.0\t2.0\t378.0\t586.0\n219523.0\t4.0\t323.0\t548.0\n209326.0\t4.0\t126.0\t523.0\n199855.0\t19.0\t255.0\t499.0\n48875.0\t6.0\t75.0\t122.0\n74852.0\t4.0\t52.0\t187.0\n144685.0\t2.0\t285.0\t361.0\n130062.0\t5.0\t62.0\t325.0\n227470.0\t23.0\t270.0\t568.0\n135423.0\t6.0\t223.0\t338.0\n73470.0\t3.0\t270.0\t183.0\n300601.0\t2.0\t201.0\t751.0\n196290.0\t8.0\t290.0\t490.0\n32460.0\t5.0\t60.0\t81.0\n296738.0\t4.0\t338.0\t741.0\n36131.0\t6.0\t131.0\t90.0\n36224.0\t4.0\t224.0\t90.0\n188644.0\t19.0\t244.0\t471.0\n37489.0\t2.0\t289.0\t93.0\n248295.0\t8.0\t295.0\t620.0\n211912.0\t3.0\t312.0\t529.0\n213483.0\t12.0\t283.0\t533.0\n264279.0\t9.0\t279.0\t660.0\n166735.0\t1.0\t335.0\t416.0\n258129.0\t1.0\t129.0\t645.0\n280218.0\t15.0\t218.0\t700.0\n291112.0\t10.0\t312.0\t727.0\n214719.0\t3.0\t319.0\t536.0\n135027.0\t7.0\t227.0\t337.0\n212727.0\t5.0\t327.0\t531.0\n33375.0\t12.0\t175.0\t83.0\n148267.0\t2.0\t267.0\t370.0\n69042.0\t14.0\t242.0\t172.0\n238308.0\t8.0\t308.0\t595.0\n202251.0\t21.0\t251.0\t505.0\n205541.0\t2.0\t341.0\t513.0\n286323.0\t3.0\t323.0\t715.0\n167071.0\t3.0\t271.0\t417.0\n165914.0\t6.0\t314.0\t414.0\n139024.0\t8.0\t224.0\t347.0\n7240.0\t1.0\t40.0\t18.0\n67861.0\t9.0\t261.0\t169.0\n11033.0\t1.0\t233.0\t27.0\n206351.0\t2.0\t351.0\t515.0\n135267.0\t4.0\t67.0\t338.0\n89844.0\t1.0\t244.0\t224.0\n171452.0\t10.0\t252.0\t428.0\n140266.0\t2.0\t266.0\t350.0\n57039.0\t6.0\t239.0\t142.0\n206719.0\t7.0\t319.0\t516.0\n255132.0\t5.0\t332.0\t637.0\n78113.0\t23.0\t113.0\t195.0\n74166.0\t34.0\t166.0\t185.0\n371122.0\t1.0\t322.0\t927.0\n279897.0\t9.0\t297.0\t699.0\n137055.0\t3.0\t255.0\t342.0\n262558.0\t1.0\t158.0\t656.0\n65478.0\t6.0\t278.0\t163.0\n357089.0\t7.0\t289.0\t892.0\n23364.0\t3.0\t164.0\t58.0\n219514.0\t5.0\t314.0\t548.0\n292708.0\t6.0\t308.0\t731.0\n277084.0\t17.0\t284.0\t692.0\n267567.0\t3.0\t367.0\t668.0\n33868.0\t3.0\t268.0\t84.0\n246728.0\t3.0\t328.0\t616.0\n23336.0\t6.0\t136.0\t58.0\n222710.0\t4.0\t310.0\t556.0\n303539.0\t3.0\t339.0\t758.0\n56054.0\t5.0\t54.0\t140.0\n86927.0\t32.0\t127.0\t217.0\n22223.0\t3.0\t223.0\t55.0\n250934.0\t1.0\t134.0\t627.0\n17753.0\t4.0\t153.0\t44.0\n343047.0\t3.0\t247.0\t857.0\n301798.0\t1.0\t198.0\t754.0\n78064.0\t11.0\t64.0\t195.0\n146224.0\t5.0\t224.0\t365.0\n216135.0\t24.0\t135.0\t540.0\n185513.0\t3.0\t313.0\t463.0\n49855.0\t4.0\t255.0\t124.0\n137501.0\t1.0\t301.0\t343.0\n306768.0\t1.0\t368.0\t766.0\n155430.0\t1.0\t230.0\t388.0\n160235.0\t7.0\t235.0\t400.0\n239142.0\t2.0\t342.0\t597.0\n191554.0\t1.0\t354.0\t478.0\n207103.0\t9.0\t303.0\t517.0\n16861.0\t1.0\t61.0\t42.0\n155042.0\t5.0\t242.0\t387.0\n262597.0\t8.0\t197.0\t656.0\n210744.0\t1.0\t344.0\t526.0\n40515.0\t3.0\t115.0\t101.0\n167919.0\t1.0\t319.0\t419.0\n32539.0\t6.0\t139.0\t81.0\n67294.0\t6.0\t94.0\t168.0\n57693.0\t7.0\t93.0\t144.0\n175702.0\t2.0\t102.0\t439.0\n48254.0\t6.0\t254.0\t120.0\n294744.0\t3.0\t344.0\t736.0\n51123.0\t2.0\t323.0\t127.0\n43852.0\t4.0\t252.0\t109.0\n385152.0\t2.0\t352.0\t962.0\n152882.0\t4.0\t82.0\t382.0\n292297.0\t10.0\t297.0\t730.0\n29834.0\t2.0\t234.0\t74.0\n316224.0\t5.0\t224.0\t790.0\n64121.0\t5.0\t121.0\t160.0\n373118.0\t1.0\t318.0\t932.0\n246326.0\t2.0\t326.0\t615.0\n284346.0\t1.0\t346.0\t710.0\n34234.0\t3.0\t234.0\t85.0\n302344.0\t3.0\t344.0\t755.0\n23271.0\t3.0\t71.0\t58.0\n224708.0\t3.0\t308.0\t561.0\n38758.0\t1.0\t358.0\t96.0\n200718.0\t5.0\t318.0\t501.0\n310728.0\t3.0\t328.0\t776.0\n7754.0\t2.0\t154.0\t19.0\n139830.0\t4.0\t230.0\t349.0\n271557.0\t2.0\t357.0\t678.0\n193137.0\t1.0\t337.0\t482.0\n237504.0\t6.0\t304.0\t593.0\n204529.0\t3.0\t129.0\t511.0\n279131.0\t6.0\t331.0\t697.0\n279177.0\t1.0\t377.0\t697.0\n330317.0\t3.0\t317.0\t825.0\n127444.0\t3.0\t244.0\t318.0\n197890.0\t8.0\t290.0\t494.0\n254564.0\t2.0\t164.0\t636.0\n185506.0\t7.0\t306.0\t463.0\n319929.0\t2.0\t329.0\t799.0\n46521.0\t12.0\t121.0\t116.0\n36538.0\t7.0\t138.0\t91.0\n279120.0\t4.0\t320.0\t697.0\n210688.0\t11.0\t288.0\t526.0\n217119.0\t4.0\t319.0\t542.0\n92644.0\t4.0\t244.0\t231.0\n195901.0\t5.0\t301.0\t489.0\n316184.0\t1.0\t184.0\t790.0\n208696.0\t7.0\t296.0\t521.0\n24171.0\t9.0\t171.0\t60.0\n101475.0\t1.0\t275.0\t253.0\n56110.0\t4.0\t110.0\t140.0\n90461.0\t3.0\t61.0\t226.0\n261168.0\t3.0\t368.0\t652.0\n251559.0\t1.0\t359.0\t628.0\n180282.0\t4.0\t282.0\t450.0\n49308.0\t4.0\t108.0\t123.0\n40107.0\t2.0\t107.0\t100.0\n38153.0\t1.0\t153.0\t95.0\n29744.0\t2.0\t144.0\t74.0\n307537.0\t3.0\t337.0\t768.0\n5300.0\t1.0\t100.0\t13.0\n305951.0\t2.0\t351.0\t764.0\n97092.0\t2.0\t292.0\t242.0\n249123.0\t4.0\t323.0\t622.0\n28146.0\t4.0\t146.0\t70.0\n47501.0\t3.0\t301.0\t118.0\n146464.0\t1.0\t64.0\t366.0\n167532.0\t1.0\t332.0\t418.0\n355477.0\t3.0\t277.0\t888.0\n143432.0\t4.0\t232.0\t358.0\n187578.0\t1.0\t378.0\t468.0\n28124.0\t2.0\t124.0\t70.0\n213516.0\t7.0\t316.0\t533.0\n291417.0\t4.0\t217.0\t728.0\n120861.0\t2.0\t61.0\t302.0\n195574.0\t1.0\t374.0\t488.0\n196301.0\t6.0\t301.0\t490.0\n188873.0\t3.0\t73.0\t472.0\n73091.0\t2.0\t291.0\t182.0\n158257.0\t7.0\t257.0\t395.0\n161295.0\t8.0\t95.0\t403.0\n195541.0\t2.0\t341.0\t488.0\n190387.0\t1.0\t387.0\t475.0\n222925.0\t2.0\t125.0\t557.0\n171142.0\t2.0\t342.0\t427.0\n263545.0\t4.0\t345.0\t658.0\n283137.0\t4.0\t337.0\t707.0\n34061.0\t3.0\t61.0\t85.0\n31367.0\t4.0\t167.0\t78.0\n246944.0\t1.0\t144.0\t617.0\n36525.0\t2.0\t125.0\t91.0\n96469.0\t20.0\t69.0\t241.0\n246703.0\t5.0\t303.0\t616.0\n21700.0\t1.0\t100.0\t54.0\n324221.0\t1.0\t221.0\t810.0\n227501.0\t7.0\t301.0\t568.0\n194753.0\t1.0\t353.0\t486.0\n114851.0\t1.0\t51.0\t287.0\n179115.0\t3.0\t315.0\t447.0\n44906.0\t4.0\t106.0\t112.0\n221138.0\t4.0\t338.0\t552.0\n173914.0\t3.0\t314.0\t434.0\n41751.0\t2.0\t151.0\t104.0\n58665.0\t3.0\t265.0\t146.0\n234320.0\t4.0\t320.0\t585.0\n40653.0\t2.0\t253.0\t101.0\n264914.0\t1.0\t114.0\t662.0\n373523.0\t2.0\t323.0\t933.0\n260195.0\t4.0\t195.0\t650.0\n65251.0\t3.0\t51.0\t163.0\n46266.0\t6.0\t266.0\t115.0\n343134.0\t2.0\t334.0\t857.0\n2866.0\t1.0\t66.0\t7.0\n18944.0\t3.0\t144.0\t47.0\n265366.0\t2.0\t166.0\t663.0\n368745.0\t1.0\t345.0\t921.0\n163934.0\t2.0\t334.0\t409.0\n175513.0\t1.0\t313.0\t438.0\n11748.0\t1.0\t148.0\t29.0\n251742.0\t1.0\t142.0\t629.0\n136631.0\t3.0\t231.0\t341.0\n272319.0\t2.0\t319.0\t680.0\n55869.0\t6.0\t269.0\t139.0\n235942.0\t3.0\t342.0\t589.0\n43714.0\t7.0\t114.0\t109.0\n297114.0\t4.0\t314.0\t742.0\n46943.0\t4.0\t143.0\t117.0\n303188.0\t1.0\t388.0\t757.0\n328324.0\t3.0\t324.0\t820.0\n191933.0\t2.0\t333.0\t479.0\n20135.0\t3.0\t135.0\t50.0\n201946.0\t2.0\t346.0\t504.0\n253769.0\t2.0\t169.0\t634.0\n14570.0\t3.0\t170.0\t36.0\n47711.0\t1.0\t111.0\t119.0\n163046.0\t4.0\t246.0\t407.0\n53691.0\t1.0\t91.0\t134.0\n189903.0\t3.0\t303.0\t474.0\n295138.0\t2.0\t338.0\t737.0\n245123.0\t3.0\t323.0\t612.0\n113652.0\t2.0\t52.0\t284.0\n47283.0\t2.0\t83.0\t118.0\n177496.0\t3.0\t296.0\t443.0\n271939.0\t1.0\t339.0\t679.0\n67089.0\t2.0\t289.0\t167.0\n89863.0\t1.0\t263.0\t224.0\n271000.0\t2.0\t200.0\t677.0\n188718.0\t4.0\t318.0\t471.0\n42635.0\t3.0\t235.0\t106.0\n314766.0\t1.0\t366.0\t786.0\n330799.0\t1.0\t399.0\t826.0\n37251.0\t3.0\t51.0\t93.0\n175925.0\t2.0\t325.0\t439.0\n341531.0\t1.0\t331.0\t853.0\n151871.0\t2.0\t271.0\t379.0\n18498.0\t2.0\t98.0\t46.0\n22521.0\t3.0\t121.0\t56.0\n254145.0\t1.0\t145.0\t635.0\n293947.0\t2.0\t347.0\t734.0\n31035.0\t1.0\t235.0\t77.0\n228306.0\t7.0\t306.0\t570.0\n148.0\t2.0\t148.0\t0.0\n225566.0\t1.0\t366.0\t563.0\n275400.0\t2.0\t200.0\t688.0\n68098.0\t3.0\t98.0\t170.0\n297008.0\t2.0\t208.0\t742.0\n192738.0\t6.0\t338.0\t481.0\n15846.0\t1.0\t246.0\t39.0\n239148.0\t2.0\t348.0\t597.0\n387142.0\t1.0\t342.0\t967.0\n46952.0\t4.0\t152.0\t117.0\n261569.0\t1.0\t369.0\t653.0\n289541.0\t3.0\t341.0\t723.0\n186519.0\t2.0\t119.0\t466.0\n187136.0\t2.0\t336.0\t467.0\n144664.0\t1.0\t264.0\t361.0\n347056.0\t1.0\t256.0\t867.0\n230513.0\t1.0\t113.0\t576.0\n272391.0\t1.0\t391.0\t680.0\n300574.0\t1.0\t174.0\t751.0\n304745.0\t1.0\t345.0\t761.0\n162321.0\t2.0\t321.0\t405.0\n184096.0\t1.0\t96.0\t460.0\n149465.0\t1.0\t265.0\t373.0\n145095.0\t1.0\t295.0\t362.0\n256761.0\t1.0\t361.0\t641.0\n104053.0\t1.0\t53.0\t260.0\n15790.0\t3.0\t190.0\t39.0\n197953.0\t1.0\t353.0\t494.0\n219558.0\t1.0\t358.0\t548.0\n254312.0\t2.0\t312.0\t635.0\n322355.0\t1.0\t355.0\t805.0\n308619.0\t1.0\t219.0\t771.0\n255362.0\t2.0\t162.0\t638.0\n188122.0\t2.0\t122.0\t470.0\n95940.0\t1.0\t340.0\t239.0\n285977.0\t1.0\t377.0\t714.0\n372733.0\t1.0\t333.0\t931.0\n496.0\t1.0\t96.0\t1.0\n250741.0\t1.0\t341.0\t626.0\n156645.0\t6.0\t245.0\t391.0\n287536.0\t3.0\t336.0\t718.0\n153937.0\t1.0\t337.0\t384.0\n29054.0\t2.0\t254.0\t72.0\n263755.0\t2.0\t155.0\t659.0\n83250.0\t2.0\t50.0\t208.0\n18051.0\t1.0\t51.0\t45.0\n91446.0\t1.0\t246.0\t228.0\n186486.0\t2.0\t86.0\t466.0\n121854.0\t2.0\t254.0\t304.0\n15727.0\t2.0\t127.0\t39.0\n245534.0\t1.0\t334.0\t613.0\n94265.0\t1.0\t265.0\t235.0\n210765.0\t2.0\t365.0\t526.0\n52697.0\t1.0\t297.0\t131.0\n301535.0\t2.0\t335.0\t753.0\n28664.0\t1.0\t264.0\t71.0\n368248.0\t1.0\t248.0\t920.0\n251529.0\t2.0\t329.0\t628.0\n87656.0\t1.0\t56.0\t219.0\n292608.0\t2.0\t208.0\t731.0\n12046.0\t1.0\t46.0\t30.0\n297391.0\t1.0\t191.0\t743.0\n104656.0\t1.0\t256.0\t261.0\n168654.0\t8.0\t254.0\t421.0\n271537.0\t2.0\t337.0\t678.0\n49331.0\t3.0\t131.0\t123.0\n204780.0\t1.0\t380.0\t511.0\n189149.0\t2.0\t349.0\t472.0\n88666.0\t1.0\t266.0\t221.0\n162296.0\t2.0\t296.0\t405.0\n269104.0\t3.0\t304.0\t672.0\n1342.0\t1.0\t142.0\t3.0\n89056.0\t1.0\t256.0\t222.0\n71527.0\t1.0\t327.0\t178.0\n124647.0\t1.0\t247.0\t311.0\n246115.0\t1.0\t115.0\t615.0\n262397.0\t1.0\t397.0\t655.0\n273372.0\t1.0\t172.0\t683.0\n35947.0\t1.0\t347.0\t89.0\n333130.0\t1.0\t330.0\t832.0\n43302.0\t2.0\t102.0\t108.0\n237337.0\t1.0\t137.0\t593.0\n175295.0\t1.0\t95.0\t438.0\n23015.0\t1.0\t215.0\t57.0\n286787.0\t1.0\t387.0\t716.0\n268197.0\t3.0\t197.0\t670.0\n101055.0\t1.0\t255.0\t252.0\n246758.0\t2.0\t358.0\t616.0\n30654.0\t2.0\t254.0\t76.0\n6466.0\t1.0\t66.0\t16.0\n253765.0\t1.0\t165.0\t634.0\n359930.0\t1.0\t330.0\t899.0\n48510.0\t1.0\t110.0\t121.0\n16574.0\t2.0\t174.0\t41.0\n156296.0\t1.0\t296.0\t390.0\n229566.0\t1.0\t366.0\t573.0\n292727.0\t2.0\t327.0\t731.0\n37307.0\t3.0\t107.0\t93.0\n260726.0\t4.0\t326.0\t651.0\n58305.0\t1.0\t305.0\t145.0\n63087.0\t1.0\t287.0\t157.0\n203592.0\t1.0\t392.0\t508.0\n127109.0\t1.0\t309.0\t317.0\n274765.0\t1.0\t365.0\t686.0\n141449.0\t1.0\t249.0\t353.0\n227152.0\t1.0\t352.0\t567.0\n153555.0\t1.0\t355.0\t383.0\n265769.0\t1.0\t169.0\t664.0\n287568.0\t1.0\t368.0\t718.0\n72702.0\t1.0\t302.0\t181.0\n186109.0\t1.0\t109.0\t465.0\n170862.0\t1.0\t62.0\t427.0\n187647.0\t1.0\t47.0\t469.0\n197949.0\t1.0\t349.0\t494.0\n109068.0\t1.0\t268.0\t272.0\n59355.0\t2.0\t155.0\t148.0\n63106.0\t1.0\t306.0\t157.0\n243197.0\t1.0\t397.0\t607.0\n307415.0\t1.0\t215.0\t768.0\n265539.0\t1.0\t339.0\t663.0\n173508.0\t1.0\t308.0\t433.0\n9376.0\t1.0\t176.0\t23.0\n197148.0\t1.0\t348.0\t492.0\n26623.0\t1.0\t223.0\t66.0\n44437.0\t1.0\t37.0\t111.0\n38311.0\t1.0\t311.0\t95.0\n368304.0\t2.0\t304.0\t920.0\n277404.0\t1.0\t204.0\t693.0\n272655.0\t2216.0\t255.0\t681.0\n245018.0\t7727.0\t218.0\t612.0\n216185.0\t6578.0\t185.0\t540.0\n179764.0\t13233.0\t164.0\t449.0\n225002.0\t11933.0\t202.0\t562.0\n152108.0\t282.0\t108.0\t380.0\n221801.0\t11783.0\t201.0\t554.0\n214590.0\t13834.0\t190.0\t536.0\n207785.0\t14436.0\t185.0\t519.0\n265033.0\t1999.0\t233.0\t662.0\n145747.0\t1612.0\t147.0\t364.0\n217785.0\t4221.0\t185.0\t544.0\n156957.0\t2845.0\t157.0\t392.0\n205781.0\t14870.0\t181.0\t514.0\n271041.0\t3708.0\t241.0\t677.0\n244220.0\t8778.0\t220.0\t610.0\n276250.0\t3885.0\t250.0\t690.0\n114497.0\t487.0\t97.0\t286.0\n167750.0\t5233.0\t150.0\t419.0\n177771.0\t9916.0\t171.0\t444.0\n256621.0\t1431.0\t221.0\t641.0\n213782.0\t6312.0\t182.0\t534.0\n299067.0\t1481.0\t267.0\t747.0\n167760.0\t6630.0\t160.0\t419.0\n108594.0\t1671.0\t194.0\t271.0\n249818.0\t3417.0\t218.0\t624.0\n151791.0\t1072.0\t191.0\t379.0\n225445.0\t60.0\t245.0\t563.0\n154533.0\t2238.0\t133.0\t386.0\n" - }, - { - "type": "HTML", - "data": "Results are limited by 1000.\n" - } - ] - } + "jobName": "paragraph_1674655553429_725211401", + "id": "paragraph_1662046085285_632981835", + "dateCreated": "2023-01-25T14:05:53+0000", + "dateStarted": "2024-02-29T13:53:14+0000", + "dateFinished": "2024-02-29T13:55:08+0000", + "status": "ERROR", + "$$hashKey": "object:25236" }, { - "title": "Visualise via matplotlib", - "text": "%pyspark\n\nimport matplotlib.pyplot as plot\n\n# create a sparse array object for the results (only those elements with non-zero counts are in the results set)\nfrom scipy.sparse import coo_matrix # renamed coo_array in later versions of scipy\n# https://docs.scipy.org/doc/scipy-1.6.3/reference/generated/scipy.sparse.coo_matrix.html#scipy.sparse.coo_matrix\nsparse_data = coo_matrix((np.log(pdf['count_in_pixel']), (pdf['yidx'], pdf['xidx'])), shape = (ymax_idx, xmax_idx))\n# ... use logged counts to enhance low-level features in the CAMD\n\n# expand into a dense array in order to plot as an image with imshow\ndense_data = sparse_data.todense()\n\n# do the plot\nplot.figure(0, figsize = (8.0, 12.0))\nplot.title('Dereddened optical/IR CAMD for the Gaia DR3 catalogue', fontsize = 16)\nplot.xlabel('(G - K)$_0$ / mag', fontsize = 14)\nplot.ylabel('M$_G$ - A$_G$ / mag', fontsize = 14)\nplot.imshow(dense_data, aspect = 'auto', \n extent = [bluest_colour, bluest_colour + xmax_idx * mag_resolution, brightest_abs_mag + ymax_idx * mag_resolution, brightest_abs_mag])\n\n", - "user": "NHambly", - "dateUpdated": "2022-08-26T15:07:05+0000", + "title": "Plot sampled spectra (internal calibration)", + "text": "%pyspark\n\n# convert to sampled form:\nsampled_spectra, sampling = convert(top3_pdf, save_file = False)\n \n# plot to sanity check:\nplot_spectra(sampled_spectra, sampling = sampling, multi=True, show_plot=True, output_path=None, legend=True)\n\n", + "user": "anonymous", + "dateUpdated": "2023-01-25T14:05:53+0000", "progress": 0, "config": { "editorSetting": { @@ -279,7 +312,6 @@ "colWidth": 12, "editorMode": "ace/mode/python", "fontSize": 9, - "editorHide": true, "title": true, "results": {}, "enabled": true @@ -291,45 +323,28 @@ "apps": [], "runtimeInfos": {}, "progressUpdateIntervalMs": 500, - "jobName": "paragraph_1646997023626_41851232", - "id": "paragraph_1646997023626_41851232", - "dateCreated": "2022-03-11T11:10:23+0000", - "dateStarted": "2022-08-26T15:07:05+0000", - "dateFinished": "2022-08-26T15:07:05+0000", - "status": "FINISHED", - "$$hashKey": "object:13970", - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "TEXT", - "data": "\n" - }, - { - "type": "HTML", - "data": "
\n" - } - ] - } + "jobName": "paragraph_1674655553429_1779642416", + "id": "paragraph_1662046203039_188861744", + "dateCreated": "2023-01-25T14:05:53+0000", + "status": "READY", + "$$hashKey": "object:25237" }, { - "title": "Further reading", - "text": "%md\n\n* [Gaia data release cross-matches](https://gea.esac.esa.int/archive/documentation/GDR3/Catalogue_consolidation/chap_crossmatch/)\n* [2MASS PSC](https://irsa.ipac.caltech.edu/2MASS/download/allsky/format_psc.html \"2MASS point-source catalogue column details\")\n* [ALLWISE](https://wise2.ipac.caltech.edu/docs/release/allwise/expsup/sec2_1a.html \"ALLWISE catalogue column details\")\n* [PS1 OTMO](https://outerspace.stsci.edu/display/PANSTARRS/PS1+MeanObjectView+table+fields \"PS1 DR1 object-thin object-mean catalogue column details\") (note that column names follow the Gaia archive convention of all lower-case with underscore separators rather than the original CamelCase)\n", - "user": "NHambly", - "dateUpdated": "2022-08-26T15:07:05+0000", + "title": "Plot externally calibrated spectra", + "text": "%pyspark\n\n# externally calibrate the spectra\ncalibrated_spectra, sampling = calibrate(top3_pdf, save_file = False)\n\n# plot the spectra\nplot_spectra(calibrated_spectra, sampling = sampling, legend = True)\n\n", + "user": "anonymous", + "dateUpdated": "2023-01-25T14:05:53+0000", "progress": 0, "config": { - "tableHide": false, "editorSetting": { - "language": "markdown", - "editOnDblClick": true, + "language": "python", + "editOnDblClick": false, "completionKey": "TAB", - "completionSupport": false + "completionSupport": true }, "colWidth": 12, - "editorMode": "ace/mode/markdown", + "editorMode": "ace/mode/python", "fontSize": 9, - "editorHide": true, "title": true, "results": {}, "enabled": true @@ -341,29 +356,20 @@ "apps": [], "runtimeInfos": {}, "progressUpdateIntervalMs": 500, - "jobName": "paragraph_1647276187713_571053798", - "id": "paragraph_1647276187713_571053798", - "dateCreated": "2022-03-14T16:43:07+0000", - "dateStarted": "2022-08-26T15:07:05+0000", - "dateFinished": "2022-08-26T15:07:05+0000", - "status": "FINISHED", - "$$hashKey": "object:13971", - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "HTML", - "data": "
\n\n\n
" - } - ] - } + "jobName": "paragraph_1674655553430_1544666297", + "id": "paragraph_1662046259646_282464556", + "dateCreated": "2023-01-25T14:05:53+0000", + "status": "READY", + "$$hashKey": "object:25238" }, { - "text": "%md\n", - "user": "NHambly", - "dateUpdated": "2022-08-26T15:07:06+0000", + "title": "Further information", + "text": "%md\n\n* [Gaia DR3 XP spectra online documentation](https://gea.esac.esa.int/archive/documentation/GDR3/Data_processing/chap_cu5pho/cu5pho_sec_specProcessing/cu5pho_ssec_specInternCal.html#SSS3)\n* [Gaia DR3 spectroscopic data model](https://gea.esac.esa.int/archive/documentation/GDR3/Gaia_archive/chap_datamodel/sec_dm_spectroscopic_tables/)\n* [GaiaXPy website](https://gaia-dpci.github.io/GaiaXPy-website/)\n* [GaiaXPy API documentation](https://gaiaxpy.readthedocs.io/en/latest/gaiaxpy.html)\n* [Vectorised User Defined Functions for PySpark](https://databricks.com/blog/2020/05/20/new-pandas-udfs-and-python-type-hints-in-the-upcoming-release-of-apache-spark-3-0.html)\n", + "user": "anonymous", + "dateUpdated": "2023-01-25T14:05:53+0000", "progress": 0, "config": { + "tableHide": false, "editorSetting": { "language": "markdown", "editOnDblClick": true, @@ -373,6 +379,8 @@ "colWidth": 12, "editorMode": "ace/mode/markdown", "fontSize": 9, + "editorHide": true, + "title": true, "results": {}, "enabled": true }, @@ -383,26 +391,15 @@ "apps": [], "runtimeInfos": {}, "progressUpdateIntervalMs": 500, - "jobName": "paragraph_1661526172099_1605416017", - "id": "paragraph_1661526172099_1605416017", - "dateCreated": "2022-08-26T15:02:52+0000", - "status": "FINISHED", - "$$hashKey": "object:13972", - "dateFinished": "2022-08-26T15:07:06+0000", - "dateStarted": "2022-08-26T15:07:06+0000", - "results": { - "code": "SUCCESS", - "msg": [ - { - "type": "HTML", - "data": "
\n\n
" - } - ] - } + "jobName": "paragraph_1674655553432_1599662687", + "id": "paragraph_1651053931648_1906164321", + "dateCreated": "2023-01-25T14:05:53+0000", + "status": "READY", + "$$hashKey": "object:25239" } ], - "name": "6. Working with cross-matched surveys", - "id": "2GZME59KY", + "name": "5. Working with Gaia XP spectra", + "id": "2HQUJSZ9C", "defaultInterpreterGroup": "spark", "version": "0.10.0", "noteParams": {}, @@ -413,6 +410,8 @@ "looknfeel": "default", "personalizedMode": "false" }, - "info": {}, - "path": "/Public Examples/6. Working with cross-matched surveys" -} \ No newline at end of file + "info": { + "isRunning": false + }, + "path": "/tmp/5. Working with Gaia XP spectra" +}