diff --git a/TEMPO/L2_validation_codes/TEMPO_O3_validation_with_Pandora_and_DSCOVR_01_clean.ipynb b/TEMPO/L2_validation_codes/TEMPO_O3_validation_with_Pandora_and_DSCOVR_01_clean.ipynb deleted file mode 100644 index af50eef..0000000 --- a/TEMPO/L2_validation_codes/TEMPO_O3_validation_with_Pandora_and_DSCOVR_01_clean.ipynb +++ /dev/null @@ -1,3795 +0,0 @@ -{ - "nbformat": 4, - "nbformat_minor": 0, - "metadata": { - "colab": { - "provenance": [] - }, - "kernelspec": { - "name": "python3", - "display_name": "Python 3" - }, - "language_info": { - "name": "python" - }, - "widgets": { - "application/vnd.jupyter.widget-state+json": { - "86c595fccf7f44269f7cb5e985b82abf": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HBoxModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HBoxModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HBoxView", - "box_style": "", - "children": [ - "IPY_MODEL_9530c390dd934051912e75bb773f2943", - "IPY_MODEL_d72b4c7db99645c496d9c509601aaa9d", - "IPY_MODEL_9cdcfbcf3acf479bbab190f8c9d1b5dd" - ], - "layout": "IPY_MODEL_a0489d452c4f4d59b39e25b08e00a785" - } - }, - "9530c390dd934051912e75bb773f2943": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HTMLModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_fc92e6a3ce4c41b7b4e4d9ed68e9fdb9", - "placeholder": "​", - "style": "IPY_MODEL_da9916452e8e47f7a1e9f055aa061988", - "value": "QUEUEING TASKS | : 100%" - } - }, - "d72b4c7db99645c496d9c509601aaa9d": { - "model_module": "@jupyter-widgets/controls", - "model_name": "FloatProgressModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "FloatProgressModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "ProgressView", - "bar_style": "success", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_c65cf44da71846f882e3eab4526b3638", - "max": 11, - "min": 0, - "orientation": "horizontal", - "style": "IPY_MODEL_a5ef340105424bddacbdad7cbfb726a5", - "value": 11 - } - }, - "9cdcfbcf3acf479bbab190f8c9d1b5dd": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HTMLModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_0acb07eab0fa41e1af28c038557e7992", - "placeholder": "​", - "style": "IPY_MODEL_56da9bab427f4c188ef63fd208d677ae", - "value": " 11/11 [00:00<00:00, 246.34it/s]" - } - }, - "a0489d452c4f4d59b39e25b08e00a785": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "fc92e6a3ce4c41b7b4e4d9ed68e9fdb9": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "da9916452e8e47f7a1e9f055aa061988": { - "model_module": "@jupyter-widgets/controls", - "model_name": "DescriptionStyleModel", - "model_module_version": "1.5.0", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "c65cf44da71846f882e3eab4526b3638": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "a5ef340105424bddacbdad7cbfb726a5": { - "model_module": "@jupyter-widgets/controls", - "model_name": "ProgressStyleModel", - "model_module_version": "1.5.0", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "ProgressStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "bar_color": null, - "description_width": "" - } - }, - "0acb07eab0fa41e1af28c038557e7992": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "56da9bab427f4c188ef63fd208d677ae": { - "model_module": "@jupyter-widgets/controls", - "model_name": "DescriptionStyleModel", - "model_module_version": "1.5.0", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "d9a08a617eda4fd3aff2cb795c6ab49c": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HBoxModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HBoxModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HBoxView", - "box_style": "", - "children": [ - "IPY_MODEL_aee2fe4dba944179970113a0f00a4a88", - "IPY_MODEL_2af27d2decf54d12bc6f8e9eaeaee2da", - "IPY_MODEL_e58ba8910534430b99804fb42e7b796d" - ], - "layout": "IPY_MODEL_a91cfd7a529f49129e206e4ce580b5d7" - } - }, - "aee2fe4dba944179970113a0f00a4a88": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HTMLModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_cb4ef1e6587246fbba02bb30f1409363", - "placeholder": "​", - "style": "IPY_MODEL_1efcf2280d58437e88ddd939eeed9571", - "value": "PROCESSING TASKS | : 100%" - } - }, - "2af27d2decf54d12bc6f8e9eaeaee2da": { - "model_module": "@jupyter-widgets/controls", - "model_name": "FloatProgressModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "FloatProgressModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "ProgressView", - "bar_style": "success", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_b7c8eb11666d4f95964101f84389da0f", - "max": 11, - "min": 0, - "orientation": "horizontal", - "style": "IPY_MODEL_cc7d836c663943aabaa25d9aedf58273", - "value": 11 - } - }, - "e58ba8910534430b99804fb42e7b796d": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HTMLModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_6c7c5843fd7e49ef86da2df8dce125f6", - "placeholder": "​", - "style": "IPY_MODEL_a6b3297afae54367b311417fe04c366a", - "value": " 11/11 [00:20<00:00, 1.29s/it]" - } - }, - "a91cfd7a529f49129e206e4ce580b5d7": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "cb4ef1e6587246fbba02bb30f1409363": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "1efcf2280d58437e88ddd939eeed9571": { - "model_module": "@jupyter-widgets/controls", - "model_name": "DescriptionStyleModel", - "model_module_version": "1.5.0", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "b7c8eb11666d4f95964101f84389da0f": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "cc7d836c663943aabaa25d9aedf58273": { - "model_module": "@jupyter-widgets/controls", - "model_name": "ProgressStyleModel", - "model_module_version": "1.5.0", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "ProgressStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "bar_color": null, - "description_width": "" - } - }, - "6c7c5843fd7e49ef86da2df8dce125f6": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "a6b3297afae54367b311417fe04c366a": { - "model_module": "@jupyter-widgets/controls", - "model_name": "DescriptionStyleModel", - "model_module_version": "1.5.0", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "1563bcd5a65a4d3690135c23bab44226": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HBoxModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HBoxModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HBoxView", - "box_style": "", - "children": [ - "IPY_MODEL_572fc2f3d19249baa10fa3629f96c8df", - "IPY_MODEL_7b8ca42a725b449ab751ec6846558bed", - "IPY_MODEL_e98db869566941718531a6c7c090b171" - ], - "layout": "IPY_MODEL_9bbde6bb301946e0ae5d2a0b4804fe5c" - } - }, - "572fc2f3d19249baa10fa3629f96c8df": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HTMLModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_b8bc3f5d5497448e8b531b7bc3d53cb2", - "placeholder": "​", - "style": "IPY_MODEL_b1bf0477c37541c09a4a7ee16a9e5e28", - "value": "COLLECTING RESULTS | : 100%" - } - }, - "7b8ca42a725b449ab751ec6846558bed": { - "model_module": "@jupyter-widgets/controls", - "model_name": "FloatProgressModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "FloatProgressModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "ProgressView", - "bar_style": "success", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_611b56174c8d45bc8a3fc56d3891e602", - "max": 11, - "min": 0, - "orientation": "horizontal", - "style": "IPY_MODEL_27ecae9ae93d46b6a20f026f70c0f52b", - "value": 11 - } - }, - "e98db869566941718531a6c7c090b171": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HTMLModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_178ece40bdf64e178701901caaff5a80", - "placeholder": "​", - "style": "IPY_MODEL_abd0a75940954315b7e738dec0185472", - "value": " 11/11 [00:00<00:00, 333.05it/s]" - } - }, - "9bbde6bb301946e0ae5d2a0b4804fe5c": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "b8bc3f5d5497448e8b531b7bc3d53cb2": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "b1bf0477c37541c09a4a7ee16a9e5e28": { - "model_module": "@jupyter-widgets/controls", - "model_name": "DescriptionStyleModel", - "model_module_version": "1.5.0", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "611b56174c8d45bc8a3fc56d3891e602": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "27ecae9ae93d46b6a20f026f70c0f52b": { - "model_module": "@jupyter-widgets/controls", - "model_name": "ProgressStyleModel", - "model_module_version": "1.5.0", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "ProgressStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "bar_color": null, - "description_width": "" - } - }, - "178ece40bdf64e178701901caaff5a80": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "abd0a75940954315b7e738dec0185472": { - "model_module": "@jupyter-widgets/controls", - "model_name": "DescriptionStyleModel", - "model_module_version": "1.5.0", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - } - } - } - }, - "cells": [ - { - "cell_type": "markdown", - "source": [ - "### **TEMPO O3 validation**\n", - "\n", - "This notebook illustrates comparison of TEMPO ozone total column retrievals with Pandora ground stations and DSCOVR EPIC retrievals.\n", - "\n", - "It allows a user to choose Pandora station of interest. Since TEMPO spatial coverage is regional and limited to North America, it is user's responsibilty to select the station within TEMPO's field of regard (FOR). If the selected station is outside FOR, no TEMPO time series will be generated.\n", - "\n", - "The user is allowed to choose the time period of interest by providing start and end dates in the form YYYYMMDD. Please be aware, that if the selecte period of interest is outside of available time span of one of the sensors, corresponding time series will not be generated.\n", - "\n", - "DSCOVR L2 O3 data are interpolated to the location of the selected Pandora station.\n", - "\n", - "Data files for all 3 sensors are downloaded on-the-fly. TEMPO and DSCOVR data are downloaded with earthaccess library that needs to be installed first.\n", - "\n", - "TEMPO data files are read by means of netCDF library that needs to be installed first.\n", - "\n", - "Pandora data files are ASCII files with header and space separated columns. Custome made function is included to read nitrogen dioxide total column along with its total uncertainty.\n", - "\n", - "The resulting time series are plotted with and without uncertainty of both measurement in the end of the notebook." - ], - "metadata": { - "id": "kjVKCytfEnRt" - } - }, - { - "cell_type": "markdown", - "source": [ - "# 1 Installing and importing necessary libraries" - ], - "metadata": { - "id": "luJG0oPIPGjC" - } - }, - { - "cell_type": "markdown", - "source": [ - "## 1.1 Installing netCDF" - ], - "metadata": { - "id": "m5ru-FMpPXoE" - } - }, - { - "cell_type": "code", - "source": [ - "! pip3 install netCDF4" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "5NWX4mCVQJt_", - "outputId": "481fcb26-d66d-40e3-fde7-6ecb4d5a3d80" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Collecting netCDF4\n", - " Downloading netCDF4-1.6.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (5.5 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m5.5/5.5 MB\u001b[0m \u001b[31m11.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting cftime (from netCDF4)\n", - " Downloading cftime-1.6.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.3/1.3 MB\u001b[0m \u001b[31m18.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: certifi in /usr/local/lib/python3.10/dist-packages (from netCDF4) (2023.11.17)\n", - "Requirement already satisfied: numpy in /usr/local/lib/python3.10/dist-packages (from netCDF4) (1.23.5)\n", - "Installing collected packages: cftime, netCDF4\n", - "Successfully installed cftime-1.6.3 netCDF4-1.6.5\n" - ] - } - ] - }, - { - "cell_type": "markdown", - "source": [ - "## 1.2 Installing earthaccess" - ], - "metadata": { - "id": "cQJCMByjPp9i" - } - }, - { - "cell_type": "code", - "source": [ - "! pip3 install earthaccess" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "N7Gm15VaYKW9", - "outputId": "caa6f9f0-241b-4d27-f986-67b8b8bc5a8a" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Collecting earthaccess\n", - " Downloading earthaccess-0.8.2-py3-none-any.whl (56 kB)\n", - "\u001b[?25l \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m0.0/57.0 kB\u001b[0m \u001b[31m?\u001b[0m eta \u001b[36m-:--:--\u001b[0m\r\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m57.0/57.0 kB\u001b[0m \u001b[31m1.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: fsspec>=2022.11 in /usr/local/lib/python3.10/dist-packages (from earthaccess) (2023.6.0)\n", - "Collecting multimethod>=1.8 (from earthaccess)\n", - " Downloading multimethod-1.10-py3-none-any.whl (9.9 kB)\n", - "Collecting pqdm>=0.1 (from earthaccess)\n", - " Downloading pqdm-0.2.0-py2.py3-none-any.whl (6.8 kB)\n", - "Collecting python-cmr>=0.9.0 (from earthaccess)\n", - " Downloading python_cmr-0.9.0-py3-none-any.whl (11 kB)\n", - "Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.10/dist-packages (from earthaccess) (2.8.2)\n", - "Requirement already satisfied: requests<3.0.0,>=2.26 in /usr/local/lib/python3.10/dist-packages (from earthaccess) (2.31.0)\n", - "Collecting s3fs<2024,>=2022.11 (from earthaccess)\n", - " Downloading s3fs-2023.12.2-py3-none-any.whl (28 kB)\n", - "Collecting tinynetrc<2.0.0,>=1.3.1 (from earthaccess)\n", - " Downloading tinynetrc-1.3.1-py2.py3-none-any.whl (3.9 kB)\n", - "Collecting bounded-pool-executor (from pqdm>=0.1->earthaccess)\n", - " Downloading bounded_pool_executor-0.0.3-py3-none-any.whl (3.4 kB)\n", - "Requirement already satisfied: tqdm in /usr/local/lib/python3.10/dist-packages (from pqdm>=0.1->earthaccess) (4.66.1)\n", - "Requirement already satisfied: typing-extensions in /usr/local/lib/python3.10/dist-packages (from pqdm>=0.1->earthaccess) (4.5.0)\n", - "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.8.2->earthaccess) (1.16.0)\n", - "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests<3.0.0,>=2.26->earthaccess) (3.3.2)\n", - "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests<3.0.0,>=2.26->earthaccess) (3.6)\n", - "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests<3.0.0,>=2.26->earthaccess) (2.0.7)\n", - "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests<3.0.0,>=2.26->earthaccess) (2023.11.17)\n", - "Collecting aiobotocore<3.0.0,>=2.5.4 (from s3fs<2024,>=2022.11->earthaccess)\n", - " Downloading aiobotocore-2.11.0-py3-none-any.whl (76 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m76.1/76.1 kB\u001b[0m \u001b[31m4.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hCollecting fsspec>=2022.11 (from earthaccess)\n", - " Downloading fsspec-2023.12.2-py3-none-any.whl (168 kB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m169.0/169.0 kB\u001b[0m \u001b[31m8.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: aiohttp!=4.0.0a0,!=4.0.0a1 in /usr/local/lib/python3.10/dist-packages (from s3fs<2024,>=2022.11->earthaccess) (3.9.1)\n", - "Collecting botocore<1.34.23,>=1.33.2 (from aiobotocore<3.0.0,>=2.5.4->s3fs<2024,>=2022.11->earthaccess)\n", - " Downloading botocore-1.34.22-py3-none-any.whl (11.9 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m11.9/11.9 MB\u001b[0m \u001b[31m47.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hRequirement already satisfied: wrapt<2.0.0,>=1.10.10 in /usr/local/lib/python3.10/dist-packages (from aiobotocore<3.0.0,>=2.5.4->s3fs<2024,>=2022.11->earthaccess) (1.14.1)\n", - "Collecting aioitertools<1.0.0,>=0.5.1 (from aiobotocore<3.0.0,>=2.5.4->s3fs<2024,>=2022.11->earthaccess)\n", - " Downloading aioitertools-0.11.0-py3-none-any.whl (23 kB)\n", - "Requirement already satisfied: attrs>=17.3.0 in /usr/local/lib/python3.10/dist-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->s3fs<2024,>=2022.11->earthaccess) (23.2.0)\n", - "Requirement already satisfied: multidict<7.0,>=4.5 in /usr/local/lib/python3.10/dist-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->s3fs<2024,>=2022.11->earthaccess) (6.0.4)\n", - "Requirement already satisfied: yarl<2.0,>=1.0 in /usr/local/lib/python3.10/dist-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->s3fs<2024,>=2022.11->earthaccess) (1.9.4)\n", - "Requirement already satisfied: frozenlist>=1.1.1 in /usr/local/lib/python3.10/dist-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->s3fs<2024,>=2022.11->earthaccess) (1.4.1)\n", - "Requirement already satisfied: aiosignal>=1.1.2 in /usr/local/lib/python3.10/dist-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->s3fs<2024,>=2022.11->earthaccess) (1.3.1)\n", - "Requirement already satisfied: async-timeout<5.0,>=4.0 in /usr/local/lib/python3.10/dist-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->s3fs<2024,>=2022.11->earthaccess) (4.0.3)\n", - "Collecting jmespath<2.0.0,>=0.7.1 (from botocore<1.34.23,>=1.33.2->aiobotocore<3.0.0,>=2.5.4->s3fs<2024,>=2022.11->earthaccess)\n", - " Downloading jmespath-1.0.1-py3-none-any.whl (20 kB)\n", - "Installing collected packages: tinynetrc, bounded-pool-executor, pqdm, multimethod, jmespath, fsspec, aioitertools, python-cmr, botocore, aiobotocore, s3fs, earthaccess\n", - " Attempting uninstall: fsspec\n", - " Found existing installation: fsspec 2023.6.0\n", - " Uninstalling fsspec-2023.6.0:\n", - " Successfully uninstalled fsspec-2023.6.0\n", - "\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", - "gcsfs 2023.6.0 requires fsspec==2023.6.0, but you have fsspec 2023.12.2 which is incompatible.\u001b[0m\u001b[31m\n", - "\u001b[0mSuccessfully installed aiobotocore-2.11.0 aioitertools-0.11.0 botocore-1.34.22 bounded-pool-executor-0.0.3 earthaccess-0.8.2 fsspec-2023.12.2 jmespath-1.0.1 multimethod-1.10 pqdm-0.2.0 python-cmr-0.9.0 s3fs-2023.12.2 tinynetrc-1.3.1\n" - ] - } - ] - }, - { - "cell_type": "markdown", - "source": [ - "## 1.3 Importing necessary libraries" - ], - "metadata": { - "id": "TxfhRi7ySyFY" - } - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "IAAuhYMcEkvP" - }, - "outputs": [], - "source": [ - "import earthaccess # needed to discover and download TEMPO data\n", - "import netCDF4 as nc # needed to read TEMPO data\n", - "\n", - "import os\n", - "import sys\n", - "\n", - "import platform\n", - "from subprocess import Popen\n", - "import shutil\n", - "\n", - "from shapely.geometry import Point, Polygon # needed to search a point within a polygon\n", - "from scipy.interpolate import griddata # needed to interpolate TEMPO data to the point of interest\n", - "\n", - "import requests # needed to search for and download Pandora data\n", - "import codecs # needed to read Pandora data\n", - "import numpy as np\n", - "import h5py # needed to read DSCOVR_EPIC_L2_TO3 files\n", - "import matplotlib.pyplot as plt # needed to plot the resulting time series\n", - "from urllib.request import urlopen, Request # needed to search for and download Pandora data\n", - "from pathlib import Path # needed to check whether a needed data file is already downloaded\n", - "from datetime import datetime, timedelta # needed to work with time in plotting time series" - ] - }, - { - "cell_type": "markdown", - "source": [ - "# 2 Establishing access to EarthData" - ], - "metadata": { - "id": "9FiqnX6XSt-3" - } - }, - { - "cell_type": "markdown", - "source": [ - "## 2.1 Logging in\n", - "\n", - "User needs to create an account at https://www.earthdata.nasa.gov/\n", - "\n", - "Function earthaccess.login prompts for EarthData login and password." - ], - "metadata": { - "id": "LXGbiH5VTbPZ" - } - }, - { - "cell_type": "code", - "source": [ - "auth = earthaccess.login(strategy=\"interactive\", persist=True)" - ], - "metadata": { - "id": "aHZmh8-xYZFe", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "983ab330-3e1b-4b5a-f2c4-2d94618837bf" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Enter your Earthdata Login username: alexrad71\n", - "Enter your Earthdata password: ··········\n", - "Persisting credentials to .netrc\n" - ] - } - ] - }, - { - "cell_type": "markdown", - "source": [ - "## 2.2 Creating local directory" - ], - "metadata": { - "id": "AR7UGlswVGHj" - } - }, - { - "cell_type": "code", - "source": [ - "homeDir = os.path.expanduser(\"~\") + os.sep\n", - "\n", - "with open(homeDir + '.dodsrc', 'w') as file:\n", - " file.write('HTTP.COOKIEJAR={}.urs_cookies\\n'.format(homeDir))\n", - " file.write('HTTP.NETRC={}.netrc'.format(homeDir))\n", - " file.close()\n", - "\n", - "print('Saved .dodsrc to:', homeDir)\n", - "\n", - "# Set appropriate permissions for Linux/macOS\n", - "if platform.system() != \"Windows\":\n", - " Popen('chmod og-rw ~/.netrc', shell=True)\n", - "else:\n", - " # Copy dodsrc to working directory in Windows\n", - " shutil.copy2(homeDir + '.dodsrc', os.getcwd())\n", - " print('Copied .dodsrc to:', os.getcwd())" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "tizBt7IvY0lx", - "outputId": "67b2b9a4-947b-4da8-abd0-387a0e4442d9" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Saved .dodsrc to: /root/\n" - ] - } - ] - }, - { - "cell_type": "markdown", - "source": [ - "# 3 Working with Pandora data" - ], - "metadata": { - "id": "5QaStYVXVmdN" - } - }, - { - "cell_type": "markdown", - "source": [ - "## 3.0 Managing security certificate issue\n", - "\n", - "This step is needed only if there is a security certificate problem with Pandora data web site, http://data.pandonia-global-network.org/. Should be avoided otherwise." - ], - "metadata": { - "id": "Dt3zbZ1VV4Lk" - } - }, - { - "cell_type": "code", - "source": [ - "'''\n", - "Pandora data web site, url = 'http://data.pandonia-global-network.org/',\n", - "currently has its security certificate expired. In order to make this code\n", - "working, urlopen(url) was replaced by urlopen(url,context=context).\n", - "2 lines below are needed to bypass certificate check.\n", - "Once the site certificate is up-to-date,\n", - "these lines can be removed and usual call of urlopen can be restored.\n", - "'''\n", - "import ssl\n", - "context = ssl._create_unverified_context()" - ], - "metadata": { - "id": "peFB-BWSieE1" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "## 3.1 Defining a function gathering the list of available Pandora sites\n", - "\n", - "If there is a security certificate problem with Pandora data web site, http://data.pandonia-global-network.org/, un-comment line\n", - "\n", - "page = urlopen(url,context=context)\n", - "\n", - "and comment out\n", - "\n", - "page = urlopen(url)" - ], - "metadata": { - "id": "lpMSyF-LXm5i" - } - }, - { - "cell_type": "code", - "source": [ - "'''\n", - "function read_pandora_web returns the list of available Pandora sites\n", - "'''\n", - "def read_pandora_web():\n", - " url = 'https://data.pandonia-global-network.org/'\n", - " page = urlopen(url)\n", - "# page = urlopen(url,context=context)\n", - " html_bytes = page.read()\n", - " html = html_bytes.decode(\"utf-8\")\n", - " html_len = len(html)\n", - "\n", - " pos1 = 0\n", - "\n", - " big_line = str(html)\n", - " lines = big_line.split('\\n')\n", - "\n", - " ref_lines = [i for i in lines if 'href' in i]\n", - " refs = []\n", - " for line in ref_lines:\n", - " pos1 = line.find('\"')\n", - " pos2 = line.rfind('\"')\n", - " if pos1 > 0 and pos2 > pos1 and line[pos2-1] =='/' and line[pos1+1] == '.':\n", - " refs.append(line[pos1+3 : pos2-1])\n", - "\n", - " return refs" - ], - "metadata": { - "id": "eFwvdlZWFNnM" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "## 3.2 Defining functions allowing user to choose a Pandora site of interest" - ], - "metadata": { - "id": "vUrk8c6KYe8E" - } - }, - { - "cell_type": "code", - "source": [ - "'''\n", - "function check_site checks whether user entered site is in the list of available Pandora sites\n", - "'''\n", - "def check_site(site_name, refs):\n", - " site_list = []\n", - " for line in refs:\n", - " if site_name in line:\n", - " site_list.append(line)\n", - "\n", - " return site_list\n", - "\n", - "'''\n", - "function take_pandora_sites takes user input and checks whether the site is in the list of available Pandora sites\n", - "'''\n", - "def take_pandora_sites(refs):\n", - " print('please select a Pandora site name from the list')\n", - " for ref in refs:\n", - " print(ref)\n", - "\n", - " answer = 'y'\n", - " while answer == 'y':\n", - " site_name = input('Enter a name of a Pandora site: ')\n", - " print(site_name)\n", - " site_list = check_site(site_name, refs)\n", - " site_num = len(site_list)\n", - " if site_num == 0:\n", - " print('site ', site_name, 'was not found')\n", - " continue\n", - "\n", - " if site_num > 1:\n", - " print('there are ', site_num, ' site names, select one from')\n", - " for site in site_list: print(site)\n", - "\n", - " site_name = input('Enter an exact name of a Pandora site: ')\n", - " if site_list.count(site_name) != 1:\n", - " print('Entered name is not the exact match of one of the following sites')\n", - " for site in site_list: print(site)\n", - " print('program terminated')\n", - " sys.exit()\n", - "\n", - " for site in site_list:\n", - " if site == site_name:\n", - " pandora_site = site_name\n", - " print('site ', site_name, 'was found and added to the list of sites ')\n", - " break\n", - "\n", - " if site_num == 1:\n", - " pandora_site = site_list[0]\n", - " print('site ', site_list[0], 'was found and added to the list of sites ')\n", - "\n", - " answer = 'n'\n", - "\n", - " return pandora_site" - ], - "metadata": { - "id": "HddB1cMqFv_u" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "## 3.3 Defining a function creating the list links to O3 data files at the selected Pandora sites\n", - "\n", - "Pandora site may have several instruments. In this case each instrument has its own directory. However, the most recent version of the NO2 data, rnvs3p1-8, is available only in one of these directories. The function creates all possible links, but some of them may be non-existing. This is chacked and cleared later.\n", - "\n", - "If there is a security certificate problem with Pandora data web site, http://data.pandonia-global-network.org/, un-comment line\n", - "\n", - "page = urlopen(url,context=context)\n", - "\n", - "and comment out\n", - "\n", - "page = urlopen(url)" - ], - "metadata": { - "id": "T95P34fTZN1S" - } - }, - { - "cell_type": "code", - "source": [ - "'''\n", - "function instrument_path returns links to available Pandora O3 retrievals files\n", - "'''\n", - "def instrument_path(site):\n", - " url = 'https://data.pandonia-global-network.org/' + site + '/'\n", - " page = urlopen(url)\n", - "# page = urlopen(url,context=context)\n", - " html_bytes = page.read()\n", - " html = html_bytes.decode(\"utf-8\")\n", - " html_len = len(html)\n", - "\n", - " pos1 = 0\n", - " big_line = str(html)\n", - " lines = big_line.split('\\n')\n", - "\n", - " ref_lines = [i for i in lines if 'href' in i]\n", - " links = []\n", - " for line in ref_lines:\n", - "\n", - " pos1 = line.find('\"')\n", - " pos2 = line.rfind('\"')\n", - " if pos1 > 0 and pos2 > pos1 and line[pos2-1] =='/' and\\\n", - " line[pos1+3 : pos1 + 10] == 'Pandora':\n", - " link = url + line[pos1+3 : pos2] + 'L2/' + line[pos1+3 : pos2-1] + '_' + site + '_L2_rout2p1-8.txt'\n", - " print(link)\n", - " links.append(link)\n", - "\n", - " return links" - ], - "metadata": { - "id": "fMzfud_8HdDf" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "## 3.4 Defining functions downloading Pandora data file with given url\n", - "\n", - "If there is a security certificate problem with Pandora data web site, http://data.pandonia-global-network.org/, un-comment line\n", - "\n", - "response = requests.get(url, verify=False)\n", - "\n", - "and comment out\n", - "\n", - "page = response = requests.get(url)" - ], - "metadata": { - "id": "KjgZatRzatr6" - } - }, - { - "cell_type": "code", - "source": [ - "'''\n", - "function download downloads file with given url\n", - "'''\n", - "def download(url):\n", - " response = requests.get(url)\n", - "# response = requests.get(url, verify=False)\n", - " response_code = response.status_code\n", - "\n", - " file_name = url.split('/')[-1]\n", - "\n", - " if response_code == 200:\n", - " content = response.content\n", - " data_path = Path(file_name)\n", - " data_path.write_bytes(content)\n", - "\n", - " return file_name, response_code" - ], - "metadata": { - "id": "y0X0IsLEM-SB" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "## 3.5 Defining functions converting Pandora timestamp into a set of year, month, day, hour, minute, and second" - ], - "metadata": { - "id": "rlz83ZGabWP9" - } - }, - { - "cell_type": "code", - "source": [ - "'''\n", - "function read_timestamp converts Pandora timestamp of the format\n", - "'yyyymmddThhmmssZ' into a set of 6 numbers:\n", - "integer year, month, day, hour, minute, and real second.\n", - "'''\n", - "def read_timestamp(timestamp):\n", - "\n", - " yyyy = int(timestamp[0:4])\n", - " mm = int(timestamp[4:6])\n", - " dd = int(timestamp[6:8])\n", - " hh = int(timestamp[9:11])\n", - " mn = int(timestamp[11:13])\n", - " ss = float(timestamp[13:17])\n", - "\n", - " return yyyy, mm, dd, hh, mn, ss" - ], - "metadata": { - "id": "jfV_yV_iOOnJ" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "## 3.6 Defining function reading Pandora O3 data file rout2p1-8" - ], - "metadata": { - "id": "QIuXfcvScCy3" - } - }, - { - "cell_type": "code", - "source": [ - "'''\n", - "function read_Pandora_O3_rout2p1_8 reads Pandora total NO2 column data files\n", - "ending with rout2p1-8.\n", - "\n", - "Arguments:\n", - "fname - name file to be read, string;\n", - "start_date - beginning of the time interval of interest,\n", - " integer of the form YYYYMMDD;\n", - "end_date - end of the time interval of interest,\n", - " integer of the form YYYYMMDD.\n", - "\n", - "if start_date is greater than end_date, the function returns a numpy array\n", - "with shape (0, 8), otherwise it returns an 8-column numpy array\n", - "with with columns being year, month, day, hour, minute, second of observation\n", - "and retrieved total O3 column along with its total uncertainty.\n", - "\n", - "O3 column and its uncertainties are in mol/m^2, so conversion to Dobson Units is\n", - "performed by multiplication by DU_conversion = 1./4.4615E-04\n", - "\n", - "'''\n", - "def read_Pandora_O3_rout2p1_8(fname, start_date, end_date):\n", - "\n", - " DU_conversion = 1./4.4615E-04\n", - "\n", - "\n", - " data = np.empty([0, 8])\n", - " if start_date > end_date: return -999., -999., data\n", - "\n", - " with codecs.open(fname, 'r', encoding='utf-8', errors='ignore') as f:\n", - "\n", - " while True:\n", - "# Get next line from file\n", - " line = f.readline()\n", - "\n", - " if line.find('Short location name:') >= 0:\n", - " loc_name = line.split()[-1] # location name, to be used in the output file name\n", - " print('location name ', loc_name)\n", - "\n", - " if line.find('Location latitude [deg]:') >= 0:\n", - " lat = float(line.split()[-1]) # location latitude\n", - " print('location latitude ', lat)\n", - "\n", - " if line.find('Location longitude [deg]:') >= 0:\n", - " lon = float(line.split()[-1]) # location longitude\n", - " print('location longitude ', lon)\n", - "\n", - " if line.find('--------') >= 0: break\n", - "\n", - " while True:\n", - "# Get next line from file\n", - " line = f.readline()\n", - "\n", - " if line.find('--------') >= 0: break\n", - "\n", - " while True:\n", - "# now reading line with data\n", - " line = f.readline()\n", - "\n", - " if not line: break\n", - "\n", - " line_split = line.split()\n", - "\n", - " yyyy, mm, dd, hh, mn, ss = read_timestamp(line_split[0])\n", - " date_stamp = yyyy*10000 + mm*100 + dd\n", - " if date_stamp < start_date or date_stamp > end_date: continue\n", - "\n", - " column = float(line_split[38]) # Ozone total vertical column amount [moles per square meter]\n", - " if column < 0.: continue\n", - "\n", - "# column_unc = float(line_split[42]) # Total uncertainty of ozone total vertical column amount [moles per square meter]\n", - "# if column_unc < 0.: continue\n", - "\n", - " column_unc = float(line_split[43]) # rms-based uncertainty of ozone total vertical column amount [moles per square meter]\n", - " if column_unc < 0.: continue\n", - "\n", - " data_line = np.array([yyyy, mm, dd, hh, mn, ss\\\n", - " , column*DU_conversion, column_unc*DU_conversion])\n", - " data = np.append(data, [data_line], axis = 0)\n", - "\n", - " return lat, lon, loc_name, data" - ], - "metadata": { - "id": "7R72M8dVO2s2" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "## 3.7 Discovering existing Pandora stations and selecting one of them" - ], - "metadata": { - "id": "NN7_YcCackvI" - } - }, - { - "cell_type": "code", - "source": [ - "# Discovering available Pandora site.\n", - "# Please bear in mind that some sites do not have O3 data files\n", - "print('gathering Pandora sites information')\n", - "refs = read_pandora_web()\n", - "\n", - "pandora_site = take_pandora_sites(refs) # create list of Pandora sites of interest\n", - "print('the following sites were selected')\n", - "print(pandora_site)\n", - "print('from the list of existing Pandora sites')\n", - "\n", - "# create a list of !AVAILABLE! Pandora files for the Pandora site\n", - "pandora_files = []\n", - "\n", - "links = instrument_path(pandora_site)\n", - "\n", - "npfiles = 0\n", - "\n", - "for link in links:\n", - " pandora_fname = link.split('/')[-1]\n", - "\n", - "# check if file exists in the local directory, if not download from Pandora site\n", - " if not os.path.exists(pandora_fname):\n", - " print(pandora_fname,' does not exit in local directory, downloading from the web')\n", - " print(link)\n", - "\n", - " pandora_fname, response_code = download(link)\n", - "\n", - " if response_code == 200:\n", - " print('Pandora L2 file ', pandora_fname, ' has been downloaded')\n", - " npfiles = npfiles + 1\n", - " pandora_files.append(pandora_fname)\n", - " else:\n", - " print('Pandora L2 file ', link, ' does not exist')\n", - "\n", - " else:\n", - " print(pandora_fname,' exits in local directory')\n", - " npfiles = npfiles + 1\n", - " pandora_files.append(pandora_fname)\n", - "\n", - "if npfiles == 0: # no files were found, STOP here\n", - " print('no files were found for Pandora site ', pandora_site, 'program terminated')\n", - " sys.exit()\n", - "if npfiles > 1: # normally there should be only one file per site. if there are more - STOP\n", - " print('there are too many files for site ', pandora_site, '- STOP and investigate file names below. Program terminated')\n", - " for pandora_fname in pandora_files:\n", - " print(pandora_fname)\n", - " sys.exit()" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "G-VGNGOtzqBY", - "outputId": "cea5c2fe-760f-4a8d-ffa6-2bbb42f72c2b" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "gathering Pandora sites information\n", - "please select a Pandora site name from the list\n", - "Agam\n", - "AldineTX\n", - "AliceSprings\n", - "Altzomoni\n", - "ArlingtonTX\n", - "Athens-NOA\n", - "AtlantaGA-SouthDeKalb\n", - "AtlantaGA\n", - "Bandung\n", - "Bangkok\n", - "Banting\n", - "BayonneNJ\n", - "Beijing-RADI\n", - "BeltsvilleMD\n", - "Berlin\n", - "BlueHillMA\n", - "BostonMA\n", - "BoulderCO-NCAR\n", - "BoulderCO\n", - "Bremen\n", - "BristolPA\n", - "BronxNY\n", - "Brussels-Uccle\n", - "Bucharest\n", - "BuenosAires\n", - "BuffaloNY\n", - "Busan\n", - "Cabauw\n", - "CambridgeMA\n", - "CapeElizabethME\n", - "ChapelHillNC\n", - "CharlesCityVA\n", - "ChicagoIL\n", - "ClearLakeShoresTX\n", - "Cologne\n", - "ComodoroRivadavia\n", - "Cordoba\n", - "Dalanzadgad\n", - "Davos\n", - "DearbornMI\n", - "Dhaka\n", - "Downsview\n", - "EastProvidenceRI\n", - "EdwardsCA\n", - "Egbert\n", - "Eureka-PEARL\n", - "FairbanksAK\n", - "Fajardo\n", - "FortMcKay\n", - "Fukuoka\n", - "Granada\n", - "GreenbeltMD\n", - "HamptonVA-HU\n", - "HamptonVA\n", - "Helsinki\n", - "HoustonTX\n", - "HuntsvilleAL\n", - "Incheon-ESC\n", - "Innsbruck\n", - "Islamabad-NUST\n", - "Izana\n", - "Juelich\n", - "KenoshaWI\n", - "Kobe\n", - "LaPorteTX\n", - "Lindenberg\n", - "LondonderryNH\n", - "LynnMA\n", - "MadisonCT\n", - "ManhattanKS\n", - "ManhattanNY-CCNY\n", - "MaunaLoaHI\n", - "MexicoCity-UNAM\n", - "MexicoCity-Vallejo\n", - "MountainViewCA\n", - "Nagoya\n", - "NewBrunswickNJ\n", - "NewHavenCT\n", - "NyAlesund\n", - "OldFieldNY\n", - "Palau\n", - "PhiladelphiaPA\n", - "PittsburghPA\n", - "Pontianak\n", - "Potchefstroom-METSI\n", - "QueensNY\n", - "RichmondCA\n", - "Rome-IIA\n", - "Rome-ISAC\n", - "Rome-SAP\n", - "SaltLakeCityUT-Hawthorne\n", - "SaltLakeCityUT\n", - "SanJoseCA\n", - "Sapporo\n", - "Seosan\n", - "Seoul-SNU\n", - "Seoul\n", - "Singapore-NUS\n", - "SouthJordanUT\n", - "StGeorge\n", - "StonyPlain\n", - "SWDetroitMI\n", - "Tel-Aviv\n", - "Thessaloniki\n", - "Tokyo-TMU\n", - "Toronto-Scarborough\n", - "Toronto-West\n", - "Trollhaugen\n", - "Tsukuba-NIES-West\n", - "Tsukuba-NIES\n", - "Tsukuba\n", - "TurlockCA\n", - "Ulaanbaatar\n", - "Ulsan\n", - "WacoTX\n", - "Wakkerstroom\n", - "WallopsIslandVA\n", - "WashingtonDC\n", - "WestportCT\n", - "WhittierCA\n", - "Windsor-West\n", - "WrightwoodCA\n", - "Yokosuka\n", - "Enter a name of a Pandora site: Bold\n", - "Bold\n", - "site Bold was not found\n", - "Enter a name of a Pandora site: BoulderCO\n", - "BoulderCO\n", - "there are 2 site names, select one from\n", - "BoulderCO-NCAR\n", - "BoulderCO\n", - "Enter an exact name of a Pandora site: BoulderCO\n", - "site BoulderCO was found and added to the list of sites \n", - "the following sites were selected\n", - "BoulderCO\n", - "from the list of existing Pandora sites\n", - "https://data.pandonia-global-network.org/BoulderCO/Pandora34s1/L2/Pandora34s1_BoulderCO_L2_rout2p1-8.txt\n", - "https://data.pandonia-global-network.org/BoulderCO/Pandora57s1/L2/Pandora57s1_BoulderCO_L2_rout2p1-8.txt\n", - "Pandora34s1_BoulderCO_L2_rout2p1-8.txt does not exit in local directory, downloading from the web\n", - "https://data.pandonia-global-network.org/BoulderCO/Pandora34s1/L2/Pandora34s1_BoulderCO_L2_rout2p1-8.txt\n", - "Pandora L2 file https://data.pandonia-global-network.org/BoulderCO/Pandora34s1/L2/Pandora34s1_BoulderCO_L2_rout2p1-8.txt does not exist\n", - "Pandora57s1_BoulderCO_L2_rout2p1-8.txt does not exit in local directory, downloading from the web\n", - "https://data.pandonia-global-network.org/BoulderCO/Pandora57s1/L2/Pandora57s1_BoulderCO_L2_rout2p1-8.txt\n", - "Pandora L2 file Pandora57s1_BoulderCO_L2_rout2p1-8.txt has been downloaded\n" - ] - } - ] - }, - { - "cell_type": "markdown", - "source": [ - "## 3.8 Selecting timeframe of interest\n", - "\n", - "It is going to be common for both instruments" - ], - "metadata": { - "id": "4vYb5skDdNvg" - } - }, - { - "cell_type": "code", - "source": [ - "print('enter period of interest, start and end dates, in the form YYYYMMDD')\n", - "datestamp_ini = input('enter start date of interest ')\n", - "datestamp_fin = input('enter end date of interest ')\n", - "\n", - "start_date = int(datestamp_ini)\n", - "end_date = int(datestamp_fin)\n", - "\n", - "yyyy_ini = start_date//10000\n", - "mm_ini = (start_date//100 - yyyy_ini*100)\n", - "dd_ini = (start_date - yyyy_ini*10000 - mm_ini*100)\n", - "\n", - "yyyy_fin = end_date//10000\n", - "mm_fin = (end_date//100 - yyyy_fin*100)\n", - "dd_fin = (end_date - yyyy_fin*10000 - mm_fin*100)\n", - "print(yyyy_ini, mm_ini, dd_ini, yyyy_fin, mm_fin, dd_fin)\n", - "\n", - "date_start = str('%4.4i-%2.2i-%2.2i 00:00:00' %(yyyy_ini, mm_ini, dd_ini))\n", - "date_end = str('%4.4i-%2.2i-%2.2i 23:59:59' %(yyyy_fin, mm_fin, dd_fin))" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "R7G6LBj6z9Mi", - "outputId": "58abd2b9-e23e-4b65-a522-2a03fe82f27b" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "enter period of interest, start and end dates, in the form YYYYMMDD\n", - "enter start date of interest 20231103\n", - "enter end date of interest 20231103\n", - "2023 11 3 2023 11 3\n" - ] - } - ] - }, - { - "cell_type": "markdown", - "source": [ - "## 3.9 Reading Pandora file within selected timeframe and create point of interest" - ], - "metadata": { - "id": "mTFV2Fkadj8e" - } - }, - { - "cell_type": "code", - "source": [ - "pandora_file = pandora_files[0]\n", - "lat, lon, POI_name, Pandora_data = read_Pandora_O3_rout2p1_8(pandora_file, start_date, end_date)\n", - "\n", - "if lat == -999.:\n", - " print('error reading pandora file ', pandora_file, 'program terminated')\n", - " sys.exit()\n", - "\n", - "POI = np.array([lat, lon])" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "Rzmdn7JqxFBg", - "outputId": "bafc34a9-de25-4c1f-97bf-aa6c426c929c" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "location name BoulderCO\n", - "location latitude 39.99\n", - "location longitude -105.26\n" - ] - } - ] - }, - { - "cell_type": "code", - "source": [ - "print(Pandora_data)" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "xzHznem2b_Nn", - "outputId": "b8b0b80e-8c1c-4e12-b412-e8fb1edd3995" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "[[2.02300000e+03 1.10000000e+01 3.00000000e+00 1.40000000e+01\n", - " 3.80000000e+01 5.75000000e+01 2.63745377e+02 3.70077328e+01]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.40000000e+01\n", - " 4.40000000e+01 1.18000000e+01 2.67914379e+02 5.32668385e+01]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.40000000e+01\n", - " 4.80000000e+01 3.73000000e+01 2.67824723e+02 2.42183122e+01]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.40000000e+01\n", - " 5.30000000e+01 5.90000000e+01 2.68407486e+02 1.89369046e+01]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.50000000e+01\n", - " 3.00000000e+00 3.38000000e+01 2.68945422e+02 1.32603385e+01]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.50000000e+01\n", - " 1.30000000e+01 3.20000000e+00 2.68429900e+02 9.68979043e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.50000000e+01\n", - " 1.90000000e+01 3.18000000e+01 2.69236804e+02 9.41589152e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.50000000e+01\n", - " 3.40000000e+01 4.66000000e+01 2.72576488e+02 6.84769696e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.50000000e+01\n", - " 3.80000000e+01 5.90000000e+01 2.71567858e+02 7.04606074e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.50000000e+01\n", - " 4.40000000e+01 7.80000000e+00 2.71119579e+02 6.37834809e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.50000000e+01\n", - " 4.90000000e+01 1.76000000e+01 2.71881654e+02 6.34517539e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.50000000e+01\n", - " 5.90000000e+01 6.50000000e+00 2.73742015e+02 4.97500841e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.60000000e+01\n", - " 6.00000000e+00 5.01000000e+01 2.74481677e+02 6.16877732e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.60000000e+01\n", - " 1.20000000e+01 2.94000000e+01 2.74728230e+02 5.76913594e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.60000000e+01\n", - " 2.20000000e+01 5.60000000e+00 2.72419590e+02 5.74448056e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.60000000e+01\n", - " 2.20000000e+01 3.31000000e+01 2.72038552e+02 5.71310098e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.60000000e+01\n", - " 2.70000000e+01 1.16000000e+01 2.71545444e+02 5.63644514e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.60000000e+01\n", - " 2.70000000e+01 3.91000000e+01 2.71455788e+02 5.67432478e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.60000000e+01\n", - " 3.20000000e+01 1.29000000e+01 2.73069595e+02 5.82001569e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.60000000e+01\n", - " 3.20000000e+01 4.04000000e+01 2.73742015e+02 5.77339460e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.60000000e+01\n", - " 3.70000000e+01 1.86000000e+01 2.74078225e+02 5.70144570e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.60000000e+01\n", - " 3.70000000e+01 4.61000000e+01 2.73719601e+02 5.68732489e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.60000000e+01\n", - " 4.20000000e+01 2.32000000e+01 2.73719601e+02 5.82427435e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.60000000e+01\n", - " 4.20000000e+01 5.06000000e+01 2.73360977e+02 5.79379133e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.60000000e+01\n", - " 4.70000000e+01 2.92000000e+01 2.73898913e+02 5.68710075e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.60000000e+01\n", - " 4.70000000e+01 5.67000000e+01 2.73562703e+02 5.69718704e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.60000000e+01\n", - " 5.20000000e+01 3.42000000e+01 2.73697187e+02 5.74246330e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.60000000e+01\n", - " 5.30000000e+01 1.70000000e+00 2.73517875e+02 5.74896335e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.60000000e+01\n", - " 5.70000000e+01 4.01000000e+01 2.73876499e+02 5.69427323e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.60000000e+01\n", - " 5.80000000e+01 7.60000000e+00 2.73943741e+02 5.71198028e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.70000000e+01\n", - " 7.00000000e+00 5.03000000e+01 2.74750644e+02 5.77339460e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.70000000e+01\n", - " 8.00000000e+00 1.78000000e+01 2.74593746e+02 5.80365348e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.70000000e+01\n", - " 1.60000000e+01 5.84000000e+01 2.74414435e+02 5.82180881e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.70000000e+01\n", - " 1.70000000e+01 2.59000000e+01 2.74504091e+02 5.83368822e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.70000000e+01\n", - " 2.30000000e+01 2.71000000e+01 2.74324779e+02 5.84220554e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.70000000e+01\n", - " 2.30000000e+01 5.46000000e+01 2.74347193e+02 5.79222235e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.70000000e+01\n", - " 2.80000000e+01 3.32000000e+01 2.73943741e+02 5.84041242e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.70000000e+01\n", - " 2.90000000e+01 7.00000000e-01 2.73809257e+02 5.84489521e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.70000000e+01\n", - " 3.30000000e+01 3.88000000e+01 2.73742015e+02 5.85363667e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.70000000e+01\n", - " 3.40000000e+01 6.20000000e+00 2.73854085e+02 5.85117113e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.70000000e+01\n", - " 3.80000000e+01 4.55000000e+01 2.73338563e+02 5.83525720e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.70000000e+01\n", - " 3.90000000e+01 1.29000000e+01 2.73652359e+02 5.84803317e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.70000000e+01\n", - " 4.30000000e+01 5.08000000e+01 2.74347193e+02 5.83839516e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.70000000e+01\n", - " 4.40000000e+01 1.82000000e+01 2.74571333e+02 5.86394710e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.70000000e+01\n", - " 4.80000000e+01 5.69000000e+01 2.74235123e+02 5.88479211e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.70000000e+01\n", - " 4.90000000e+01 2.43000000e+01 2.74638574e+02 5.90810266e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.70000000e+01\n", - " 5.40000000e+01 2.80000000e+00 2.74817886e+02 5.88636109e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.70000000e+01\n", - " 5.40000000e+01 3.02000000e+01 2.75064440e+02 5.85901603e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.80000000e+01\n", - " 5.70000000e+01 8.80000000e+00 2.74974784e+02 5.95763757e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.80000000e+01\n", - " 5.70000000e+01 3.62000000e+01 2.74974784e+02 5.97758601e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.90000000e+01\n", - " 2.00000000e+00 1.34000000e+01 2.76297209e+02 5.94284433e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.90000000e+01\n", - " 2.00000000e+00 4.09000000e+01 2.76476521e+02 5.95315477e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.90000000e+01\n", - " 7.00000000e+00 1.75000000e+01 2.75355822e+02 5.97489634e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.90000000e+01\n", - " 7.00000000e+00 4.49000000e+01 2.75602376e+02 5.96682730e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.90000000e+01\n", - " 1.20000000e+01 2.32000000e+01 2.75916172e+02 5.91191303e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.90000000e+01\n", - " 1.20000000e+01 5.06000000e+01 2.75938586e+02 5.89017147e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.90000000e+01\n", - " 1.70000000e+01 3.89000000e+01 2.77350667e+02 5.93768912e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.90000000e+01\n", - " 2.20000000e+01 3.33000000e+01 2.77126527e+02 5.96189622e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.90000000e+01\n", - " 2.30000000e+01 7.00000000e-01 2.77261011e+02 5.87470582e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.90000000e+01\n", - " 2.70000000e+01 3.82000000e+01 2.77709291e+02 5.95337891e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.90000000e+01\n", - " 2.80000000e+01 5.60000000e+00 2.78202398e+02 5.96234450e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.90000000e+01\n", - " 3.20000000e+01 4.47000000e+01 2.78785162e+02 5.95068923e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.90000000e+01\n", - " 3.30000000e+01 1.22000000e+01 2.78247226e+02 5.91034405e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.90000000e+01\n", - " 4.20000000e+01 5.85000000e+01 2.78448952e+02 5.89263701e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.90000000e+01\n", - " 4.30000000e+01 2.59000000e+01 2.77933430e+02 5.94486159e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.90000000e+01\n", - " 5.20000000e+01 2.00000000e+01 2.79211028e+02 5.83211924e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.90000000e+01\n", - " 5.80000000e+01 3.68000000e+01 2.78404124e+02 5.81867085e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 1.90000000e+01\n", - " 5.90000000e+01 4.20000000e+00 2.78448952e+02 5.81329149e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 2.00000000e+01\n", - " 3.00000000e+00 4.37000000e+01 2.78897232e+02 5.83346408e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 2.00000000e+01\n", - " 4.00000000e+00 1.11000000e+01 2.79031716e+02 5.81418805e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 2.00000000e+01\n", - " 8.00000000e+00 4.93000000e+01 2.78314468e+02 5.81306735e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 2.00000000e+01\n", - " 9.00000000e+00 1.68000000e+01 2.78157570e+02 5.78168777e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 2.00000000e+01\n", - " 1.30000000e+01 5.72000000e+01 2.79726549e+02 5.78482573e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 2.00000000e+01\n", - " 1.40000000e+01 2.46000000e+01 2.79569651e+02 5.79065337e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 2.00000000e+01\n", - " 1.90000000e+01 3.90000000e+00 2.80085173e+02 5.85565393e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 2.00000000e+01\n", - " 1.90000000e+01 3.14000000e+01 2.80443797e+02 5.89756808e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 2.00000000e+01\n", - " 2.40000000e+01 1.11000000e+01 2.81340356e+02 5.88232657e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 2.00000000e+01\n", - " 2.40000000e+01 3.86000000e+01 2.81542082e+02 5.90003362e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 2.00000000e+01\n", - " 2.90000000e+01 1.81000000e+01 2.80690351e+02 5.78056707e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 2.00000000e+01\n", - " 2.90000000e+01 4.55000000e+01 2.80780007e+02 5.80589488e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 2.00000000e+01\n", - " 3.40000000e+01 2.58000000e+01 2.80802421e+02 5.93320632e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 2.00000000e+01\n", - " 3.40000000e+01 5.33000000e+01 2.81026561e+02 5.97534462e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 2.00000000e+01\n", - " 4.40000000e+01 4.04000000e+01 2.79211028e+02 5.88905077e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 2.00000000e+01\n", - " 4.50000000e+01 7.90000000e+00 2.79636893e+02 5.85139527e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 2.00000000e+01\n", - " 5.30000000e+01 5.45000000e+01 2.78986888e+02 5.73125630e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 2.00000000e+01\n", - " 5.40000000e+01 2.19000000e+01 2.79098958e+02 5.80275692e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 2.10000000e+01\n", - " 0.00000000e+00 1.59000000e+01 2.77081699e+02 6.35705480e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 2.10000000e+01\n", - " 4.00000000e+00 3.59000000e+01 2.78247226e+02 5.78370503e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 2.10000000e+01\n", - " 8.00000000e+00 4.60000000e+01 2.78000672e+02 5.94620643e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 2.10000000e+01\n", - " 2.90000000e+01 1.58000000e+01 2.81183458e+02 1.52547350e+01]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 2.10000000e+01\n", - " 3.90000000e+01 1.98000000e+01 2.77574807e+02 6.34674437e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 2.10000000e+01\n", - " 4.80000000e+01 2.02000000e+01 2.76745489e+02 7.15275132e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 2.10000000e+01\n", - " 5.30000000e+01 2.30000000e+01 2.75714446e+02 7.89599910e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 2.10000000e+01\n", - " 5.80000000e+01 3.74000000e+01 2.76274795e+02 8.29048526e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 2.20000000e+01\n", - " 3.00000000e+00 4.60000000e+01 2.75714446e+02 9.02140536e+00]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 2.20000000e+01\n", - " 2.10000000e+01 1.10000000e+01 2.77821361e+02 1.37408943e+01]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 2.20000000e+01\n", - " 2.60000000e+01 2.54000000e+01 2.78583436e+02 1.63245545e+01]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 2.20000000e+01\n", - " 3.10000000e+01 3.44000000e+01 2.79054130e+02 2.03581755e+01]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 2.20000000e+01\n", - " 3.60000000e+01 5.26000000e+01 2.80757593e+02 2.82080018e+01]\n", - " [2.02300000e+03 1.10000000e+01 3.00000000e+00 2.20000000e+01\n", - " 4.70000000e+01 1.19000000e+01 2.80331727e+02 4.33710635e+01]]\n" - ] - } - ] - }, - { - "cell_type": "markdown", - "source": [ - "#4 Working with DSCOVR data" - ], - "metadata": { - "id": "VGfpNlrWei36" - } - }, - { - "cell_type": "markdown", - "source": [ - "## 4.1 Searching DSCOVR data files within 0.5 degree range around the POI (position of the Pandora station)" - ], - "metadata": { - "id": "enVNDMCMH7hL" - } - }, - { - "cell_type": "code", - "source": [ - "short_name = 'DSCOVR_EPIC_L2_TO3' # collection name to search for in the EarthData\n", - "\n", - "POI_lat = POI[0]\n", - "POI_lon = POI[1]\n", - "\n", - "bbox = (POI_lon - 0.5, POI_lat - 0.5, POI_lon + 0.5, POI_lat + 0.5)\n", - "POI_results_EPIC = earthaccess.search_data(short_name = short_name,\n", - " temporal = (date_start, date_end),\n", - " bounding_box = bbox)\n", - "\n", - "print('total number of DSCOVR EPIC L2_TO3 granules found for POI', POI_name, \\\n", - " '\\nwithin period of interes between', date_start, 'and', date_end, \\\n", - " '\\nis', len(POI_results_EPIC))" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "RI_1YDVQILr7", - "outputId": "2a84672d-78fe-4da6-e353-8034d0eb212a" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Granules found: 0\n", - "total number of DSCOVR EPIC L2_TO3 granules found for POI BoulderCO \n", - "within period of interes between 2023-10-30 00:00:00 and 2023-10-30 23:59:59 \n", - "is 0\n" - ] - } - ] - }, - { - "cell_type": "code", - "source": [ - "granule_links_EPIC = []\n", - "for result in POI_results_EPIC: granule_links_EPIC.append(result['umm']['RelatedUrls'][0]['URL'])\n", - "\n", - "for granule_link in granule_links_EPIC: print(granule_link)" - ], - "metadata": { - "id": "BCOUcfopKT7C" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "### 4.1.0 Searching DSCOVR data files without bounding box\n", - "\n", - "It appears that as of now, January 19, 2024, earthaccess returns incorrect granules for DSCOVR product covering anti-meridian. For this reason, all available granules should be grabbed using earthaccess function search_data without bounding box. Granules that do not contain the point of interest will be processed, but the code below, in section 4.5 will handle them correctly without generating either errors or fill value outcome." - ], - "metadata": { - "id": "xJDJB6IxA9Df" - } - }, - { - "cell_type": "code", - "source": [ - "short_name = 'DSCOVR_EPIC_L2_TO3' # collection name to search for in the EarthData\n", - "\n", - "POI_results_EPIC = earthaccess.search_data(short_name = short_name,\n", - " temporal = (date_start, date_end))\n", - "\n", - "print('total number of DSCOVR EPIC L2_TO3 granules found for POI', POI_name, \\\n", - " '\\nwithin period of interes between', date_start, 'and', date_end, \\\n", - " '\\nis', len(POI_results_EPIC))" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "9f2be7d6-63b2-490f-9332-059f1e05616a", - "id": "EmD1Xyvi_5Ed" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Granules found: 0\n", - "total number of DSCOVR EPIC L2_TO3 granules found for POI BoulderCO \n", - "within period of interes between 2023-11-03 00:00:00 and 2023-11-03 23:59:59 \n", - "is 0\n" - ] - } - ] - }, - { - "cell_type": "markdown", - "source": [ - "##4.1.1 Print links to the available data files" - ], - "metadata": { - "id": "IalXP1OU1EuI" - } - }, - { - "cell_type": "code", - "source": [ - "granule_links_EPIC = []\n", - "for result in POI_results_EPIC: granule_links_EPIC.append(result['umm']['RelatedUrls'][0]['URL'])\n", - "\n", - "for granule_link in granule_links_EPIC: print(granule_link)" - ], - "metadata": { - "id": "Jsr5Jj2Fpldc" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "downloaded_files = earthaccess.download(\n", - " POI_results_EPIC,\n", - " local_path='.',)" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 356 - }, - "id": "4LBi2fo4owJw", - "outputId": "b3e0903a-be0c-4d64-cb81-d837d4ed49a6" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "error", - "ename": "ValueError", - "evalue": "List of URLs or DataGranule isntances expected", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m downloaded_files = earthaccess.download(\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mPOI_results_EPIC\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m local_path='.',)\n", - "\u001b[0;32m/usr/local/lib/python3.10/dist-packages/earthaccess/api.py\u001b[0m in \u001b[0;36mdownload\u001b[0;34m(granules, local_path, provider, threads)\u001b[0m\n\u001b[1;32m 193\u001b[0m \u001b[0mgranules\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mgranules\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 194\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 195\u001b[0;31m \u001b[0mresults\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mearthaccess\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__store__\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgranules\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlocal_path\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mprovider\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mthreads\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 196\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mAttributeError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0merr\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 197\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0merr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/usr/local/lib/python3.10/dist-packages/earthaccess/store.py\u001b[0m in \u001b[0;36mget\u001b[0;34m(self, granules, local_path, provider, threads)\u001b[0m\n\u001b[1;32m 468\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mfiles\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 469\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 470\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mValueError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"List of URLs or DataGranule isntances expected\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 471\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 472\u001b[0m \u001b[0;34m@\u001b[0m\u001b[0msingledispatchmethod\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mValueError\u001b[0m: List of URLs or DataGranule isntances expected" - ] - } - ] - }, - { - "cell_type": "code", - "source": [ - "cnt = 0\n", - "for granule_link_EPIC in granule_links_EPIC:\n", - " EPIC_fname = granule_link.split('/')[-1]\n", - "\n", - "# check if file exists in the local directory, if not download from Pandora site\n", - " if not os.path.exists(EPIC_fname):\n", - " print(EPIC_fname, 'does not exist in local directory')\n", - " cnt += 1\n", - "\n", - "print(cnt)" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "fcMlIvtY5Ybb", - "outputId": "656045ef-2b53-4029-caa4-d44305364a2e" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "0\n" - ] - } - ] - }, - { - "cell_type": "markdown", - "source": [ - "##4.2 Define function reading DSCOVR_EPIC_L2_TO3" - ], - "metadata": { - "id": "xyjpjo9Y23vH" - } - }, - { - "cell_type": "markdown", - "source": [ - "###4.2.1 Define function reading DSCOVR_EPIC_L2_TO3\n", - "\n", - "This is the older version, it does NOT read time variable. In order to retrieve time,timestamp from the file name needs to be processed." - ], - "metadata": { - "id": "6SR6UroZ1buf" - } - }, - { - "cell_type": "code", - "source": [ - "def read_epic_l2_to3(fname):\n", - "# function read_epic_l2_aer reads DSCOVR_EPIC_L2_TO3 product file given by its fname\n", - "# and returns arrays of wavelengths, 2D latitudes and longitudes, and total O3 column along with their fill values.\n", - "\n", - " try:\n", - " f = h5py.File(fname, \"r\" )\n", - " except:\n", - " print(\"Unable to find or read hdf5 input granule file \", fname)\n", - " return 0., 0., 0., 0., 0.\n", - "\n", - " try:\n", - " item = f['Latitude']\n", - " lat2D = item[:]\n", - "# fv_geo = item.fillvalue\n", - " fv_geo = lat2D[0, 0]\n", - " except:\n", - " print(\"Unable to find or read hdf5 input granule file \", fname)\n", - " return 0., 0., 0., 0., 0.\n", - "\n", - " try:\n", - " item = f['Longitude']\n", - " lon2D = item[:]\n", - " except:\n", - " print(\"Unable to find or read hdf5 input granule file \", fname)\n", - " return 0., 0., 0., 0., 0.\n", - "\n", - " try:\n", - " item = f['Ozone']\n", - " o3_2D = item[:]\n", - "# commented out line below is the general way to read the fill value\n", - "# however, attribute '_FillValue' is not set for any array in the current version of the product\n", - "# at the same time, arrays do have apparent fill values that can be seen in the\n", - "# corners of the image\n", - "# fv_o3 = item.fillvalue\n", - " fv_o3 = o3_2D[0, 0]\n", - " except:\n", - " print(\"Unable to find or read hdf5 input granule file \", fname)\n", - " return 0., 0., 0., 0., 0.\n", - "\n", - " f.close()\n", - "\n", - " return lat2D, lon2D, o3_2D, fv_o3, fv_geo" - ], - "metadata": { - "id": "a5e_8dyO4xPN" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "###4.2.2 Define function reading DSCOVR_EPIC_L2_TO3\n", - "\n", - "This is the new version, it reads time variable." - ], - "metadata": { - "id": "AfaDFhco2Taf" - } - }, - { - "cell_type": "code", - "source": [ - "def read_epic_l2_to3(fname):\n", - "# function read_epic_l2_to3 reads DSCOVR_EPIC_L2_TO3 product file given by its fname\n", - "# and returns arrays of wavelengths, 2D latitudes and longitudes, and total O3 column along with their fill values.\n", - "\n", - " try:\n", - " f = h5py.File(fname, \"r\" )\n", - " except:\n", - " print(\"Unable to find or read hdf5 input granule file \", fname)\n", - " return 0., 0., 0., 0., 0., 0.\n", - "\n", - " try:\n", - " item = f['Latitude']\n", - " lat2D = item[:]\n", - "# fv_geo = item.fillvalue\n", - " fv_geo = lat2D[0, 0]\n", - " except:\n", - " print(\"Unable to read 'Latitude' from granule file \", fname)\n", - " return 0., 0., 0., 0., 0., 0.\n", - "\n", - " try:\n", - " item = f['Longitude']\n", - " lon2D = item[:]\n", - " except:\n", - " print(\"Unable to read 'Longitude' from granule file \", fname)\n", - " return 0., 0., 0., 0., 0., 0.\n", - "\n", - " try:\n", - " item = f['Ozone']\n", - " o3_2D = item[:]\n", - "# commented out line below is the general way to read the fill value\n", - "# however, attribute '_FillValue' is not set for any array in the current version of the product\n", - "# at the same time, arrays do have apparent fill values that can be seen in the\n", - "# corners of the image\n", - "# fv_o3 = item.fillvalue\n", - " fv_o3 = o3_2D[0, 0]\n", - " except:\n", - " print(\"Unable to read 'Ozone' from granule file \", fname)\n", - " return 0., 0., 0., 0., 0., 0.\n", - "\n", - " try:\n", - " item = f['YearDaySeconds']\n", - " YearDaySeconds = item[:] # this is an array of 3 elements: year, day of the year, and seconds of the day\n", - " except:\n", - " print(\"Unable to read 'YearDaySeconds' from granule file \", fname)\n", - " return 0., 0., 0., 0., 0., 0.\n", - "\n", - "\n", - " f.close()\n", - "\n", - " return lat2D, lon2D, o3_2D, fv_o3, fv_geo, YearDaySeconds" - ], - "metadata": { - "id": "o_vlwg9LI1if" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "#4.3 Compile DSCOVR EPIC total ozone timeseries" - ], - "metadata": { - "id": "KdpWkG2_2yyH" - } - }, - { - "cell_type": "code", - "source": [ - "days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]\n", - "\n", - "geo_deviation = 0.2 # deviation from the point of interest, degree\n", - "\n", - "POI_name_ = POI_name.replace(' ','_')\n", - "out_Q_EPIC = 'tot_O3_EPIC'\n", - "out_Q_unit = 'DU'\n", - "\n", - "fout = open(out_Q_EPIC+'_'+datestamp_ini+'_'+datestamp_fin+'_'+POI_name_+'_'+str('%08.4fN_%08.4fW' %(POI[0], -POI[1])), 'w')\n", - "fout.write('timeseries of '+out_Q_EPIC+' at '+POI_name+' '+str('%08.4fN %08.4fW' %(POI[0], -POI[1]))+'\\n')\n", - "fout.write('yyyy mm dd hh mn ss '+out_Q_unit+'\\n')\n", - "\n", - "for result in POI_results_EPIC:\n", - " granule_link = result['umm']['RelatedUrls'][0]['URL']\n", - " last_slash_ind = granule_link.rfind('/')\n", - " fname = granule_link[last_slash_ind+1 : ]\n", - " print(fname)\n", - "# lat2D, lon2D, o3_2D, fv_o3, fv_geo = read_epic_l2_to3(fname) # this is for the version not reading YearDaySeconds array\n", - " lat2D, lon2D, o3_2D, fv_o3, fv_geo, YearDaySeconds = read_epic_l2_to3(fname)\n", - "\n", - " if isinstance(lat2D, float): continue\n", - "\n", - " print(fv_geo)\n", - "\n", - " nx = lon2D.shape[0]\n", - " ny = lon2D.shape[1]\n", - "\n", - "# getting time from the granule filename\n", - " '''\n", - " fname_split = fname.split('_')\n", - " timestamp = fname_split[-2]\n", - " yyyy= int(timestamp[0 : 4])\n", - " mm = int(timestamp[4 : 6])\n", - " dd = int(timestamp[6 : 8])\n", - " hh = int(timestamp[8 : 10])\n", - " mn = int(timestamp[10 : 12])\n", - " ss = int(timestamp[12 : 14])'''\n", - "\n", - "# check whether POI is in the granule. If not - move to the next granule\n", - " mask = (lat2D < POI_lat+geo_deviation)&(lat2D > POI_lat-geo_deviation)\\\n", - " &(lon2D < POI_lon+geo_deviation)&(lon2D > POI_lon-geo_deviation)\\\n", - " &(o3_2D != fv_o3)\n", - "\n", - " lat_loc = lat2D[mask]\n", - " lon_loc = lon2D[mask]\n", - " o3_loc = o3_2D[mask]\n", - " n_loc = len(o3_loc)\n", - " if n_loc < 1: continue\n", - "\n", - " pp = np.array([POI[1], POI[0]])\n", - " points = np.empty([0,2])\n", - " ff = np.empty(0)\n", - "\n", - " for i in range(n_loc):\n", - " if o3_loc[i] == fv_o3: continue\n", - " points = np.append(points, [[lon_loc[i], lat_loc[i]]], axis=0)\n", - " ff = np.append(ff, o3_loc[i])\n", - "\n", - " try:\n", - " [prod_loc] = griddata(points, ff, pp, method='linear', fill_value=-1., rescale=False)\n", - " print(prod_loc)\n", - " except:\n", - " try:\n", - " prod_loc = np.mean(ff)\n", - " print(prod_loc, ff)\n", - " except: continue\n", - "\n", - "# handling time first:\n", - " yyyy= int(YearDaySeconds[0])\n", - " dd = int(YearDaySeconds[1])\n", - " sec = int(YearDaySeconds[2])\n", - "\n", - " md = days.copy()\n", - " if (yyyy//4)*4 == yyyy: md[1] = md[1] + 1\n", - "\n", - " for i in range(12):\n", - " if dd > md[i]: dd = dd - md[i]\n", - " else:\n", - " mm = i + 1\n", - " break\n", - "\n", - " hh = sec//3600\n", - " mn = sec//60 - hh*60\n", - " ss = sec - hh*3600 - mn*60\n", - "\n", - " print(yyyy, mm, dd, hh, mn, ss, prod_loc)\n", - "\n", - " fout.write(str('%4.4i %2.2i %2.2i %2.2i %2.2i %2.2i %10.3e '\\\n", - "%(yyyy, mm, dd, hh, mn, ss, prod_loc)))\n", - " for i in range(n_loc):\n", - " fout.write(str('%9.4fN %9.4fW %10.3e '\\\n", - "%(lat_loc[i], -lon_loc[i], o3_loc[i])))\n", - " fout.write('\\n')\n", - "\n", - "fout.close()" - ], - "metadata": { - "id": "bj9DP2tSh0d0" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "#5 Working with TEMPO data" - ], - "metadata": { - "id": "1h0srrK7HbpO" - } - }, - { - "cell_type": "markdown", - "source": [ - "##5.1 Setting TEMPO name constants" - ], - "metadata": { - "id": "3wvhtsq5kXgZ" - } - }, - { - "cell_type": "code", - "source": [ - "short_name = 'TEMPO_O3TOT_L2' # collection name to search for in the EarthData\n", - "out_Q = 'tot_O3_col' # name of the output quantity with unit\n", - "out_Q_unit = out_Q+',_DU' # name of the output quantity with unit" - ], - "metadata": { - "id": "fZRNP9ifkMg4" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "##5.2 Searching TEMPO data files within 0.5 degree range around the POI (position of the Pandora station)" - ], - "metadata": { - "id": "qO9NEF61jlcy" - } - }, - { - "cell_type": "code", - "source": [ - "POI_lat = POI[0]\n", - "POI_lon = POI[1]\n", - "\n", - "bbox = (POI_lon - 0.5, POI_lat - 0.5, POI_lon + 0.5, POI_lat + 0.5)\n", - "POI_results = earthaccess.search_data(short_name = short_name,\n", - " temporal = (date_start, date_end),\n", - " bounding_box = bbox)\n", - "\n", - "print('total number of granules found for POI', POI_name, \\\n", - " '\\nwithin period of interes between', date_start, 'and', date_end, \\\n", - " '\\nis', len(POI_results))" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "vEUujyNZzRx0", - "outputId": "0bf9b622-407f-4b9e-e2ed-d03c71aba3c2" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Granules found: 11\n", - "total number of granules found for POI BoulderCO \n", - "within period of interes between 2023-11-03 00:00:00 and 2023-11-03 23:59:59 \n", - "is 11\n" - ] - } - ] - }, - { - "cell_type": "markdown", - "source": [ - "###5.2.0 Printing explicit links to the granules\n", - "\n", - "This can be dropped off" - ], - "metadata": { - "id": "OvC5eZRhk7Xz" - } - }, - { - "cell_type": "code", - "source": [ - "granule_links = []\n", - "for result in POI_results: granule_links.append(result['umm']['RelatedUrls'][0]['URL'])\n", - "\n", - "for granule_link in granule_links: print(granule_link)" - ], - "metadata": { - "id": "UQnLZCmB5Oxv", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "2380b9e2-d568-4d50-9c96-249c35034077" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "https://data.asdc.earthdata.nasa.gov/asdc-prod-protected/TEMPO/TEMPO_O3TOT_L2_V01/2023.11.03/TEMPO_O3TOT_L2_V01_20231103T150156Z_S005G07.nc\n", - "https://data.asdc.earthdata.nasa.gov/asdc-prod-protected/TEMPO/TEMPO_O3TOT_L2_V01/2023.11.03/TEMPO_O3TOT_L2_V01_20231103T160156Z_S006G07.nc\n", - "https://data.asdc.earthdata.nasa.gov/asdc-prod-protected/TEMPO/TEMPO_O3TOT_L2_V01/2023.11.03/TEMPO_O3TOT_L2_V01_20231103T170156Z_S007G07.nc\n", - "https://data.asdc.earthdata.nasa.gov/asdc-prod-protected/TEMPO/TEMPO_O3TOT_L2_V01/2023.11.03/TEMPO_O3TOT_L2_V01_20231103T180156Z_S008G07.nc\n", - "https://data.asdc.earthdata.nasa.gov/asdc-prod-protected/TEMPO/TEMPO_O3TOT_L2_V01/2023.11.03/TEMPO_O3TOT_L2_V01_20231103T190156Z_S009G07.nc\n", - "https://data.asdc.earthdata.nasa.gov/asdc-prod-protected/TEMPO/TEMPO_O3TOT_L2_V01/2023.11.03/TEMPO_O3TOT_L2_V01_20231103T200156Z_S010G07.nc\n", - "https://data.asdc.earthdata.nasa.gov/asdc-prod-protected/TEMPO/TEMPO_O3TOT_L2_V01/2023.11.03/TEMPO_O3TOT_L2_V01_20231103T210156Z_S011G07.nc\n", - "https://data.asdc.earthdata.nasa.gov/asdc-prod-protected/TEMPO/TEMPO_O3TOT_L2_V01/2023.11.03/TEMPO_O3TOT_L2_V01_20231103T214201Z_S012G04.nc\n", - "https://data.asdc.earthdata.nasa.gov/asdc-prod-protected/TEMPO/TEMPO_O3TOT_L2_V01/2023.11.03/TEMPO_O3TOT_L2_V01_20231103T222206Z_S013G04.nc\n", - "https://data.asdc.earthdata.nasa.gov/asdc-prod-protected/TEMPO/TEMPO_O3TOT_L2_V01/2023.11.03/TEMPO_O3TOT_L2_V01_20231103T230211Z_S014G04.nc\n", - "https://data.asdc.earthdata.nasa.gov/asdc-prod-protected/TEMPO/TEMPO_O3TOT_L2_V01/2023.11.03/TEMPO_O3TOT_L2_V01_20231103T234216Z_S015G04.nc\n" - ] - } - ] - }, - { - "cell_type": "markdown", - "source": [ - "##5.3 Downloading TEMPO data files" - ], - "metadata": { - "id": "GTZXmaFalcLa" - } - }, - { - "cell_type": "code", - "source": [ - "downloaded_files = earthaccess.download(\n", - " POI_results,\n", - " local_path='.',\n", - ")" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 130, - "referenced_widgets": [ - "86c595fccf7f44269f7cb5e985b82abf", - "9530c390dd934051912e75bb773f2943", - "d72b4c7db99645c496d9c509601aaa9d", - "9cdcfbcf3acf479bbab190f8c9d1b5dd", - "a0489d452c4f4d59b39e25b08e00a785", - "fc92e6a3ce4c41b7b4e4d9ed68e9fdb9", - "da9916452e8e47f7a1e9f055aa061988", - "c65cf44da71846f882e3eab4526b3638", - "a5ef340105424bddacbdad7cbfb726a5", - "0acb07eab0fa41e1af28c038557e7992", - "56da9bab427f4c188ef63fd208d677ae", - "d9a08a617eda4fd3aff2cb795c6ab49c", - "aee2fe4dba944179970113a0f00a4a88", - "2af27d2decf54d12bc6f8e9eaeaee2da", - "e58ba8910534430b99804fb42e7b796d", - "a91cfd7a529f49129e206e4ce580b5d7", - "cb4ef1e6587246fbba02bb30f1409363", - "1efcf2280d58437e88ddd939eeed9571", - "b7c8eb11666d4f95964101f84389da0f", - "cc7d836c663943aabaa25d9aedf58273", - "6c7c5843fd7e49ef86da2df8dce125f6", - "a6b3297afae54367b311417fe04c366a", - "1563bcd5a65a4d3690135c23bab44226", - "572fc2f3d19249baa10fa3629f96c8df", - "7b8ca42a725b449ab751ec6846558bed", - "e98db869566941718531a6c7c090b171", - "9bbde6bb301946e0ae5d2a0b4804fe5c", - "b8bc3f5d5497448e8b531b7bc3d53cb2", - "b1bf0477c37541c09a4a7ee16a9e5e28", - "611b56174c8d45bc8a3fc56d3891e602", - "27ecae9ae93d46b6a20f026f70c0f52b", - "178ece40bdf64e178701901caaff5a80", - "abd0a75940954315b7e738dec0185472" - ] - }, - "id": "DeSFXhk2DYIP", - "outputId": "8ae5fb78-7b68-4049-a96b-80d53a566c27" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - " Getting 11 granules, approx download size: 0.0 GB\n" - ] - }, - { - "output_type": "display_data", - "data": { - "text/plain": [ - "QUEUEING TASKS | : 0%| | 0/11 [00:00= 60.:\n", - " delta_mn = int(ss/60.)\n", - " ss = ss - 60.*delta_mn\n", - " mn = mn + delta_mn\n", - " if mn >= 60:\n", - " mn = mn - 60\n", - " hh = hh + 1\n", - " if hh == 24:\n", - " hh = hh - 24\n", - " dd = dd + 1\n", - " day_month = days[mm]\n", - " if (yyyy//4)*4 == yyyy and mm == 2: day_month = day_month + 1\n", - " if dd > day_month:\n", - " dd = 1\n", - " mm = mm + 1\n", - " if mm > 12:\n", - " mm = 1\n", - " yyyy = yyyy + 1\n", - "\n", - " fout.write(str('%4.4i %2.2i %2.2i %2.2i %2.2i %2.2i %10.3e '\\\n", - "%(yyyy, mm, dd, hh, mn, ss, prod_loc)))\n", - " fout.write(str('%9.4fN %9.4fW %10.3e '\\\n", - "%(lat[ix, iy], -lon[ix, iy], total_O3_column[ix, iy])))\n", - " fout.write(str('%9.4fN %9.4fW %10.3e '\\\n", - "%(lat[ix, iy+1], -lon[ix, iy+1], total_O3_column[ix, iy+1])))\n", - " fout.write(str('%9.4fN %9.4fW %10.3e '\\\n", - "%(lat[ix+1, iy+1], -lon[ix+1, iy+1], total_O3_column[ix+1, iy+1])))\n", - " fout.write(str('%9.4fN %9.4fW %10.3e\\n'\\\n", - "%(lat[ix+1, iy], -lon[ix+1, iy], total_O3_column[ix+1, iy])))\n", - "\n", - " break\n", - "\n", - " if POI_found: break\n", - "\n", - "fout.close()" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "njLS6oxmQCkn", - "outputId": "64b014ad-62bb-424f-d2e2-563909274574" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "TEMPO_O3TOT_L2_V01_20231103T150156Z_S005G07.nc\n", - "131 2048\n", - "(4354, 2)\n", - "point POINT (-105.26 39.99) is in granule polygon\n", - "20 694 40.002373 -105.23424 265.50677\n", - "20 695 39.981533 -105.22905 264.29205\n", - "21 695 39.979023 -105.286476 268.13052\n", - "21 694 40.001945 -105.29276 266.12485\n", - "POI BoulderCO at -105.26 39.99 found\n", - "TEMPO_O3TOT_L2_V01_20231103T160156Z_S006G07.nc\n", - "131 2048\n", - "(4354, 2)\n", - "point POINT (-105.26 39.99) is in granule polygon\n", - "21 695 40.00962 -105.256546 272.9443\n", - "21 696 39.98879 -105.25135 270.89578\n", - "22 696 39.985245 -105.30844 273.00555\n", - "22 695 40.00915 -105.31525 269.48877\n", - "POI BoulderCO at -105.26 39.99 found\n", - "TEMPO_O3TOT_L2_V01_20231103T170156Z_S007G07.nc\n", - "131 2048\n", - "(4354, 2)\n", - "point POINT (-105.26 39.99) is in granule polygon\n", - "20 694 39.99604 -105.21864 275.2817\n", - "20 695 39.975155 -105.21344 274.49786\n", - "21 695 39.974785 -105.272224 275.07233\n", - "21 694 39.996113 -105.27769 275.15555\n", - "POI BoulderCO at -105.26 39.99 found\n", - "TEMPO_O3TOT_L2_V01_20231103T180156Z_S008G07.nc\n", - "131 2048\n", - "(4354, 2)\n", - "point POINT (-105.26 39.99) is in granule polygon\n", - "21 694 39.99882 -105.24307 277.9549\n", - "21 695 39.97797 -105.23787 278.22723\n", - "22 695 39.973923 -105.294464 277.4286\n", - "22 694 39.997402 -105.30105 278.03995\n", - "POI BoulderCO at -105.26 39.99 found\n", - "TEMPO_O3TOT_L2_V01_20231103T190156Z_S009G07.nc\n", - "131 2048\n", - "(4354, 2)\n", - "point POINT (-105.26 39.99) is in granule polygon\n", - "20 694 39.991512 -105.202286 278.375\n", - "20 695 39.97048 -105.19701 277.3095\n", - "21 695 39.97231 -105.25673 276.19525\n", - "21 694 39.993423 -105.262085 276.58514\n", - "POI BoulderCO at -105.26 39.99 found\n", - "TEMPO_O3TOT_L2_V01_20231103T200156Z_S010G07.nc\n", - "131 2048\n", - "(4354, 2)\n", - "point POINT (-105.26 39.99) is in granule polygon\n", - "21 694 40.000816 -105.2569 279.89938\n", - "21 695 39.9799 -105.25165 279.7438\n", - "22 695 39.97637 -105.308266 279.76053\n", - "22 694 40.000423 -105.31516 281.23743\n", - "POI BoulderCO at -105.26 39.99 found\n", - "TEMPO_O3TOT_L2_V01_20231103T210156Z_S011G07.nc\n", - "131 2048\n", - "(4354, 2)\n", - "point POINT (-105.26 39.99) is in granule polygon\n", - "21 694 40.006733 -105.257935 279.017\n", - "21 695 39.9859 -105.252716 279.99512\n", - "22 695 39.981586 -105.30935 278.6585\n", - "22 694 40.006115 -105.31648 277.91623\n", - "POI BoulderCO at -105.26 39.99 found\n", - "TEMPO_O3TOT_L2_V01_20231103T214201Z_S012G04.nc\n", - "131 2048\n", - "(4354, 2)\n", - "point POINT (-105.26 39.99) is in granule polygon\n", - "22 695 40.001038 -105.24604 276.74942\n", - "22 696 39.980156 -105.24081 276.48972\n", - "23 696 39.974648 -105.29649 273.6656\n", - "23 695 39.998272 -105.30317 274.21997\n", - "POI BoulderCO at -105.26 39.99 found\n", - "TEMPO_O3TOT_L2_V01_20231103T222206Z_S013G04.nc\n", - "131 2048\n", - "(4354, 2)\n", - "point POINT (-105.26 39.99) is in granule polygon\n", - "22 696 39.996 -105.211174 273.46387\n", - "22 697 39.975048 -105.205925 272.75867\n", - "23 697 39.975758 -105.264984 273.5583\n", - "23 696 39.996826 -105.27032 275.33987\n", - "POI BoulderCO at -105.26 39.99 found\n", - "TEMPO_O3TOT_L2_V01_20231103T230211Z_S014G04.nc\n", - "131 2048\n", - "(4354, 2)\n", - "point POINT (-105.26 39.99) is in granule polygon\n", - "22 695 40.007656 -105.261154 310.3712\n", - "22 696 39.986847 -105.25595 317.39838\n", - "23 696 39.982967 -105.31233 324.2187\n", - "23 695 40.008106 -105.31981 324.80087\n", - "POI BoulderCO at -105.26 39.99 found\n", - "TEMPO_O3TOT_L2_V01_20231103T234216Z_S015G04.nc\n", - "131 2048\n", - "(4354, 2)\n", - "point POINT (-105.26 39.99) is in granule polygon\n", - "22 695 40.006256 -105.25637 -1.2676506e+30\n", - "22 696 39.9854 -105.25115 -1.2676506e+30\n", - "23 696 39.981262 -105.30837 -1.2676506e+30\n", - "23 695 40.00558 -105.31541 -1.2676506e+30\n", - "POI BoulderCO at -105.26 39.99 found\n" - ] - } - ] - }, - { - "cell_type": "markdown", - "source": [ - "#6 Plotting the results" - ], - "metadata": { - "id": "RMhPI74LW91T" - } - }, - { - "cell_type": "markdown", - "source": [ - "##6.1 Reading created data files for TEMPO and DSCOVR, create timeseries" - ], - "metadata": { - "id": "LBG0YtxbXSpm" - } - }, - { - "cell_type": "code", - "source": [ - "# reading TEMPO file that was created at the previous step\n", - "# only read POI information from the header and first 8 columns of data:\n", - "# yyyy, mm, dd, hh, mn, ss, NO2 column, and its incertainty\n", - "fout = open(out_Q+'_'+datestamp_ini+'_'+datestamp_fin+'_'+POI_name_+'_'+str('%08.4fN_%08.4fW' %(POI[0], -POI[1])), 'r')\n", - "\n", - "header1 = fout.readline()\n", - "header2 = fout.readline()\n", - "data_lines = fout.readlines()\n", - "\n", - "fout.close()\n", - "\n", - "time_series_TEMPO = np.empty([0, 2])\n", - "\n", - "if len(data_lines) > 0:\n", - " split = data_lines[0].split()\n", - " yyyy = int(split[0])\n", - " mm = int(split[1])\n", - " dd = int(split[2])\n", - " hh = 0\n", - " mn = 0\n", - " ss = 0\n", - " dt0 = datetime(yyyy, mm, dd, hh, mn, ss)\n", - "\n", - " for line in data_lines:\n", - " split = line.split()\n", - " yyyy = int(split[0])\n", - " mm = int(split[1])\n", - " dd = int(split[2])\n", - " hh = int(split[3])\n", - " mn = int(split[4])\n", - " ss = int(split[5])\n", - "# dt below is time since the beginning of the eriod of interest in hours\n", - " dt = (datetime(yyyy, mm, dd, hh, mn, ss) - dt0).total_seconds()/86400.\n", - " time_series_TEMPO = np.append(time_series_TEMPO,\\\n", - " [[dt, float(split[6])]], axis = 0)\n", - "\n", - "# reading DSCOVR file that was created at the previous step\n", - "# only read POI information from the header and first 8 columns of data:\n", - "# yyyy, mm, dd, hh, mn, ss, and O3 column\n", - "fout = open(out_Q_EPIC+'_'+datestamp_ini+'_'+datestamp_fin+'_'+POI_name_+'_'+str('%08.4fN_%08.4fW' %(POI[0], -POI[1])), 'r')\n", - "\n", - "header1 = fout.readline()\n", - "header2 = fout.readline()\n", - "data_lines = fout.readlines()\n", - "\n", - "fout.close()\n", - "\n", - "time_series_DSCOVR = np.empty([0, 2])\n", - "\n", - "if len(data_lines) > 0:\n", - " split = data_lines[0].split()\n", - " yyyy = int(split[0])\n", - " mm = int(split[1])\n", - " dd = int(split[2])\n", - " hh = 0\n", - " mn = 0\n", - " ss = 0\n", - " dt0 = datetime(yyyy, mm, dd, hh, mn, ss)\n", - "\n", - " for line in data_lines:\n", - " split = line.split()\n", - " yyyy = int(split[0])\n", - " mm = int(split[1])\n", - " dd = int(split[2])\n", - " hh = int(split[3])\n", - " mn = int(split[4])\n", - " ss = int(split[5])\n", - "# dt below is time since the beginning of the eriod of interest in hours\n", - " dt = (datetime(yyyy, mm, dd, hh, mn, ss) - dt0).total_seconds()/86400.\n", - " time_series_DSCOVR = np.append(time_series_DSCOVR,\\\n", - " [[dt, float(split[6])]], axis = 0)\n", - "\n", - "time_series_Pandora = np.empty([0, 3])\n", - "\n", - "for line in Pandora_data:\n", - " yyyy = int(line[0])\n", - " mm = int(line[1])\n", - " dd = int(line[2])\n", - " hh = int(line[3])\n", - " mn = int(line[4])\n", - " ss = int(line[5])\n", - "# dt = datetime(yyyy, mm, dd, hh, mn, ss)\n", - "# dt below is time since the beginning of the eriod of interest in hours\n", - " dt = (datetime(yyyy, mm, dd, hh, mn, ss) - dt0).total_seconds()/86400.\n", - "# time_series_Pandora = np.append(time_series_Pandora,\\\n", - "#[[(dt - dt0).total_seconds()/86400., line[6]]], axis = 0)\n", - " time_series_Pandora = np.append(time_series_Pandora,\\\n", - "[[dt, line[6], line[7]]], axis = 0)\n" - ], - "metadata": { - "id": "6tWE__dTPyGu" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "##6.2 Plotting timeseries" - ], - "metadata": { - "id": "4qidCOMV4oQb" - } - }, - { - "cell_type": "markdown", - "source": [ - "###6.2.1 No error bars" - ], - "metadata": { - "id": "T5-3oQUj44B5" - } - }, - { - "cell_type": "code", - "source": [ - "plot_title = out_Q+'_'+datestamp_ini+'_'+datestamp_fin+'\\n'+POI_name\n", - "img_name = out_Q+'_'+datestamp_ini+'_'+datestamp_fin+'_'+POI_name+'.jpg'\n", - "\n", - "plt.plot(time_series_Pandora[:, 0], time_series_Pandora[:, 1],\\\n", - " label = \"Pandora\", c = 'r')\n", - "plt.plot(time_series_DSCOVR[:, 0], time_series_DSCOVR[:, 1],\n", - " label = \"DSCOVR\", c = 'g')\n", - "plt.plot(time_series_TEMPO[:, 0], time_series_TEMPO[:, 1],\n", - " label = \"TEMPO\", c = 'b')\n", - "\n", - "# Set the range of x-axis\n", - "l_lim = int(min(time_series_TEMPO[:, 0]))\n", - "u_lim = int(max(time_series_TEMPO[:, 0])) + 1\n", - "plt.xlim(l_lim, u_lim)\n", - "\n", - "# some research is required to set the vertical range\n", - "plt.xlabel(r'GMT, day from beginning of '+datestamp_ini, fontsize=12)\n", - "plt.ylabel(out_Q_unit.replace('_',' '), fontsize=12)\n", - "\n", - "plt.legend(loc='lower left')\n", - "\n", - "plt.title(plot_title+str(', %08.4fN %08.4fW' %(POI[0], -POI[1])))\n", - "plt.savefig(img_name, format='jpg', dpi=300)" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "4Y6fM_SHd5wZ", - "outputId": "596d3475-8e0b-4a42-b987-0e332776095a" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "display_data", - "data": { - "text/plain": [ - "
" - ], - "image/png": "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B26vIKICbfjw4diwYQNu376d7gBfIqLCjIO5iUjHkSNH8N133zFJIqIijy1KRERERAawRYmIiIjIACZKRERERAYwUSIiIiIygIkSERERkQHGeR1AfqRSqfDkyRNYW1sbfAYYERER5S/iv8chubm5QS7PnrYgJkp6PHnyROtJ1kRERFRwPHr0CO7u7tmyLSZKeqgfWvno0SPY2NjkcTRERESUEVFRUfDw8Ejz4dOZxURJD3V3m42NDRMlIiKiAiY7h81wMDcRERGRAUyUiIiIiAxgokRERERkABMlIiIiIgOYKBEREREZwESJiIiIyAAmSkREREQGMFEiIiIiMoCJEhEREZEBTJSIiIiIDGCiRERERGQAEyUiIiIiA5goERERUa6LjQXu3AFevszrSNLGRImIiIhy3dGjgJcX4O+f15GkjYkSERER5broaOmntXXexpEeJkpERESU65goERERERnARImIiIjIgKgo6ScTJSIiIqJ3qFuUbGzyNo70MFEiIiKiXMeuNyIiIiIDmCgRERERGcBEiYiIiMgADuYmIiIiMoCDuYmIiIgMYNcbERERkQFMlIiIiIgMYKJEREREpEdyMhAXJ71nokRERESUSkzM2/cczE1ERESUirrbzcQEUCjyNpb0MFEiIiKiXFVQxicBTJSIiIgolzFRIiIiIjKgoMzKDTBRIiIiolxWUGblBpgoERERUS5j1xsRERGRAUyUiIiIiAxgokRERERkAAdzExERERnAwdxEREREBrDrjYiIiMgAJkpEREREBnCMEhEREZEBbFEiIiIiMoCDuYmIiIgMYIsSERERkQFMlIiIiIj0EIKJEhEREZFecXGASiW95xglIiIiolTUrUkyGWBpmbexZAQTJSIiIso16kTJykpKlvI7JkpERESUawrS+CSAiRIRERHlooI0KzeQzxKlRYsWoUqVKrCxsYGNjQ38/Pywd+9ezfKlS5eiQYMGsLGxgUwmQ2RkpM42Xr16hW7dusHGxgZ2dnbo06cPYmJicvEoiIiIyJCCNNkkkM8SJXd3d0ydOhXnzp3DX3/9hUaNGqFNmza4cuUKACAuLg4BAQEYNWqUwW1069YNV65cwYEDB7Br1y4cO3YMffv2za1DICIiojQUtK4347wOILXWrVtrff7++++xaNEinD59GpUqVcLgwYMBAGFhYXrXv3btGvbt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\n" - }, - "metadata": {} - } - ] - }, - { - "cell_type": "markdown", - "source": [ - "###6.2.2 Smooth Pandora retievals and interplate them into other time series times\n", - "\n", - "Pandora timeseries has significantly more data points then TEMPO and DSCOVR. It is also very noisy. To make comparison easier, Pandora timeseries is interpolated to the moments of TEMPO and DSCOVR observations.\n", - "\n", - "Interpolation is performed by the function defined below with the help of Gaussian smooting as follow:\n", - "\n", - "x_int(t) = SUM(x_p(t_i)*wt(t_i, t)),\n", - "\n", - "wt(t_i, t) = exp(-(t - t_i)^2/(2 * sigma^2))/SUM(exp(-(t - t_i)^2/(2 * sigma^2))),\n", - "\n", - "where sums are taken over times t_i falling into time interval (t-dt_max, t+dt_max).\n", - "\n", - "Parameters dt_max and sigma can be chosen by the user. In the example below they are\n", - "\n", - "dt_max = 0.00041666667 - 10 minutes expressed in days\n", - "\n", - "sigma = 0.00041666667 - 1 minute expressed in days" - ], - "metadata": { - "id": "B7s-OkU_Xz62" - } - }, - { - "cell_type": "code", - "source": [ - "def gauss_interpolation(timeseries, new_times):\n", - "#\n", - "# function gauss_interpolation takes 2D array timeseries with function\n", - "# to be interpolated and 1D array new_times containing times to which\n", - "# the function is to be interpolated\n", - "# arguments:\n", - "# timeseries - array with at least 2 columns,\n", - "# 1st column - times, 2nd (3rd, ...) column(s) - function to be interpolated\n", - "# new_times - 1D array of times to which the function(s) to be interpolated\n", - "#\n", - "# parameters\n", - "# dt_max = 0.0041666667 - 10 minutes expressed in days\n", - "# sigma = 0.00041666667 - 1 minute expressed in days\n", - "\n", - " dt_max = 0.0041666667 # 10 minutes expressed in days\n", - " sigma = 0.00041666667 # 1 minute expressed in days\n", - "\n", - " nnt = len(new_times)\n", - " (nt, nfun) = timeseries.shape\n", - "\n", - " timeseries_smooth = np.empty([0, nfun])\n", - "\n", - " for new_time in new_times:\n", - " llim = new_time - dt_max\n", - " ulim = new_time + dt_max\n", - "\n", - " timeseries_subset = timeseries[((timeseries[:, 0] < ulim)\\\n", - " & (timeseries[:, 0] > llim))]\n", - " if len(timeseries_subset) < 1: continue\n", - " t_delta = timeseries_subset[:, 0] - new_time\n", - " wt = np.exp(-t_delta**2/(2.*sigma**2))\n", - " wt = wt/np.sum(wt)\n", - "\n", - " timeseries_smooth_loc = np.array([new_time])\n", - " for ifun in range(1, nfun):\n", - " timeseries_smooth_loc = np.append(timeseries_smooth_loc,\\\n", - " np.sum(timeseries_subset[:, ifun]*wt))\n", - "\n", - " timeseries_smooth = np.append(timeseries_smooth,\\\n", - " np.array([timeseries_smooth_loc]), axis = 0)\n", - "\n", - " return timeseries_smooth" - ], - "metadata": { - "id": "Myd3jh7jFAmL" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "###6.1.3 Plotting smoothed Pandora retievals with error bars\n" - ], - "metadata": { - "id": "OxT6_zBj7VH9" - } - }, - { - "cell_type": "code", - "source": [ - "print(time_series_Pandora.shape)\n", - "print(time_series_TEMPO.shape)\n", - "print(time_series_DSCOVR.shape)" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "VaJzWEU440TH", - "outputId": "c8896249-3b1b-436e-f266-8eba3496cc2b" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "(100, 3)\n", - "(10, 2)\n", - "(0, 2)\n" - ] - } - ] - }, - { - "cell_type": "code", - "source": [ - "timeseries_Pandora_TEMPO = gauss_interpolation(time_series_Pandora[:, 0:3],\\\n", - " time_series_TEMPO[:, 0])\n", - "\n", - "timeseries_Pandora_DSCOVR = gauss_interpolation(time_series_Pandora[:, 0:3],\\\n", - " time_series_DSCOVR[:, 0])" - ], - "metadata": { - "id": "rlfrJAIfCx88" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "plot_title = out_Q+'_unc_'+datestamp_ini+'_'+datestamp_fin+'\\n'+POI_name\n", - "img_name = out_Q+'_unc_'+'_'+datestamp_ini+'_'+datestamp_fin+'_'+POI_name+'.jpg'\n", - "\n", - "fig = plt.figure()\n", - "\n", - "plt.errorbar(time_series_TEMPO[:, 0], time_series_TEMPO[:, 1],\\\n", - "yerr=None, label = \"TEMPO\", c = 'b', ls = '', marker = \".\")\n", - "\n", - "plt.errorbar(timeseries_Pandora_TEMPO[:, 0],\\\n", - " timeseries_Pandora_TEMPO[:, 1],\\\n", - " yerr=timeseries_Pandora_TEMPO[:, 2],\\\n", - " label = \"Pandora smoothed at TEMPO times\",\\\n", - " c = 'r', ls = '', marker = \".\")\n", - "\n", - "plt.errorbar(time_series_DSCOVR[:, 0], time_series_DSCOVR[:, 1],\\\n", - "yerr=None, label = \"DSCOVR\", c = 'c', ls = '', marker = \".\")\n", - "\n", - "plt.errorbar(timeseries_Pandora_DSCOVR[:, 0],\\\n", - " timeseries_Pandora_DSCOVR[:, 1],\\\n", - " yerr=timeseries_Pandora_DSCOVR[:, 2],\\\n", - " label = \"Pandora smoothed at DSCOVR times\",\\\n", - " c = 'm', ls = '', marker = \".\")\n", - "\n", - "# Set the range of x-axis\n", - "l_lim = int(min(time_series_TEMPO[:, 0]))\n", - "u_lim = int(max(time_series_TEMPO[:, 0])) + 1\n", - "plt.xlim(l_lim, u_lim)\n", - "\n", - "# Set the range of y-axis\n", - "l_lim = 200\n", - "u_lim = 350\n", - "plt.ylim(l_lim, u_lim)\n", - "\n", - "# some research is required to set the vertical range\n", - "plt.xlabel(r'GMT, day from beginning of '+datestamp_ini, fontsize=12)\n", - "plt.ylabel(out_Q_unit.replace('_',' '), fontsize=12)\n", - "\n", - "#plt.legend(loc='lower left')\n", - "#plt.legend(loc='upper left')\n", - "plt.legend(loc='lower left')\n", - "\n", - "plt.title(plot_title+str(', %08.4fN %08.4fW' %(POI[0], -POI[1])))\n", - "plt.savefig(img_name, format='jpg', dpi=300)\n" - ], - "metadata": { - "id": "DHKXyXJkRC2G", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "539d6625-cd66-4cd2-daa7-e58440b02828" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "display_data", - "data": { - "text/plain": [ - "
" - ], - "image/png": "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/36WeVesWIGKFSvC2NgY5cuXV1aFftm///6LTp06wdraGpaWlmjbti2uX7+ukScyMlL5/G7cuFGrjIkTJ0KlUulsS6anT59iwoQJ8Pf3h62tLVQqVbY3CFy4cAH+/v4wNzeHra0tevbsqXU33Itte3nLzQN29+7di48//hienp4wNTVF2bJl8cknn2T5sFng+V2Q3377LSpUqABjY2M4OjqiVatWuHPnjka+5ORkjBkzBi4uLjAxMUGdOnV0zrv666+/8O6778LU1BROTk4YMmQInj59quxft24dVCoVQkJCtI6tWrUqVCoVwsLCtPa5ubmhXr16OZ4DeosU5WqXRPmRuXLw5MmTZfXq1fLTTz/JjBkzpFKlSgJAtm7d+lrqv3HjRo553d3dJSAgoMDbcO3aNSlTpozo6+tLly5dZMGCBbJ06VIZNGiQ2NnZSfny5TXyjxw5UgBI1apV5bvvvpNly5bJwIEDRa1WS8mSJeXixYv5bsv27dtFpVJJkyZNZOnSpTJ48GDR09OTAQMGaORbtmyZtG3bVr7++mtZvny5zJgxQ6pWrSp6enqyY8cOjbydOnUSlUolgYGBsmjRImUl6759++bYnri4OPHw8BALCwv58ssvZcGCBdKwYUMBIL/88otG3h9++EEAyHvvvScLFy6UsWPHiqmpqfj4+EhSUpJG3sWLFwsAad++vSxdulR69uwpAGTatGka+Z48eSLly5cXBwcH+e6772T27NlSqlQpcXV1lfv37yv5XlxV2sfHR2vV6cyVpHNa5TmzHDc3N2ncuHGWq2dnun37tpQoUULKlSsn33//vXzzzTdiY2MjVatWleTkZK0yu3btKqtXr9bYIiMjs22PiEiNGjWkTJky8tlnn8myZctk7NixYmFhIY6OjhIdHa2RNyUlRZo1ayampqYydOhQWbFihcycOVM6duwo586d08jbpUsXMTAwkFGjRsmSJUvE19dXDAwM5NChQxr5Tp06JcbGxvLOO+/IokWLZNy4caJWq8Xf31/J8++//woAGTFihMaxcXFxoqenJwYGBjJlyhSNfbdu3RIAMnr06BzPAb09GCjRGyczUHn5MQ4PHz4UQ0ND6dat22up/3UHSqmpqZKcnCypqalStWpVMTU11fqBEHn+Rf/FF18or9esWSMApHPnzpKWlqaR9+jRo2JqaipVqlSR1NTU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\n" - }, - "metadata": {} - } - ] - } - ] -} \ No newline at end of file