From 2b9a2866906ddd9cbaf83109412cd74bea69d0d5 Mon Sep 17 00:00:00 2001 From: hangqianjun Date: Wed, 17 May 2023 01:00:07 -0700 Subject: [PATCH 01/10] Test upstream --- .../examples/survey_nonuniformity/survey_nonuniformity.py | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/rail/pipelines/examples/survey_nonuniformity/survey_nonuniformity.py diff --git a/src/rail/pipelines/examples/survey_nonuniformity/survey_nonuniformity.py b/src/rail/pipelines/examples/survey_nonuniformity/survey_nonuniformity.py new file mode 100644 index 0000000..9f4e8d7 --- /dev/null +++ b/src/rail/pipelines/examples/survey_nonuniformity/survey_nonuniformity.py @@ -0,0 +1 @@ +#test From c887a51992b6d393069237a8da7029531377de62 Mon Sep 17 00:00:00 2001 From: hangqianjun Date: Thu, 3 Aug 2023 09:37:14 -0700 Subject: [PATCH 02/10] Pull from main --- .../survey_nonuniformity.py | 113 +++++++++++++++++- 1 file changed, 112 insertions(+), 1 deletion(-) diff --git a/src/rail/pipelines/examples/survey_nonuniformity/survey_nonuniformity.py b/src/rail/pipelines/examples/survey_nonuniformity/survey_nonuniformity.py index 9f4e8d7..5d27232 100644 --- a/src/rail/pipelines/examples/survey_nonuniformity/survey_nonuniformity.py +++ b/src/rail/pipelines/examples/survey_nonuniformity/survey_nonuniformity.py @@ -1 +1,112 @@ -#test +#!/usr/bin/env python +# coding: utf-8 + +# Prerquisites, os, and numpy +import os +import numpy as np + +# Extra packages used by this pipeline +from astropy.io import fits +import healpy as hp +import pickle +import pandas as pd +from collections import OrderedDict +import yaml + +# Various rail modules +import rail.stages +rail.stages.import_and_attach_all() +from rail.stages import * + +from rail.pipelines.utils.name_factory import NameFactory, DataType, CatalogType, ModelType, PdfType +from rail.core.stage import RailStage, RailPipeline + +import ceci + +# other RAIL modules: +import tables_io + +from rail.core.data import TableHandle +from rail.core.stage import RailStage + +#import pzflow +#from pzflow import Flow +from rail.creation.engines.flowEngine import FlowCreator + +from rail.creation.degradation import observing_condition_degrader +from rail.creation.degradation.observing_condition_degrader import ObsCondition + +from rail.estimation.algos.flexzboost import Inform_FZBoost, FZBoost +from rail.estimation.algos.bpz_lite import BPZ_lite + +# also need to import the reddening stage +from rail.core.utilStages import Dereddener + +namer = NameFactory() +#from rail.core.utils import RAILDIR +# for now we use MYDIR, change to something else later +MYDIR = "" +flow_file = os.path.join(MYDIR, 'rail/examples_data/goldenspike_data/data/pretrained_flow.pkl') + + + +class SurveyNonuniformPipeline(RailPipeline): + + def __init__(self): + RailPipeline.__init__(self) + + DS = RailStage.data_store + DS.__class__.allow_overwrite = True + + bands = ['u','g','r','i','z','y'] + band_dict = {band:f'mag_{band}_lsst' for band in bands} + rename_dict = {f'mag_{band}_lsst_err':f'mag_err_{band}_lsst' for band in bands} + + # load pretrained flowmodel + self.flow_engine_train = FlowCreator.build( + model=flow_file, + n_samples=50, + seed=1235, + output=os.path.join(namer.get_data_dir(DataType.catalog, CatalogType.created), "output_flow_engine_train.pq"), + ) + + # Here we need to convert semi major minor axies + + # apply LSST error model with maps + self.obs_condition_train = ObsCondition.build( + connections=dict(input=self.flow_engine_train.io.output), + bandNames=band_dict, seed=29, + output=os.path.join(namer.get_data_dir(DataType.catalog, CatalogType.degraded), "output_lsst_error_model_train.pq"), + ) + + # deredden + self.deredden = Dereddener.build( + connections=dict(input=self.obs_condition_train.io.output), + bandNames=band_dict, + output=os.path.join(namer.get_data_dir(DataType.catalog, CatalogType.degraded), "output_lsst_error_model_deredden_train.pq"), + ) + + # use BPZ to estimate redshifts: + self.estimate_bpz = BPZ_lite.build( + connections=dict( + input=self.table_conv_test.io.output, + model=self.inform_bpz.io.model, + ), + hdf5_groupname='', + output=os.path.join(namer.get_data_dir(DataType.pdf, PdfType.pz), "output_estimate_bpz.hdf5"), + ) + + # some sort of point estimates for pz + self.point_estimate_test = PointEstimateHist.build( + connections=dict(input=self.estimate_bpz.io.output), + output=os.path.join(namer.get_data_dir(DataType.pdf, PdfType.nz), "output_point_estimate_test.hdf5"), + single_NZ=os.path.join(namer.get_data_dir(DataType.pdf, PdfType.nz), "single_NZ_point_estimate_test.hdf5"), + ) + + # a stage that assign objects into tomographic bins + + + # for each set of pixels in the depth bin, check the mean and width of the tomographic bin + + + From 0146bc2928eba623a668eb34a1bee8631d8f5c57 Mon Sep 17 00:00:00 2001 From: hangqianjun Date: Thu, 3 Aug 2023 14:40:26 -0700 Subject: [PATCH 03/10] added notebook --- nb/estimation/estimate_all_hsc.ipynb | 6 +- nb/examples/goldenspike/goldenspike.ipynb | 4 +- nb/examples/survey_nonuniform.ipynb | 327 ++++++++++++++++++ .../survey_nonuniformity.py | 87 ++--- 4 files changed, 361 insertions(+), 63 deletions(-) create mode 100644 nb/examples/survey_nonuniform.ipynb diff --git a/nb/estimation/estimate_all_hsc.ipynb b/nb/estimation/estimate_all_hsc.ipynb index 74a9cdd..c78aae1 100644 --- a/nb/estimation/estimate_all_hsc.ipynb +++ b/nb/estimation/estimate_all_hsc.ipynb @@ -471,9 +471,9 @@ ], "metadata": { "kernelspec": { - "display_name": "rail_env", + "display_name": "NERSC Python", "language": "python", - "name": "rail_env" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -485,7 +485,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.4" + "version": "3.9.7" } }, "nbformat": 4, diff --git a/nb/examples/goldenspike/goldenspike.ipynb b/nb/examples/goldenspike/goldenspike.ipynb index 1dd468c..78d36b5 100644 --- a/nb/examples/goldenspike/goldenspike.ipynb +++ b/nb/examples/goldenspike/goldenspike.ipynb @@ -105,7 +105,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "NERSC Python", "language": "python", "name": "python3" }, @@ -119,7 +119,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.10" + "version": "3.9.7" } }, "nbformat": 4, diff --git a/nb/examples/survey_nonuniform.ipynb b/nb/examples/survey_nonuniform.ipynb new file mode 100644 index 0000000..7511e33 --- /dev/null +++ b/nb/examples/survey_nonuniform.ipynb @@ -0,0 +1,327 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "62c833e4-fde5-4ba0-8406-966805b80ed2", + "metadata": {}, + "outputs": [], + "source": [ + "# usual imports\n", + "import os\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from rail.core.utils import RAILDIR\n", + "#from rail.estimation.algos.bpz_version.utils import RAIL_BPZ_DIR\n", + "from rail.pipelines.examples.survey_nonuniformity.survey_nonuniformity import SurveyNonuniformDegraderPipeline\n", + "from rail.core import common_params\n", + "from rail.pipelines.utils.name_factory import NameFactory, DataType, CatalogType, ModelType, PdfType\n", + "import qp\n", + "import ceci\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "db2a216d-7c15-4d45-b9d2-ca78fbdc8b27", + "metadata": {}, + "outputs": [], + "source": [ + "#change to your rail location\n", + "RAIL_BPZ_DIR = \"/path/to/your/rail/src/\"" + ] + }, + { + "cell_type": "markdown", + "id": "2d022101-7f7b-4fb1-abaa-f1a4243027f9", + "metadata": {}, + "source": [ + "### Define the bands, magnitude limits, and put them into a dictionary" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "64b4cc47-7ee0-461e-b574-1bbbdc0f2c15", + "metadata": {}, + "outputs": [], + "source": [ + "bands = 'grizy'\n", + "maglims = [27.66, 27.25, 26.6, 26.24, 25.35]\n", + "maglim_dict={}\n", + "for band,limx in zip(bands, maglims):\n", + " maglim_dict[f\"HSC{band}_cmodel_dered\"] = limx" + ] + }, + { + "cell_type": "markdown", + "id": "3b1fb970-14d6-4e0c-b330-e341b6cb6be5", + "metadata": {}, + "source": [ + "### Setting common parameters to all the stages in the estimation\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "682d2489-ba1b-4344-af95-728667e53528", + "metadata": {}, + "outputs": [], + "source": [ + "common_params.set_param_defaults(\n", + " bands=[f'HSC{band}_cmodel_dered' for band in bands], # bands\n", + " bandNames=\n", + " err_bands=[f'{band}_cmodel_magerr' for band in bands], # uncertainty bands\n", + " nondetect_val=np.nan,\n", + " ref_band='HSCi_cmodel_dered',\n", + " redshift_col='specz_redshift',\n", + " mag_limits=maglim_dict,\n", + " zmax=6.0, # set zmax to 6 for HSC\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f4ec67e4-21cd-4470-b007-ebe56bd0cfc0", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2c60136d-0f07-4d3b-9066-14dd1e58eaa7", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "25accc6c-b50b-4acc-bfeb-1f72034e6d7e", + "metadata": {}, + "source": [ + "### Set up the pipeline" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ba92106a-6ac6-42e3-822f-d5dcf30a5793", + "metadata": {}, + "outputs": [], + "source": [ + "pipe = EstimatePipeline()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6621e102-b0dd-4fb8-a524-6b4545189cf9", + "metadata": {}, + "outputs": [], + "source": [ + "namer = NameFactory()" + ] + }, + { + "cell_type": "markdown", + "id": "511c9722-9c09-44a1-8b7e-6d058a199297", + "metadata": {}, + "source": [ + "### Define parameters for each stage" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2a64eb7b-d67e-422d-a60a-ed0085bbf677", + "metadata": {}, + "outputs": [], + "source": [ + "pipe.flow_engine_train.config.update(n_samples=5)\n", + "pipe.obs_condition.config.update(spec_groupname = \"\", redshift_colname = 'specz_redshift')\n", + "pipe.estimate_bpz.config.update(spec_groupname = \"\", redshift_colname = 'specz_redshift')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ff0d1439-169b-45dc-b224-27cc3189aab9", + "metadata": {}, + "outputs": [], + "source": [ + "pipe_info = pipe.initialize(input_dict, dict(output_dir='.', log_dir='.', resume=True), None)\n" + ] + }, + { + "cell_type": "markdown", + "id": "e0b21b58-94ca-425a-bf23-aedcc34cf233", + "metadata": {}, + "source": [ + "### Save the pipeline into a yml file" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bcd3534c-ce25-48d9-a629-49ce17cdd279", + "metadata": {}, + "outputs": [], + "source": [ + "pipe.save('tmp_survey_nonuniformity.yml')" + ] + }, + { + "cell_type": "markdown", + "id": "333d990d-8050-4815-8329-74af6e94ada6", + "metadata": {}, + "source": [ + "### run pipeline" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7943d633-f27c-469b-944b-2ea79ee011ec", + "metadata": {}, + "outputs": [], + "source": [ + "import ceci\n", + "pr = ceci.Pipeline.read('tmp_survey_nonuniformity.yml')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a206fbe7-757e-4df6-803f-3abf170874de", + "metadata": {}, + "outputs": [], + "source": [ + "pr.run()" + ] + }, + { + "cell_type": "markdown", + "id": "5a507f0b-c130-4c74-b964-262f97c49629", + "metadata": {}, + "source": [ + "# Redshift distribution in each tomographic bins at different depth:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1761c908-9b6f-43f2-88c2-1614b48170eb", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8d104602-2715-4dc1-84c7-bf7c7123567e", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "828c9902-368c-4dcf-8b5d-3597c5004966", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "05e930d8-0855-4231-b2e1-1a67232a77a0", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Imported rail.hub\n", + "Imported rail.astro_tools\n", + "Imported rail.core\n", + "Imported rail.stages\n", + "Imported rail.bpz\n", + "Imported rail.cmnn\n", + "Imported rail.delight\n", + "Failed to import rail.dsps because: You need to have the SPS_HOME environment variable\n", + "Imported rail.flexzboost\n", + "Failed to import rail.gpz because: No module named 'rail.estimation.algos.gpz_v1'\n", + "Imported rail.pipelines\n", + "Failed to import rail.pzflow because: No module named 'rail.estimation.algos.pzflow'\n", + "Failed to import rail.sklearn because: cannot import name 'TanbleHandle' from 'rail.core.data' (/global/u2/q/qhang/desc/rail_base/src/rail/core/data.py)\n", + "Imported rail.som\n", + "Attached 12 base classes and 47 fully formed stages to rail.stages\n" + ] + } + ], + "source": [ + "# Various rail modules\n", + "import rail.stages\n", + "rail.stages.import_and_attach_all()\n", + "from rail.stages import *" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "8bf264eb-0f54-492e-a856-bd99498fcb9e", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'rail.tools.utilPhotometry'" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "### find where is Dereddener!\n", + "Dereddener.__module__" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fd59a161-64df-4be4-9bee-4b3bd08558ae", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "rail_dev", + "language": "python", + "name": "rail_dev" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/src/rail/pipelines/examples/survey_nonuniformity/survey_nonuniformity.py b/src/rail/pipelines/examples/survey_nonuniformity/survey_nonuniformity.py index 5d27232..0b2f375 100644 --- a/src/rail/pipelines/examples/survey_nonuniformity/survey_nonuniformity.py +++ b/src/rail/pipelines/examples/survey_nonuniformity/survey_nonuniformity.py @@ -5,14 +5,6 @@ import os import numpy as np -# Extra packages used by this pipeline -from astropy.io import fits -import healpy as hp -import pickle -import pandas as pd -from collections import OrderedDict -import yaml - # Various rail modules import rail.stages rail.stages.import_and_attach_all() @@ -23,34 +15,12 @@ import ceci -# other RAIL modules: -import tables_io - -from rail.core.data import TableHandle -from rail.core.stage import RailStage - -#import pzflow -#from pzflow import Flow -from rail.creation.engines.flowEngine import FlowCreator - -from rail.creation.degradation import observing_condition_degrader -from rail.creation.degradation.observing_condition_degrader import ObsCondition - -from rail.estimation.algos.flexzboost import Inform_FZBoost, FZBoost -from rail.estimation.algos.bpz_lite import BPZ_lite - -# also need to import the reddening stage -from rail.core.utilStages import Dereddener - namer = NameFactory() -#from rail.core.utils import RAILDIR -# for now we use MYDIR, change to something else later -MYDIR = "" -flow_file = os.path.join(MYDIR, 'rail/examples_data/goldenspike_data/data/pretrained_flow.pkl') - +from rail.core.utils import RAILDIR +flow_file = os.path.join(RAILDIR, 'rail/examples_data/goldenspike_data/data/pretrained_flow.pkl') -class SurveyNonuniformPipeline(RailPipeline): +class SurveyNonuniformDegraderPipeline(RailPipeline): def __init__(self): RailPipeline.__init__(self) @@ -59,54 +29,55 @@ def __init__(self): DS.__class__.allow_overwrite = True bands = ['u','g','r','i','z','y'] - band_dict = {band:f'mag_{band}_lsst' for band in bands} - rename_dict = {f'mag_{band}_lsst_err':f'mag_err_{band}_lsst' for band in bands} + #band_dict = {band:f'mag_{band}_lsst' for band in bands} + #rename_dict = {f'mag_{band}_lsst_err':f'mag_err_{band}_lsst' for band in bands} - # load pretrained flowmodel + ### Creation steps: + + # This may be changed later self.flow_engine_train = FlowCreator.build( model=flow_file, - n_samples=50, - seed=1235, + n_samples=10, output=os.path.join(namer.get_data_dir(DataType.catalog, CatalogType.created), "output_flow_engine_train.pq"), ) - # Here we need to convert semi major minor axies - - # apply LSST error model with maps - self.obs_condition_train = ObsCondition.build( + self.obs_condition = ObsCondition.build( connections=dict(input=self.flow_engine_train.io.output), - bandNames=band_dict, seed=29, - output=os.path.join(namer.get_data_dir(DataType.catalog, CatalogType.degraded), "output_lsst_error_model_train.pq"), + output=os.path.join(namer.get_data_dir(DataType.catalog, CatalogType.degraded), "output_obscondition.pq"), ) - # deredden + ### Estimation steps: + self.deredden = Dereddener.build( - connections=dict(input=self.obs_condition_train.io.output), - bandNames=band_dict, - output=os.path.join(namer.get_data_dir(DataType.catalog, CatalogType.degraded), "output_lsst_error_model_deredden_train.pq"), + connections=dict(input=self.obs_condition.io.output), + output=os.path.join(namer.get_data_dir(DataType.catalog, CatalogType.degraded), "output_deredden.pq"), ) - # use BPZ to estimate redshifts: - self.estimate_bpz = BPZ_lite.build( - connections=dict( - input=self.table_conv_test.io.output, - model=self.inform_bpz.io.model, - ), + self.estimate_bpz = BPZliteEstimator.build( + connections=dict(input=self.deredden.io.output,), hdf5_groupname='', output=os.path.join(namer.get_data_dir(DataType.pdf, PdfType.pz), "output_estimate_bpz.hdf5"), ) + """ # some sort of point estimates for pz self.point_estimate_test = PointEstimateHist.build( connections=dict(input=self.estimate_bpz.io.output), output=os.path.join(namer.get_data_dir(DataType.pdf, PdfType.nz), "output_point_estimate_test.hdf5"), single_NZ=os.path.join(namer.get_data_dir(DataType.pdf, PdfType.nz), "single_NZ_point_estimate_test.hdf5"), ) + """ - # a stage that assign objects into tomographic bins + ### Tomographic binning - - # for each set of pixels in the depth bin, check the mean and width of the tomographic bin - + self.tomopraphy = UniformBinningClassifier.build( + connections=dict(input=self.estimate_bpz.io.output), + output=os.path.join(namer.get_data_dir(DataType.pdf, PdfType.pz), "output_tomography.hdf5"), + ) +if __name__ == '__main__': + pipe = SurveyNonuniformDegraderPipeline() + pipe.flow_engine_train.config.update(n_samples=5) + pipe.initialize(dict(model=flow_file), dict(output_dir='.', log_dir='.', resume=False), None) + pipe.save('tmp_survey_nonuniformity.yml') From 43089bf42207713e0f240e40b313882ae9e66592 Mon Sep 17 00:00:00 2001 From: hangqianjun Date: Thu, 3 Aug 2023 15:32:32 -0700 Subject: [PATCH 04/10] adding renameDict --- nb/examples/survey_nonuniform.ipynb | 173 +++++++++++------- .../examples/goldenspike/goldenspike.py | 2 +- .../survey_nonuniformity.py | 29 ++- 3 files changed, 126 insertions(+), 78 deletions(-) diff --git a/nb/examples/survey_nonuniform.ipynb b/nb/examples/survey_nonuniform.ipynb index 7511e33..4a52501 100644 --- a/nb/examples/survey_nonuniform.ipynb +++ b/nb/examples/survey_nonuniform.ipynb @@ -41,16 +41,18 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "64b4cc47-7ee0-461e-b574-1bbbdc0f2c15", - "metadata": {}, + "execution_count": 5, + "id": "92e175b0-bcf4-4777-a165-a95afe061627", + "metadata": { + "tags": [] + }, "outputs": [], "source": [ "bands = 'grizy'\n", - "maglims = [27.66, 27.25, 26.6, 26.24, 25.35]\n", + "maglims = [27.79, 29.04, 29.06, 28.62, 27.98, 27.05]\n", "maglim_dict={}\n", "for band,limx in zip(bands, maglims):\n", - " maglim_dict[f\"HSC{band}_cmodel_dered\"] = limx" + " maglim_dict[f\"mag_{band}_lsst\"] = limx" ] }, { @@ -69,33 +71,17 @@ "outputs": [], "source": [ "common_params.set_param_defaults(\n", - " bands=[f'HSC{band}_cmodel_dered' for band in bands], # bands\n", - " bandNames=\n", - " err_bands=[f'{band}_cmodel_magerr' for band in bands], # uncertainty bands\n", + " bands=[f'mag_{band}_lsst' for band in bands], # bands\n", + " err_bands=[f'mag_err_{band}_lsst' for band in bands], # uncertainty bands\n", " nondetect_val=np.nan,\n", - " ref_band='HSCi_cmodel_dered',\n", - " redshift_col='specz_redshift',\n", + " #ref_band='HSCi_cmodel_dered',\n", + " redshift_col='redshift',\n", " mag_limits=maglim_dict,\n", - " zmax=6.0, # set zmax to 6 for HSC\n", + " prior_band=\"i\",\n", + " #zmax=6.0, # set zmax to 6 for HSC\n", ")" ] }, - { - "cell_type": "code", - "execution_count": null, - "id": "f4ec67e4-21cd-4470-b007-ebe56bd0cfc0", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "2c60136d-0f07-4d3b-9066-14dd1e58eaa7", - "metadata": {}, - "outputs": [], - "source": [] - }, { "cell_type": "markdown", "id": "25accc6c-b50b-4acc-bfeb-1f72034e6d7e", @@ -111,7 +97,7 @@ "metadata": {}, "outputs": [], "source": [ - "pipe = EstimatePipeline()" + "pipe = SurveyNonuniformDegraderPipeline()" ] }, { @@ -132,6 +118,88 @@ "### Define parameters for each stage" ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "59a4a0bf-f5a2-4e15-a38a-7536b2d89700", + "metadata": {}, + "outputs": [], + "source": [ + "# dictionary used by ObsCondition\n", + "# first define a set of input map directories:\n", + "\n", + "base_path = \"/pscratch/sd/q/qhang/rubin_baseline_v2/MAF-1year/\"\n", + "\n", + "# nside of these maps:\n", + "nside=128\n", + "\n", + "# seeing maps:\n", + "seeing_u = base_path + \"baseline_v2_0_10yrs_Median_seeingFwhmEff_u_and_nightlt365_HEAL.fits\"\n", + "seeing_g = base_path + \"baseline_v2_0_10yrs_Median_seeingFwhmEff_g_and_nightlt365_HEAL.fits\"\n", + "seeing_r = base_path + \"baseline_v2_0_10yrs_Median_seeingFwhmEff_r_and_nightlt365_HEAL.fits\"\n", + "seeing_i = base_path + \"baseline_v2_0_10yrs_Median_seeingFwhmEff_i_and_nightlt365_HEAL.fits\"\n", + "seeing_z = base_path + \"baseline_v2_0_10yrs_Median_seeingFwhmEff_z_and_nightlt365_HEAL.fits\"\n", + "seeing_y = base_path + \"baseline_v2_0_10yrs_Median_seeingFwhmEff_y_and_nightlt365_HEAL.fits\"\n", + "\n", + "# coadd depth maps:\n", + "coaddm5_u = base_path + \"baseline_v2_0_10yrs_CoaddM5_u_and_nightlt365_HEAL.fits\"\n", + "coaddm5_g = base_path + \"baseline_v2_0_10yrs_CoaddM5_g_and_nightlt365_HEAL.fits\"\n", + "coaddm5_r = base_path + \"baseline_v2_0_10yrs_CoaddM5_r_and_nightlt365_HEAL.fits\"\n", + "coaddm5_i = base_path + \"baseline_v2_0_10yrs_CoaddM5_i_and_nightlt365_HEAL.fits\"\n", + "coaddm5_z = base_path + \"baseline_v2_0_10yrs_CoaddM5_z_and_nightlt365_HEAL.fits\"\n", + "coaddm5_y = base_path + \"baseline_v2_0_10yrs_CoaddM5_y_and_nightlt365_HEAL.fits\"\n", + "\n", + "# here we will set the observing year and number of visits per year to 1, because we are supplying coadd depth\n", + "\n", + "# mask:\n", + "maskdir = base_path + \"../wfd_footprint_nvisitcut_500_nside_128.fits\"\n", + "\n", + "# weight: for now we supply uniform weight\n", + "\n", + "# choose the systematic map to examine, here we choose the combined depth:\n", + "sys_to_check = base_path + \"baseline_v2_0_10yrs_CoaddM5_i_and_nightlt365_HEAL.fits\"\n", + "sys = \"CoaddM5\"\n", + "\n", + "# directory to save all the data:\n", + "savedir = \"/pscratch/sd/q/qhang/PZflow-samples/DC2-test/\"\n", + "\n", + "map_dict={\n", + " \"theta\": {\n", + " \"u\": seeing_u,\n", + " \"g\": seeing_g,\n", + " \"r\": seeing_r,\n", + " \"i\": seeing_i,\n", + " \"z\": seeing_z,\n", + " \"y\": seeing_y,\n", + " },\n", + " \"m5\": {\n", + " \"u\": coaddm5_u,\n", + " \"g\": coaddm5_g,\n", + " \"r\": coaddm5_r,\n", + " \"i\": coaddm5_i,\n", + " \"z\": coaddm5_z,\n", + " \"y\": coaddm5_y,\n", + " },\n", + " \"nYrObs\": 1.,\n", + " \"nVisYr\": {\n", + " \"u\": 1.,\n", + " \"g\": 1.,\n", + " \"r\": 1.,\n", + " \"i\": 1.,\n", + " \"z\": 1.,\n", + " \"y\": 1., \n", + " },\n", + " \"sigLim\": 10,\n", + " \"ndFlag\": np.nan,\n", + " \"extendedType\": \"auto\",\n", + " \"majorCol\": \"major\",\n", + " \"minorCol\": \"minor\",\n", + " \"decorrelate\": True,\n", + " \"highSNR\": False,\n", + " \"renameDict\": band_dict, \n", + " }" + ] + }, { "cell_type": "code", "execution_count": null, @@ -139,9 +207,9 @@ "metadata": {}, "outputs": [], "source": [ - "pipe.flow_engine_train.config.update(n_samples=5)\n", - "pipe.obs_condition.config.update(spec_groupname = \"\", redshift_colname = 'specz_redshift')\n", - "pipe.estimate_bpz.config.update(spec_groupname = \"\", redshift_colname = 'specz_redshift')" + "pipe.flow_engine_train.config.update(n_samples=20)\n", + "pipe.obs_condition.config.update(map_dict=map_dict, nside=nside, mask = maskdir, weight = \"\",)\n", + "#pipe.estimate_bpz.config.update(spec_groupname = \"\", redshift_colname = 'specz_redshift')" ] }, { @@ -151,7 +219,7 @@ "metadata": {}, "outputs": [], "source": [ - "pipe_info = pipe.initialize(input_dict, dict(output_dir='.', log_dir='.', resume=True), None)\n" + "pipe_info = pipe.initialize(input_dict, dict(output_dir='.', log_dir='.', resume=True), None)" ] }, { @@ -235,34 +303,12 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "05e930d8-0855-4231-b2e1-1a67232a77a0", "metadata": { "tags": [] }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Imported rail.hub\n", - "Imported rail.astro_tools\n", - "Imported rail.core\n", - "Imported rail.stages\n", - "Imported rail.bpz\n", - "Imported rail.cmnn\n", - "Imported rail.delight\n", - "Failed to import rail.dsps because: You need to have the SPS_HOME environment variable\n", - "Imported rail.flexzboost\n", - "Failed to import rail.gpz because: No module named 'rail.estimation.algos.gpz_v1'\n", - "Imported rail.pipelines\n", - "Failed to import rail.pzflow because: No module named 'rail.estimation.algos.pzflow'\n", - "Failed to import rail.sklearn because: cannot import name 'TanbleHandle' from 'rail.core.data' (/global/u2/q/qhang/desc/rail_base/src/rail/core/data.py)\n", - "Imported rail.som\n", - "Attached 12 base classes and 47 fully formed stages to rail.stages\n" - ] - } - ], + "outputs": [], "source": [ "# Various rail modules\n", "import rail.stages\n", @@ -272,23 +318,12 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "8bf264eb-0f54-492e-a856-bd99498fcb9e", "metadata": { "tags": [] }, - "outputs": [ - { - "data": { - "text/plain": [ - "'rail.tools.utilPhotometry'" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "### find where is Dereddener!\n", "Dereddener.__module__" diff --git a/src/rail/pipelines/examples/goldenspike/goldenspike.py b/src/rail/pipelines/examples/goldenspike/goldenspike.py index 9b5b162..698e599 100644 --- a/src/rail/pipelines/examples/goldenspike/goldenspike.py +++ b/src/rail/pipelines/examples/goldenspike/goldenspike.py @@ -41,7 +41,7 @@ def __init__(self): self.lsst_error_model_train = LSSTErrorModel.build( connections=dict(input=self.flow_engine_train.io.output), - bandNames=band_dict, seed=29, + renameDict=band_dict, seed=29, output=os.path.join(namer.get_data_dir(DataType.catalog, CatalogType.degraded), "output_lsst_error_model_train.pq"), ) diff --git a/src/rail/pipelines/examples/survey_nonuniformity/survey_nonuniformity.py b/src/rail/pipelines/examples/survey_nonuniformity/survey_nonuniformity.py index 0b2f375..8f082f8 100644 --- a/src/rail/pipelines/examples/survey_nonuniformity/survey_nonuniformity.py +++ b/src/rail/pipelines/examples/survey_nonuniformity/survey_nonuniformity.py @@ -28,11 +28,9 @@ def __init__(self): DS = RailStage.data_store DS.__class__.allow_overwrite = True - bands = ['u','g','r','i','z','y'] - #band_dict = {band:f'mag_{band}_lsst' for band in bands} - #rename_dict = {f'mag_{band}_lsst_err':f'mag_err_{band}_lsst' for band in bands} - ### Creation steps: + bands = ['u','g','r','i','z','y'] + rename_dict = {f'mag_{band}_lsst_err':f'mag_err_{band}_lsst' for band in bands} # This may be changed later self.flow_engine_train = FlowCreator.build( @@ -42,19 +40,35 @@ def __init__(self): ) self.obs_condition = ObsCondition.build( - connections=dict(input=self.flow_engine_train.io.output), + connections=dict(input=self.flow_engine_train.io.output), output=os.path.join(namer.get_data_dir(DataType.catalog, CatalogType.degraded), "output_obscondition.pq"), ) + self.col_remapper_train = ColumnMapper.build( + connections=dict(input=self.obs_condition.io.output), + columns=rename_dict, + output=os.path.join(namer.get_data_dir(DataType.catalog, CatalogType.degraded), "output_col_remapper_train.pq"), + ) + ### Estimation steps: self.deredden = Dereddener.build( - connections=dict(input=self.obs_condition.io.output), + connections=dict(input=self.col_remapper_train.io.output), output=os.path.join(namer.get_data_dir(DataType.catalog, CatalogType.degraded), "output_deredden.pq"), ) + self.inform_bpz = BPZliteInformer.build( + connections=dict(input=self.table_conv_train.io.output), + model=os.path.join(namer.get_data_dir(DataType.model, ModelType.estimator), 'trained_BPZ.pkl'), + hdf5_groupname='', + nt_array=[8], + mmax=26., + type_file='', + ) + self.estimate_bpz = BPZliteEstimator.build( - connections=dict(input=self.deredden.io.output,), + connections=dict(input=self.deredden.output, + model=self.inform_bpz.io.model,), hdf5_groupname='', output=os.path.join(namer.get_data_dir(DataType.pdf, PdfType.pz), "output_estimate_bpz.hdf5"), ) @@ -78,6 +92,5 @@ def __init__(self): if __name__ == '__main__': pipe = SurveyNonuniformDegraderPipeline() - pipe.flow_engine_train.config.update(n_samples=5) pipe.initialize(dict(model=flow_file), dict(output_dir='.', log_dir='.', resume=False), None) pipe.save('tmp_survey_nonuniformity.yml') From 330d8898f54a39460a5ac965f489cde659137cb4 Mon Sep 17 00:00:00 2001 From: hangqianjun Date: Fri, 4 Aug 2023 15:17:54 -0700 Subject: [PATCH 05/10] notebook changes --- nb/examples/survey_nonuniform.ipynb | 237 ++++++++++++++++++++++------ 1 file changed, 192 insertions(+), 45 deletions(-) diff --git a/nb/examples/survey_nonuniform.ipynb b/nb/examples/survey_nonuniform.ipynb index 4a52501..28af886 100644 --- a/nb/examples/survey_nonuniform.ipynb +++ b/nb/examples/survey_nonuniform.ipynb @@ -2,10 +2,32 @@ "cells": [ { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "62c833e4-fde5-4ba0-8406-966805b80ed2", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Imported rail.hub\n", + "Imported rail.astro_tools\n", + "Imported rail.core\n", + "Imported rail.stages\n", + "Imported rail.bpz\n", + "Imported rail.cmnn\n", + "Imported rail.delight\n", + "Failed to import rail.dsps because: You need to have the SPS_HOME environment variable\n", + "Imported rail.flexzboost\n", + "Failed to import rail.gpz because: No module named 'rail.estimation.algos.gpz_v1'\n", + "Imported rail.pipelines\n", + "Failed to import rail.pzflow because: No module named 'rail.estimation.algos.pzflow'\n", + "Imported rail.sklearn\n", + "Imported rail.som\n", + "Attached 12 base classes and 49 fully formed stages to rail.stages\n" + ] + } + ], "source": [ "# usual imports\n", "import os\n", @@ -17,18 +39,16 @@ "from rail.core import common_params\n", "from rail.pipelines.utils.name_factory import NameFactory, DataType, CatalogType, ModelType, PdfType\n", "import qp\n", - "import ceci\n" + "import ceci" ] }, { - "cell_type": "code", - "execution_count": null, - "id": "db2a216d-7c15-4d45-b9d2-ca78fbdc8b27", + "cell_type": "raw", + "id": "a973ca0e-b63b-43b4-a952-9cd3d26c1034", "metadata": {}, - "outputs": [], "source": [ "#change to your rail location\n", - "RAIL_BPZ_DIR = \"/path/to/your/rail/src/\"" + "RAIL_BPZ_DIR = \"/path/to/your/rail/bpz/src/\"" ] }, { @@ -41,7 +61,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 8, "id": "92e175b0-bcf4-4777-a165-a95afe061627", "metadata": { "tags": [] @@ -65,7 +85,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "id": "682d2489-ba1b-4344-af95-728667e53528", "metadata": {}, "outputs": [], @@ -77,7 +97,6 @@ " #ref_band='HSCi_cmodel_dered',\n", " redshift_col='redshift',\n", " mag_limits=maglim_dict,\n", - " prior_band=\"i\",\n", " #zmax=6.0, # set zmax to 6 for HSC\n", ")" ] @@ -92,19 +111,70 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "id": "ba92106a-6ac6-42e3-822f-d5dcf30a5793", - "metadata": {}, - "outputs": [], + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Inserting handle into data store. model: /global/u2/q/qhang/desc/rail_base/src/rail/examples_data/goldenspike_data/data/pretrained_flow.pkl, flow_engine_train\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023-08-03 15:58:44.859000: E external/xla/xla/stream_executor/cuda/cuda_dnn.cc:445] Could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR\n", + "2023-08-03 15:58:44.859049: E external/xla/xla/stream_executor/cuda/cuda_dnn.cc:449] Memory usage: 3276800 bytes free, 42297524224 bytes total.\n" + ] + }, + { + "ename": "XlaRuntimeError", + "evalue": "FAILED_PRECONDITION: DNN library initialization failed. Look at the errors above for more details.", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mXlaRuntimeError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[11], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m pipe \u001b[38;5;241m=\u001b[39m \u001b[43mSurveyNonuniformDegraderPipeline\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/global/u2/q/qhang/desc/rail_pipelines/src/rail/pipelines/examples/survey_nonuniformity/survey_nonuniformity.py:36\u001b[0m, in \u001b[0;36mSurveyNonuniformDegraderPipeline.__init__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 33\u001b[0m rename_dict \u001b[38;5;241m=\u001b[39m {\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmag_\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mband\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m_lsst_err\u001b[39m\u001b[38;5;124m'\u001b[39m:\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmag_err_\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mband\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m_lsst\u001b[39m\u001b[38;5;124m'\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m band \u001b[38;5;129;01min\u001b[39;00m bands}\n\u001b[1;32m 35\u001b[0m \u001b[38;5;66;03m# This may be changed later\u001b[39;00m\n\u001b[0;32m---> 36\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mflow_engine_train\u001b[49m \u001b[38;5;241m=\u001b[39m FlowCreator\u001b[38;5;241m.\u001b[39mbuild(\n\u001b[1;32m 37\u001b[0m model\u001b[38;5;241m=\u001b[39mflow_file,\n\u001b[1;32m 38\u001b[0m n_samples\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m10\u001b[39m,\n\u001b[1;32m 39\u001b[0m output\u001b[38;5;241m=\u001b[39mos\u001b[38;5;241m.\u001b[39mpath\u001b[38;5;241m.\u001b[39mjoin(namer\u001b[38;5;241m.\u001b[39mget_data_dir(DataType\u001b[38;5;241m.\u001b[39mcatalog, CatalogType\u001b[38;5;241m.\u001b[39mcreated), \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutput_flow_engine_train.pq\u001b[39m\u001b[38;5;124m\"\u001b[39m),\n\u001b[1;32m 40\u001b[0m )\n\u001b[1;32m 42\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mobs_condition \u001b[38;5;241m=\u001b[39m ObsCondition\u001b[38;5;241m.\u001b[39mbuild(\n\u001b[1;32m 43\u001b[0m connections\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mdict\u001b[39m(\u001b[38;5;28minput\u001b[39m\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mflow_engine_train\u001b[38;5;241m.\u001b[39mio\u001b[38;5;241m.\u001b[39moutput), \n\u001b[1;32m 44\u001b[0m output\u001b[38;5;241m=\u001b[39mos\u001b[38;5;241m.\u001b[39mpath\u001b[38;5;241m.\u001b[39mjoin(namer\u001b[38;5;241m.\u001b[39mget_data_dir(DataType\u001b[38;5;241m.\u001b[39mcatalog, CatalogType\u001b[38;5;241m.\u001b[39mdegraded), \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutput_obscondition.pq\u001b[39m\u001b[38;5;124m\"\u001b[39m),\n\u001b[1;32m 45\u001b[0m )\n\u001b[1;32m 47\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcol_remapper_train \u001b[38;5;241m=\u001b[39m ColumnMapper\u001b[38;5;241m.\u001b[39mbuild(\n\u001b[1;32m 48\u001b[0m connections\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mdict\u001b[39m(\u001b[38;5;28minput\u001b[39m\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mobs_condition\u001b[38;5;241m.\u001b[39mio\u001b[38;5;241m.\u001b[39moutput),\n\u001b[1;32m 49\u001b[0m columns\u001b[38;5;241m=\u001b[39mrename_dict,\n\u001b[1;32m 50\u001b[0m output\u001b[38;5;241m=\u001b[39mos\u001b[38;5;241m.\u001b[39mpath\u001b[38;5;241m.\u001b[39mjoin(namer\u001b[38;5;241m.\u001b[39mget_data_dir(DataType\u001b[38;5;241m.\u001b[39mcatalog, CatalogType\u001b[38;5;241m.\u001b[39mdegraded), \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutput_col_remapper_train.pq\u001b[39m\u001b[38;5;124m\"\u001b[39m),\n\u001b[1;32m 51\u001b[0m )\n", + "File \u001b[0;32m/global/u2/q/qhang/desc/rail_base/src/rail/core/stage.py:83\u001b[0m, in \u001b[0;36mRailPipeline.__setattr__\u001b[0;34m(self, name, value)\u001b[0m\n\u001b[1;32m 81\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__setattr__\u001b[39m(\u001b[38;5;28mself\u001b[39m, name, value):\n\u001b[1;32m 82\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(value, RailStageBuild):\n\u001b[0;32m---> 83\u001b[0m stage \u001b[38;5;241m=\u001b[39m \u001b[43mvalue\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbuild\u001b[49m\u001b[43m(\u001b[49m\u001b[43mname\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 84\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39madd_stage(stage)\n\u001b[1;32m 85\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m stage\n", + "File \u001b[0;32m/global/u2/q/qhang/desc/rail_base/src/rail/core/stage.py:63\u001b[0m, in \u001b[0;36mRailStageBuild.build\u001b[0;34m(self, name)\u001b[0m\n\u001b[1;32m 49\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mbuild\u001b[39m(\u001b[38;5;28mself\u001b[39m, name):\n\u001b[1;32m 50\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Actually build the stage, this is called by the pipeline the stage\u001b[39;00m\n\u001b[1;32m 51\u001b[0m \u001b[38;5;124;03m belongs to\u001b[39;00m\n\u001b[1;32m 52\u001b[0m \n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 61\u001b[0m \u001b[38;5;124;03m The newly built stage\u001b[39;00m\n\u001b[1;32m 62\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m---> 63\u001b[0m stage \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstage_class\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmake_and_connect\u001b[49m\u001b[43m(\u001b[49m\u001b[43mname\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mname\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_kwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 64\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m stage\n", + "File \u001b[0;32m/global/u2/q/qhang/desc/rail_base/src/rail/core/stage.py:160\u001b[0m, in \u001b[0;36mRailStage.make_and_connect\u001b[0;34m(cls, **kwargs)\u001b[0m\n\u001b[1;32m 144\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"Make a stage and connects it to other stages\u001b[39;00m\n\u001b[1;32m 145\u001b[0m \n\u001b[1;32m 146\u001b[0m \u001b[38;5;124;03mNotes\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 157\u001b[0m \u001b[38;5;124;03mA stage\u001b[39;00m\n\u001b[1;32m 158\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 159\u001b[0m connections \u001b[38;5;241m=\u001b[39m kwargs\u001b[38;5;241m.\u001b[39mpop(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mconnections\u001b[39m\u001b[38;5;124m'\u001b[39m, {})\n\u001b[0;32m--> 160\u001b[0m stage \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mcls\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmake_stage\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 161\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m key, val \u001b[38;5;129;01min\u001b[39;00m connections\u001b[38;5;241m.\u001b[39mitems():\n\u001b[1;32m 162\u001b[0m stage\u001b[38;5;241m.\u001b[39mset_data(key, val, do_read\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m)\n", + "File \u001b[0;32m~/.conda/envs/rail_dev/lib/python3.11/site-packages/ceci/stage.py:115\u001b[0m, in \u001b[0;36mPipelineStage.make_stage\u001b[0;34m(cls, **kwargs)\u001b[0m\n\u001b[1;32m 113\u001b[0m aliases[outtag] \u001b[38;5;241m=\u001b[39m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mouttag\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m_\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mname\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 114\u001b[0m kwcopy[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124maliases\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m aliases\n\u001b[0;32m--> 115\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mcls\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mkwcopy\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcomm\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcomm\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/global/u2/q/qhang/desc/rail_pzflow/src/rail/creation/engines/flowEngine.py:181\u001b[0m, in \u001b[0;36mFlowCreator.__init__\u001b[0;34m(self, args, comm)\u001b[0m\n\u001b[1;32m 176\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__init__\u001b[39m(\u001b[38;5;28mself\u001b[39m, args, comm\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m):\n\u001b[1;32m 177\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Constructor\u001b[39;00m\n\u001b[1;32m 178\u001b[0m \n\u001b[1;32m 179\u001b[0m \u001b[38;5;124;03m Does standard Creator initialization and also gets the `Flow` object\u001b[39;00m\n\u001b[1;32m 180\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m--> 181\u001b[0m \u001b[43mCreator\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[38;5;21;43m__init__\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcomm\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcomm\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/global/u2/q/qhang/desc/rail_base/src/rail/creation/engine.py:65\u001b[0m, in \u001b[0;36mCreator.__init__\u001b[0;34m(self, args, comm)\u001b[0m\n\u001b[1;32m 63\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(args, \u001b[38;5;28mdict\u001b[39m): \u001b[38;5;66;03m# pragma: no cover\u001b[39;00m\n\u001b[1;32m 64\u001b[0m args \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mvars\u001b[39m(args)\n\u001b[0;32m---> 65\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mopen_model\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/global/u2/q/qhang/desc/rail_base/src/rail/creation/engine.py:87\u001b[0m, in \u001b[0;36mCreator.open_model\u001b[0;34m(self, **kwargs)\u001b[0m\n\u001b[1;32m 85\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mmodel\n\u001b[1;32m 86\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(model, \u001b[38;5;28mstr\u001b[39m): \u001b[38;5;66;03m# pragma: no cover\u001b[39;00m\n\u001b[0;32m---> 87\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mmodel \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mset_data\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mmodel\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdata\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpath\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmodel\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 88\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mconfig[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmodel\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m model\n\u001b[1;32m 89\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mmodel\n", + "File \u001b[0;32m/global/u2/q/qhang/desc/rail_base/src/rail/core/stage.py:294\u001b[0m, in \u001b[0;36mRailStage.set_data\u001b[0;34m(self, tag, data, path, do_read)\u001b[0m\n\u001b[1;32m 292\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m handle\u001b[38;5;241m.\u001b[39mhas_data:\n\u001b[1;32m 293\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m arg_data \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m do_read:\n\u001b[0;32m--> 294\u001b[0m \u001b[43mhandle\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mread\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 295\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m arg_data \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 296\u001b[0m handle\u001b[38;5;241m.\u001b[39mdata \u001b[38;5;241m=\u001b[39m arg_data\n", + "File \u001b[0;32m/global/u2/q/qhang/desc/rail_base/src/rail/core/data.py:62\u001b[0m, in \u001b[0;36mDataHandle.read\u001b[0;34m(self, force, **kwargs)\u001b[0m\n\u001b[1;32m 60\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdata \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m force:\n\u001b[1;32m 61\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdata\n\u001b[0;32m---> 62\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mset_data(\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_read\u001b[49m\u001b[43m(\u001b[49m\u001b[43mos\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mpath\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mexpandvars\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mpath\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m)\n\u001b[1;32m 63\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdata\n", + "File \u001b[0;32m/global/u2/q/qhang/desc/rail_pzflow/src/rail/tools/flow_handle.py:52\u001b[0m, in \u001b[0;36mFlowHandle._read\u001b[0;34m(cls, path, **kwargs)\u001b[0m\n\u001b[1;32m 49\u001b[0m \u001b[38;5;129m@classmethod\u001b[39m\n\u001b[1;32m 50\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_read\u001b[39m(\u001b[38;5;28mcls\u001b[39m, path, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 51\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Read and return the data from the associated file \"\"\"\u001b[39;00m\n\u001b[0;32m---> 52\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mcls\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mflow_factory\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mread\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpath\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/global/u2/q/qhang/desc/rail_pzflow/src/rail/tools/flow_handle.py:29\u001b[0m, in \u001b[0;36mFlowDict.read\u001b[0;34m(self, path, force)\u001b[0m\n\u001b[1;32m 27\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mpzflow\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m Flow\n\u001b[1;32m 28\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m force \u001b[38;5;129;01mor\u001b[39;00m path \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m:\n\u001b[0;32m---> 29\u001b[0m flow \u001b[38;5;241m=\u001b[39m \u001b[43mFlow\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfile\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mpath\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 30\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;21m__setitem__\u001b[39m(path, flow)\n\u001b[1;32m 31\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m flow\n", + "File \u001b[0;32m~/.conda/envs/rail_dev/lib/python3.11/site-packages/pzflow/flow.py:184\u001b[0m, in \u001b[0;36mFlow.__init__\u001b[0;34m(self, data_columns, bijector, latent, conditional_columns, data_error_model, condition_error_model, autoscale_conditions, seed, info, file, _dictionary)\u001b[0m\n\u001b[1;32m 182\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_bijector_info \u001b[38;5;241m=\u001b[39m save_dict[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mbijector_info\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n\u001b[1;32m 183\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_bijector_info \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m--> 184\u001b[0m init_fun, _ \u001b[38;5;241m=\u001b[39m \u001b[43mbuild_bijector_from_info\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_bijector_info\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 185\u001b[0m _, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_inverse \u001b[38;5;241m=\u001b[39m init_fun(\n\u001b[1;32m 186\u001b[0m random\u001b[38;5;241m.\u001b[39mPRNGKey(\u001b[38;5;241m0\u001b[39m), \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_input_dim\n\u001b[1;32m 187\u001b[0m )\n\u001b[1;32m 188\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_params \u001b[38;5;241m=\u001b[39m save_dict[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mparams\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n", + "File \u001b[0;32m~/.conda/envs/rail_dev/lib/python3.11/site-packages/pzflow/utils.py:16\u001b[0m, in \u001b[0;36mbuild_bijector_from_info\u001b[0;34m(info)\u001b[0m\n\u001b[1;32m 14\u001b[0m \u001b[38;5;66;03m# recurse through chains\u001b[39;00m\n\u001b[1;32m 15\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m info[\u001b[38;5;241m0\u001b[39m] \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mChain\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[0;32m---> 16\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mbijectors\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mChain\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mbuild_bijector_from_info\u001b[49m\u001b[43m(\u001b[49m\u001b[43mi\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mi\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43minfo\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 17\u001b[0m \u001b[38;5;66;03m# build individual bijector from name and parameters\u001b[39;00m\n\u001b[1;32m 18\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 19\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mgetattr\u001b[39m(bijectors, info[\u001b[38;5;241m0\u001b[39m])(\u001b[38;5;241m*\u001b[39minfo[\u001b[38;5;241m1\u001b[39m])\n", + "File \u001b[0;32m~/.conda/envs/rail_dev/lib/python3.11/site-packages/pzflow/utils.py:16\u001b[0m, in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 14\u001b[0m \u001b[38;5;66;03m# recurse through chains\u001b[39;00m\n\u001b[1;32m 15\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m info[\u001b[38;5;241m0\u001b[39m] \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mChain\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[0;32m---> 16\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m bijectors\u001b[38;5;241m.\u001b[39mChain(\u001b[38;5;241m*\u001b[39m(\u001b[43mbuild_bijector_from_info\u001b[49m\u001b[43m(\u001b[49m\u001b[43mi\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;28;01mfor\u001b[39;00m i \u001b[38;5;129;01min\u001b[39;00m info[\u001b[38;5;241m1\u001b[39m]))\n\u001b[1;32m 17\u001b[0m \u001b[38;5;66;03m# build individual bijector from name and parameters\u001b[39;00m\n\u001b[1;32m 18\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 19\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mgetattr\u001b[39m(bijectors, info[\u001b[38;5;241m0\u001b[39m])(\u001b[38;5;241m*\u001b[39minfo[\u001b[38;5;241m1\u001b[39m])\n", + "File \u001b[0;32m~/.conda/envs/rail_dev/lib/python3.11/site-packages/pzflow/utils.py:19\u001b[0m, in \u001b[0;36mbuild_bijector_from_info\u001b[0;34m(info)\u001b[0m\n\u001b[1;32m 16\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m bijectors\u001b[38;5;241m.\u001b[39mChain(\u001b[38;5;241m*\u001b[39m(build_bijector_from_info(i) \u001b[38;5;28;01mfor\u001b[39;00m i \u001b[38;5;129;01min\u001b[39;00m info[\u001b[38;5;241m1\u001b[39m]))\n\u001b[1;32m 17\u001b[0m \u001b[38;5;66;03m# build individual bijector from name and parameters\u001b[39;00m\n\u001b[1;32m 18\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m---> 19\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mgetattr\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mbijectors\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minfo\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m)\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43minfo\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/.conda/envs/rail_dev/lib/python3.11/site-packages/pzflow/bijectors.py:118\u001b[0m, in \u001b[0;36mBijector.__call__\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 117\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__call__\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Tuple[InitFunction, Bijector_Info]:\n\u001b[0;32m--> 118\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_func\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/.conda/envs/rail_dev/lib/python3.11/site-packages/pzflow/bijectors.py:345\u001b[0m, in \u001b[0;36mInvSoftplus\u001b[0;34m(column_idx, sharpness)\u001b[0m\n\u001b[1;32m 316\u001b[0m \u001b[38;5;129m@Bijector\u001b[39m\n\u001b[1;32m 317\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mInvSoftplus\u001b[39m(\n\u001b[1;32m 318\u001b[0m column_idx: \u001b[38;5;28mint\u001b[39m, sharpness: \u001b[38;5;28mfloat\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m1\u001b[39m\n\u001b[1;32m 319\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Tuple[InitFunction, Bijector_Info]:\n\u001b[1;32m 320\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Bijector that applies inverse softplus to the specified column(s).\u001b[39;00m\n\u001b[1;32m 321\u001b[0m \n\u001b[1;32m 322\u001b[0m \u001b[38;5;124;03m Applying the inverse softplus ensures that samples from that column will\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 342\u001b[0m \u001b[38;5;124;03m This allows it to be recreated later.\u001b[39;00m\n\u001b[1;32m 343\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m--> 345\u001b[0m idx \u001b[38;5;241m=\u001b[39m \u001b[43mjnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43matleast_1d\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcolumn_idx\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 346\u001b[0m k \u001b[38;5;241m=\u001b[39m jnp\u001b[38;5;241m.\u001b[39matleast_1d(sharpness)\n\u001b[1;32m 347\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(idx) \u001b[38;5;241m!=\u001b[39m \u001b[38;5;28mlen\u001b[39m(k) \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(k) \u001b[38;5;241m!=\u001b[39m \u001b[38;5;241m1\u001b[39m:\n", + " \u001b[0;31m[... skipping hidden 14 frame]\u001b[0m\n", + "File \u001b[0;32m~/.conda/envs/rail_dev/lib/python3.11/site-packages/jax/_src/dispatch.py:464\u001b[0m, in \u001b[0;36mbackend_compile\u001b[0;34m(backend, module, options, host_callbacks)\u001b[0m\n\u001b[1;32m 459\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m backend\u001b[38;5;241m.\u001b[39mcompile(built_c, compile_options\u001b[38;5;241m=\u001b[39moptions,\n\u001b[1;32m 460\u001b[0m host_callbacks\u001b[38;5;241m=\u001b[39mhost_callbacks)\n\u001b[1;32m 461\u001b[0m \u001b[38;5;66;03m# Some backends don't have `host_callbacks` option yet\u001b[39;00m\n\u001b[1;32m 462\u001b[0m \u001b[38;5;66;03m# TODO(sharadmv): remove this fallback when all backends allow `compile`\u001b[39;00m\n\u001b[1;32m 463\u001b[0m \u001b[38;5;66;03m# to take in `host_callbacks`\u001b[39;00m\n\u001b[0;32m--> 464\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mbackend\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcompile\u001b[49m\u001b[43m(\u001b[49m\u001b[43mbuilt_c\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcompile_options\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moptions\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[0;31mXlaRuntimeError\u001b[0m: FAILED_PRECONDITION: DNN library initialization failed. Look at the errors above for more details." + ] + } + ], "source": [ "pipe = SurveyNonuniformDegraderPipeline()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "id": "6621e102-b0dd-4fb8-a524-6b4545189cf9", - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [], "source": [ "namer = NameFactory()" @@ -121,7 +191,7 @@ { "cell_type": "code", "execution_count": null, - "id": "59a4a0bf-f5a2-4e15-a38a-7536b2d89700", + "id": "526a1831-6094-4ff2-826b-0c3df8662b29", "metadata": {}, "outputs": [], "source": [ @@ -160,9 +230,6 @@ "sys_to_check = base_path + \"baseline_v2_0_10yrs_CoaddM5_i_and_nightlt365_HEAL.fits\"\n", "sys = \"CoaddM5\"\n", "\n", - "# directory to save all the data:\n", - "savedir = \"/pscratch/sd/q/qhang/PZflow-samples/DC2-test/\"\n", - "\n", "map_dict={\n", " \"theta\": {\n", " \"u\": seeing_u,\n", @@ -209,7 +276,7 @@ "source": [ "pipe.flow_engine_train.config.update(n_samples=20)\n", "pipe.obs_condition.config.update(map_dict=map_dict, nside=nside, mask = maskdir, weight = \"\",)\n", - "#pipe.estimate_bpz.config.update(spec_groupname = \"\", redshift_colname = 'specz_redshift')" + "pipe.estimate_bpz.config.update(spec_groupname = \"\", redshift_colname = 'redshift', prior_band='i',)" ] }, { @@ -283,7 +350,15 @@ "id": "1761c908-9b6f-43f2-88c2-1614b48170eb", "metadata": {}, "outputs": [], - "source": [] + "source": [ + "# tomographic bin n(z) at different depth:\n", + "\n", + "# load the specific systematic map & mask to check correlation\n", + "mapin = hp.read_map(sys_to_check)\n", + "mask = hp.read_map(maskdir)\n", + "# quantile contains pixel indices, and meanv is the mean value of the systematic maps in each quantile\n", + "quantile, meanv = split_sys_map_quantiles(mapin, mask, nquantiles=nquantiles)" + ] }, { "cell_type": "code", @@ -291,7 +366,27 @@ "id": "8d104602-2715-4dc1-84c7-bf7c7123567e", "metadata": {}, "outputs": [], - "source": [] + "source": [ + "# compute simple summary statistic\n", + "nzstat_summary_split={}\n", + "\n", + "for jj in range(npzbins):\n", + " nzstat_summary_split[\"tomo-%d\"%(jj+1)]={}\n", + " \n", + " ind0 = data_degraded_gold_tomo[\"tomo\"] == (jj+1)\n", + "\n", + " for ii in range(nquantiles):\n", + " ind = np.in1d(data_degraded_gold_tomo[\"pixels\"], quantile[ii])\n", + " ind = ind * ind0\n", + " usecat = data_degraded_gold_tomo.loc[ind, :]\n", + " # now for each tomographic bin, return redshift distribution:\n", + " nzstat_summary_split[\"tomo-%d\"%(jj+1)][ii] = compute_nzstats(usecat, z_col, \n", + " zgrid=zgrid, nbootstrap=nbootstrap)\n", + "\n", + " # compute the tot nz, meanz, sigmaz:\n", + " nzstat_summary_tot[\"tomo-%d\"%(jj+1)] = compute_nzstats(data_degraded_gold_tomo, z_col, \n", + " zgrid=zgrid, nbootstrap=nbootstrap)" + ] }, { "cell_type": "code", @@ -299,43 +394,95 @@ "id": "828c9902-368c-4dcf-8b5d-3597c5004966", "metadata": {}, "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "05e930d8-0855-4231-b2e1-1a67232a77a0", - "metadata": { - "tags": [] - }, - "outputs": [], "source": [ - "# Various rail modules\n", - "import rail.stages\n", - "rail.stages.import_and_attach_all()\n", - "from rail.stages import *" + "# write to file:\n", + "outroot = savedir + \"test-pz-with-i-band-coadd-Y1.yml\"\n", + "write_evaluation_results(outroot, meanv, nzstat_summary_split, nzstat_summary_tot)" ] }, { "cell_type": "code", "execution_count": null, - "id": "8bf264eb-0f54-492e-a856-bd99498fcb9e", - "metadata": { - "tags": [] - }, + "id": "10625947-c56f-4536-b8aa-72b64a0324a5", + "metadata": {}, "outputs": [], "source": [ - "### find where is Dereddener!\n", - "Dereddener.__module__" + "# Show results in a plot:\n", + "fig,axarr=plt.subplots(3,npzbins,figsize=[15,10],gridspec_kw={'height_ratios': [3, 1, 1]})\n", + "\n", + "## Top row: n(z) for each tomographic bin for each depth group\n", + "## Middle row: change in meanz as a function of depth with bootstrap errors\n", + "## Bottom row: change in sigmaz as a function of depth with boostrap errors\n", + "\n", + "for ii in range(npzbins):\n", + " \n", + " # top row\n", + " plt.sca(axarr[0,ii])\n", + " for q in range(nquantiles):\n", + " colorlab = q/(nquantiles*1.2)\n", + " nz = stat_summary_split[\"tomo-%d\"%(ii+1)][q][0]\n", + " plt.plot(nz[:,0], nz[:,1]/np.sum(nz[:,1])/(nz[1,0]-nz[0,0]), \n", + " color=cmap(colorlab))\n", + " plt.text(0.6, 3.5, \"tomo-%d\"%(ii+1))\n", + " plt.yticks([])\n", + " plt.xlabel(\"$z$\")\n", + " \n", + " # middle row\n", + " plt.sca(axarr[1, ii])\n", + " for q in range(nquantiles):\n", + " colorlab = q/(nquantiles*1.2)\n", + " \n", + " meanz = stat_summary_split[\"tomo-%d\"%(ii+1)][q][1]\n", + " meanztot = stat_summary_tot[\"tomo-%d\"%(ii+1)][q][1]\n", + " \n", + " plt.errorbar(meanv[q], meanz[0], yerr=meanz[1],fmt='o',\n", + " color=cmap(colorlab))\n", + " #dz = 0.005*(1+meanztot[0])\n", + " plt.plot(meanv, np.ones(len(meanv))*meanztot[0], 'k-', alpha=0.5)\n", + " #plt.fill_between([meanv[0], meanv[-1]], [-dz, -dz], \n", + " #[dz, dz],color='k',alpha=0.2)\n", + " if ii==0:\n", + " plt.ylabel(\"$\\\\langle z\\\\rangle$\")\n", + " if ii>0:\n", + " plt.yticks([])\n", + " #plt.xlabel(sys)\n", + " #plt.ylim([-0.015,0.015])\n", + " #plt.xlim([24.6, 25.7])\n", + " \n", + " # bottom row\n", + " plt.sca(axarr[2, ii])\n", + " for q in range(nquantiles):\n", + " colorlab = q/(nquantiles*1.2)\n", + " \n", + " sigmaz = stat_summary_split[\"tomo-%d\"%(ii+1)][q][2]\n", + " sigmaztot = stat_summary_tot[\"tomo-%d\"%(ii+1)][q][2]\n", + " \n", + " plt.errorbar(meanv[q], sigmaz[0], yerr=sigmaz[1],fmt='o',\n", + " color=cmap(colorlab))\n", + " #dz = 0.005\n", + " plt.plot(meanv, np.ones(len(meanv))*sigmaztot[0], 'k-', alpha=0.5)\n", + " #plt.fill_between([meanv[0], meanv[-1]], [-dz, -dz], \n", + " #[dz, dz],color='k',alpha=0.2)\n", + " if ii==0:\n", + " plt.ylabel(\"$\\\\sigma_z$\")\n", + " if ii>0:\n", + " plt.yticks([])\n", + " plt.xlabel(sys)\n", + " #plt.ylim([-0.015,0.015])\n", + "\n", + "plt.tight_layout()\n", + "plt.saveifg(savedir + 'fig.png', bbox_inches='tight')" ] }, { "cell_type": "code", "execution_count": null, - "id": "fd59a161-64df-4be4-9bee-4b3bd08558ae", + "id": "01ad28db-62c0-4f2f-abc2-fc4f6ee54c94", "metadata": {}, "outputs": [], - "source": [] + "source": [ + "###tests" + ] } ], "metadata": { From faa37408213bac85ed7f163980ef2605072f6f70 Mon Sep 17 00:00:00 2001 From: hangqianjun Date: Mon, 6 Nov 2023 02:08:59 -0800 Subject: [PATCH 06/10] from last updates --- nb/examples/survey_nonuniform.ipynb | 14 +++----------- .../survey_nonuniformity/survey_nonuniformity.py | 5 +++-- 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/nb/examples/survey_nonuniform.ipynb b/nb/examples/survey_nonuniform.ipynb index 28af886..e5f2f80 100644 --- a/nb/examples/survey_nonuniform.ipynb +++ b/nb/examples/survey_nonuniform.ipynb @@ -19,12 +19,12 @@ "Imported rail.delight\n", "Failed to import rail.dsps because: You need to have the SPS_HOME environment variable\n", "Imported rail.flexzboost\n", - "Failed to import rail.gpz because: No module named 'rail.estimation.algos.gpz_v1'\n", + "Imported rail.gpz\n", "Imported rail.pipelines\n", "Failed to import rail.pzflow because: No module named 'rail.estimation.algos.pzflow'\n", "Imported rail.sklearn\n", "Imported rail.som\n", - "Attached 12 base classes and 49 fully formed stages to rail.stages\n" + "Attached 12 base classes and 53 fully formed stages to rail.stages\n" ] } ], @@ -42,15 +42,6 @@ "import ceci" ] }, - { - "cell_type": "raw", - "id": "a973ca0e-b63b-43b4-a952-9cd3d26c1034", - "metadata": {}, - "source": [ - "#change to your rail location\n", - "RAIL_BPZ_DIR = \"/path/to/your/rail/bpz/src/\"" - ] - }, { "cell_type": "markdown", "id": "2d022101-7f7b-4fb1-abaa-f1a4243027f9", @@ -276,6 +267,7 @@ "source": [ "pipe.flow_engine_train.config.update(n_samples=20)\n", "pipe.obs_condition.config.update(map_dict=map_dict, nside=nside, mask = maskdir, weight = \"\",)\n", + "pipe.deredden.config.update(dustmap_dir=\".\",)# where to save the dust map downloaded\n", "pipe.estimate_bpz.config.update(spec_groupname = \"\", redshift_colname = 'redshift', prior_band='i',)" ] }, diff --git a/src/rail/pipelines/examples/survey_nonuniformity/survey_nonuniformity.py b/src/rail/pipelines/examples/survey_nonuniformity/survey_nonuniformity.py index 8f082f8..9e9697a 100644 --- a/src/rail/pipelines/examples/survey_nonuniformity/survey_nonuniformity.py +++ b/src/rail/pipelines/examples/survey_nonuniformity/survey_nonuniformity.py @@ -54,11 +54,12 @@ def __init__(self): self.deredden = Dereddener.build( connections=dict(input=self.col_remapper_train.io.output), + dustmap_dir=".", output=os.path.join(namer.get_data_dir(DataType.catalog, CatalogType.degraded), "output_deredden.pq"), ) self.inform_bpz = BPZliteInformer.build( - connections=dict(input=self.table_conv_train.io.output), + connections=dict(input=self.deredden.io.output), model=os.path.join(namer.get_data_dir(DataType.model, ModelType.estimator), 'trained_BPZ.pkl'), hdf5_groupname='', nt_array=[8], @@ -67,7 +68,7 @@ def __init__(self): ) self.estimate_bpz = BPZliteEstimator.build( - connections=dict(input=self.deredden.output, + connections=dict(input=self.deredden.io.output, model=self.inform_bpz.io.model,), hdf5_groupname='', output=os.path.join(namer.get_data_dir(DataType.pdf, PdfType.pz), "output_estimate_bpz.hdf5"), From 6971af726d9f72b67782ffc55c1132accfecd2a4 Mon Sep 17 00:00:00 2001 From: hangqianjun Date: Mon, 6 Nov 2023 02:25:04 -0800 Subject: [PATCH 07/10] updating local branch --- .../examples/goldenspike/tmp_goldenspike.yml | 98 ++++ .../goldenspike/tmp_goldenspike_config.yml | 502 ++++++++++++++++++ .../tmp_survey_nonuniformity.yml | 38 ++ .../tmp_survey_nonuniformity_config.yml | 176 ++++++ 4 files changed, 814 insertions(+) create mode 100644 src/rail/pipelines/examples/goldenspike/tmp_goldenspike.yml create mode 100644 src/rail/pipelines/examples/goldenspike/tmp_goldenspike_config.yml create mode 100644 src/rail/pipelines/examples/survey_nonuniformity/tmp_survey_nonuniformity.yml create mode 100644 src/rail/pipelines/examples/survey_nonuniformity/tmp_survey_nonuniformity_config.yml diff --git a/src/rail/pipelines/examples/goldenspike/tmp_goldenspike.yml b/src/rail/pipelines/examples/goldenspike/tmp_goldenspike.yml new file mode 100644 index 0000000..fa88a54 --- /dev/null +++ b/src/rail/pipelines/examples/goldenspike/tmp_goldenspike.yml @@ -0,0 +1,98 @@ +config: tmp_goldenspike_config.yml +inputs: + model: /global/u2/q/qhang/desc/rail_base/src/rail/examples_data/goldenspike_data/data/pretrained_flow.pkl +log_dir: . +modules: rail +output_dir: . +resume: false +site: + max_threads: 2 +stages: +- classname: FlowCreator + module_name: rail.creation.engines.flowEngine + name: flow_engine_train + nprocess: 1 +- classname: LSSTErrorModel + module_name: rail.creation.degradation.lsst_error_model + name: lsst_error_model_train + nprocess: 1 +- classname: InvRedshiftIncompleteness + module_name: rail.creation.degradation.spectroscopic_degraders + name: inv_redshift + nprocess: 1 +- classname: LineConfusion + module_name: rail.creation.degradation.spectroscopic_degraders + name: line_confusion + nprocess: 1 +- classname: QuantityCut + module_name: rail.creation.degradation.quantityCut + name: quantity_cut + nprocess: 1 +- classname: ColumnMapper + module_name: rail.core.utilStages + name: col_remapper_train + nprocess: 1 +- classname: TableConverter + module_name: rail.core.utilStages + name: table_conv_train + nprocess: 1 +- classname: FlowCreator + module_name: rail.creation.engines.flowEngine + name: flow_engine_test + nprocess: 1 +- classname: LSSTErrorModel + module_name: rail.creation.degradation.lsst_error_model + name: lsst_error_model_test + nprocess: 1 +- classname: ColumnMapper + module_name: rail.core.utilStages + name: col_remapper_test + nprocess: 1 +- classname: TableConverter + module_name: rail.core.utilStages + name: table_conv_test + nprocess: 1 +- classname: KNearNeighInformer + module_name: rail.estimation.algos.k_nearneigh + name: inform_knn + nprocess: 1 +- classname: FlexZBoostInformer + module_name: rail.estimation.algos.flexzboost + name: inform_fzboost + nprocess: 1 +- classname: BPZliteInformer + module_name: rail.estimation.algos.bpz_lite + name: inform_bpz + nprocess: 1 +- classname: BPZliteEstimator + module_name: rail.estimation.algos.bpz_lite + name: estimate_bpz + nprocess: 1 +- classname: KNearNeighEstimator + module_name: rail.estimation.algos.k_nearneigh + name: estimate_knn + nprocess: 1 +- classname: FlexZBoostEstimator + module_name: rail.estimation.algos.flexzboost + name: estimate_fzboost + nprocess: 1 +- classname: Evaluator + module_name: rail.evaluation.evaluator + name: bpz_eval + nprocess: 1 +- classname: Evaluator + module_name: rail.evaluation.evaluator + name: fzboost_eval + nprocess: 1 +- classname: Evaluator + module_name: rail.evaluation.evaluator + name: knn_eval + nprocess: 1 +- classname: PointEstHistSummarizer + module_name: rail.estimation.algos.point_est_hist + name: point_estimate_test + nprocess: 1 +- classname: NaiveStackSummarizer + module_name: rail.estimation.algos.naive_stack + name: naive_stack_test + nprocess: 1 diff --git a/src/rail/pipelines/examples/goldenspike/tmp_goldenspike_config.yml b/src/rail/pipelines/examples/goldenspike/tmp_goldenspike_config.yml new file mode 100644 index 0000000..96e391f --- /dev/null +++ b/src/rail/pipelines/examples/goldenspike/tmp_goldenspike_config.yml @@ -0,0 +1,502 @@ +bpz_eval: + aliases: + input: output_estimate_bpz + output: output_bpz_eval + truth: output_flow_engine_train + config: null + do_cde: true + input: None + name: bpz_eval + nzbins: 301 + output: pdf/pz/output_bpz_eval.pq + output_mode: default + pit_metrics: all + point_metrics: all + truth: None + zmax: 3.0 + zmin: 0.0 +col_remapper_test: + aliases: + input: output_lsst_error_model_test + output: output_col_remapper_test + chunk_size: 100000 + columns: &id001 + mag_g_lsst_err: mag_err_g_lsst + mag_i_lsst_err: mag_err_i_lsst + mag_r_lsst_err: mag_err_r_lsst + mag_u_lsst_err: mag_err_u_lsst + mag_y_lsst_err: mag_err_y_lsst + mag_z_lsst_err: mag_err_z_lsst + config: null + inplace: false + input: None + name: col_remapper_test + output: catalog/degraded/output_col_remapper_test.pq + output_mode: default +col_remapper_train: + aliases: + input: output_quantity_cut + output: output_col_remapper_train + chunk_size: 100000 + columns: *id001 + config: null + inplace: false + input: None + name: col_remapper_train + output: catalog/degraded/output_col_remapper_train.pq + output_mode: default +estimate_bpz: + aliases: + input: output_table_conv_test + model: model_inform_bpz + output: output_estimate_bpz + bands: &id002 + - mag_u_lsst + - mag_g_lsst + - mag_r_lsst + - mag_i_lsst + - mag_z_lsst + - mag_y_lsst + calculated_point_estimates: &id003 [] + chunk_size: 10000 + columns_file: /global/u2/q/qhang/desc/rail_bpz/src/rail/examples_data/estimation_data/configs/test_bpz.columns + config: null + data_path: None + dz: 0.01 + err_bands: &id004 + - mag_err_u_lsst + - mag_err_g_lsst + - mag_err_r_lsst + - mag_err_i_lsst + - mag_err_z_lsst + - mag_err_y_lsst + gauss_kernel: 0.0 + hdf5_groupname: '' + input: None + madau_flag: 'no' + mag_err_min: 0.005 + mag_limits: &id005 + mag_g_lsst: 29.04 + mag_i_lsst: 28.62 + mag_r_lsst: 29.06 + mag_u_lsst: 27.79 + mag_y_lsst: 27.05 + mag_z_lsst: 27.98 + model: None + name: estimate_bpz + no_prior: true + nondetect_val: 99.0 + nzbins: 301 + output: pdf/pz/output_estimate_bpz.hdf5 + output_mode: default + p_min: 0.005 + redshift_col: redshift + ref_band: mag_i_lsst + spectra_file: CWWSB4.list + unobserved_val: -99.0 + zmax: 3.0 + zmin: 0.0 + zp_errors: + - 0.01 + - 0.01 + - 0.01 + - 0.01 + - 0.01 + - 0.01 +estimate_fzboost: + aliases: + input: output_table_conv_test + model: model_inform_fzboost + output: output_estimate_fzboost + bands: *id002 + calculated_point_estimates: *id003 + chunk_size: 10000 + config: null + err_bands: *id004 + hdf5_groupname: '' + input: None + mag_limits: *id005 + model: None + name: estimate_fzboost + nondetect_val: .nan + nzbins: 301 + output: pdf/pz/output_estimate_FZBoost.hdf5 + output_mode: default + qp_representation: interp + ref_band: mag_i_lsst +estimate_knn: + aliases: + input: output_table_conv_test + model: model_inform_knn + output: output_estimate_knn + bands: *id002 + calculated_point_estimates: *id003 + chunk_size: 10000 + config: null + hdf5_groupname: '' + input: None + mag_limits: *id005 + model: None + name: estimate_knn + nondetect_val: .nan + nzbins: 301 + output: pdf/pz/output_estimate_knn.hdf5 + output_mode: default + redshift_col: redshift + ref_band: mag_i_lsst + zmax: 3.0 + zmin: 0.0 +flow_engine_test: + aliases: + output: output_flow_engine_test + config: null + model: /global/u2/q/qhang/desc/rail_base/src/rail/examples_data/goldenspike_data/data/pretrained_flow.pkl + n_samples: 50 + name: flow_engine_test + output: catalog/degraded/output_flow_engine_test.pq + output_mode: default + seed: 12345 +flow_engine_train: + aliases: + output: output_flow_engine_train + config: null + model: /global/u2/q/qhang/desc/rail_base/src/rail/examples_data/goldenspike_data/data/pretrained_flow.pkl + n_samples: 50 + name: flow_engine_train + output: catalog/created/output_flow_engine_train.pq + output_mode: default + seed: 1235 +fzboost_eval: + aliases: + input: output_estimate_fzboost + output: output_fzboost_eval + truth: output_flow_engine_train + config: null + do_cde: true + input: None + name: fzboost_eval + nzbins: 301 + output: pdf/pz/output_fzboost_eval.pq + output_mode: default + pit_metrics: all + point_metrics: all + truth: None + zmax: 3.0 + zmin: 0.0 +inform_bpz: + aliases: + input: output_table_conv_train + model: model_inform_bpz + bands: *id002 + columns_file: /global/u2/q/qhang/desc/rail_bpz/src/rail/examples_data/estimation_data/configs/test_bpz.columns + config: null + data_path: None + err_bands: *id004 + hdf5_groupname: '' + init_alpha: 1.8 + init_km: 0.1 + init_kt: 0.3 + init_zo: 0.4 + input: None + m0: 20.0 + mag_limits: *id005 + mmax: 26.0 + mmin: 18.0 + model: model/estimator/trained_BPZ.pkl + name: inform_bpz + nondetect_val: 99.0 + nt_array: + - 8 + nzbins: 301 + output_mode: default + redshift_col: redshift + ref_band: mag_i_lsst + save_train: true + spectra_file: CWWSB4.list + type_file: '' + zmax: 3.0 + zmin: 0.0 +inform_fzboost: + aliases: + input: output_table_conv_train + model: model_inform_fzboost + bands: *id002 + basis_system: cosine + bumpmax: 0.35 + bumpmin: 0.02 + config: null + err_bands: *id004 + hdf5_groupname: '' + input: None + mag_limits: *id005 + max_basis: 35 + model: model/estimator/fzboost.pkl + name: inform_fzboost + nbump: 20 + nondetect_val: 99.0 + nsharp: 15 + nzbins: 301 + output_mode: default + redshift_col: redshift + ref_band: mag_i_lsst + regression_params: + max_depth: 8 + objective: reg:squarederror + retrain_full: true + save_train: true + seed: 1138 + sharpmax: 2.1 + sharpmin: 0.7 + trainfrac: 0.75 + zmax: 3.0 + zmin: 0.0 +inform_knn: + aliases: + input: output_table_conv_train + model: model_inform_knn + bands: *id002 + config: null + hdf5_groupname: '' + input: None + leaf_size: 15 + mag_limits: *id005 + model: model/estimator/knnpz.pkl + name: inform_knn + ngrid_sigma: 10 + nneigh_max: 7 + nneigh_min: 3 + nondetect_val: .nan + nzbins: 301 + output_mode: default + redshift_col: redshift + ref_band: mag_i_lsst + save_train: true + seed: 0 + sigma_grid_max: 0.075 + sigma_grid_min: 0.01 + trainfrac: 0.75 + zmax: 3.0 + zmin: 0.0 +inv_redshift: + aliases: + input: output_lsst_error_model_train + output: output_inv_redshift + config: null + input: None + name: inv_redshift + output: catalog/degraded/output_inv_redshift.pq + output_mode: default + pivot_redshift: 1.0 + seed: 12345 +knn_eval: + aliases: + input: output_estimate_knn + output: output_knn_eval + truth: output_flow_engine_train + config: null + do_cde: true + input: None + name: knn_eval + nzbins: 301 + output: pdf/pz/output_knn_eval.pq + output_mode: default + pit_metrics: all + point_metrics: all + truth: None + zmax: 3.0 + zmin: 0.0 +line_confusion: + aliases: + input: output_inv_redshift + output: output_line_confusion + config: null + frac_wrong: 0.05 + input: None + name: line_confusion + output: catalog/degraded/output_line_confusion.pq + output_mode: default + seed: 12345 + true_wavelen: 5007.0 + wrong_wavelen: 3727.0 +lsst_error_model_test: + Cm: &id006 + g: 24.42 + i: 24.32 + r: 24.44 + u: 23.09 + y: 23.73 + z: 24.16 + aMax: 2.0 + aMin: 0.7 + absFlux: false + airmass: 1.2 + aliases: + input: output_flow_engine_test + output: output_lsst_error_model_test + bandNames: &id012 + g: mag_g_lsst + i: mag_i_lsst + r: mag_r_lsst + u: mag_u_lsst + y: mag_y_lsst + z: mag_z_lsst + config: null + decorrelate: true + errLoc: after + extendedType: point + gamma: &id007 + g: 0.039 + i: 0.039 + r: 0.039 + u: 0.038 + y: 0.039 + z: 0.039 + highSNR: false + input: None + km: &id008 + g: 0.213 + i: 0.096 + r: 0.126 + u: 0.491 + y: 0.17 + z: 0.069 + m5: &id009 {} + majorCol: major + minorCol: minor + msky: &id010 + g: 22.26 + i: 20.48 + r: 21.2 + u: 22.99 + y: 18.61 + z: 19.6 + nVisYr: &id011 + g: 8.0 + i: 18.4 + r: 18.4 + u: 5.6 + y: 16.0 + z: 16.0 + nYrObs: 10.0 + name: lsst_error_model_test + ndFlag: .inf + ndMode: flag + output: catalog/degraded/output_lsst_error_model_test.pq + output_mode: default + renameDict: null + scale: &id013 {} + seed: 12345 + sigLim: 0 + sigmaSys: 0.005 + theta: &id014 + g: 0.77 + i: 0.71 + r: 0.73 + u: 0.81 + y: 0.68 + z: 0.69 + tvis: 30.0 + validate: true +lsst_error_model_train: + Cm: *id006 + aMax: 2.0 + aMin: 0.7 + absFlux: false + airmass: 1.2 + aliases: + input: output_flow_engine_train + output: output_lsst_error_model_train + config: null + decorrelate: true + errLoc: after + extendedType: point + gamma: *id007 + highSNR: false + input: None + km: *id008 + m5: *id009 + majorCol: major + minorCol: minor + msky: *id010 + nVisYr: *id011 + nYrObs: 10.0 + name: lsst_error_model_train + ndFlag: .inf + ndMode: flag + output: catalog/degraded/output_lsst_error_model_train.pq + output_mode: default + renameDict: *id012 + scale: *id013 + seed: 29 + sigLim: 0 + sigmaSys: 0.005 + theta: *id014 + tvis: 30.0 + validate: true +naive_stack_test: + aliases: + input: output_estimate_bpz + output: output_naive_stack_test + single_NZ: single_NZ_naive_stack_test + chunk_size: 10000 + config: null + input: None + name: naive_stack_test + nsamples: 1000 + nzbins: 301 + output: pdf/nz/output_naive_stack_test.hdf5 + output_mode: default + seed: 87 + single_NZ: pdf/nz/single_NZ_naive_stack_test.hdf5 + zmax: 3.0 + zmin: 0.0 +point_estimate_test: + aliases: + input: output_estimate_bpz + output: output_point_estimate_test + single_NZ: single_NZ_point_estimate_test + chunk_size: 10000 + config: null + input: None + name: point_estimate_test + nsamples: 1000 + nzbins: 301 + output: pdf/nz/output_point_estimate_test.hdf5 + output_mode: default + point_estimate: zmode + seed: 87 + single_NZ: pdf/nz/single_NZ_point_estimate_test.hdf5 + zmax: 3.0 + zmin: 0.0 +quantity_cut: + aliases: + input: output_line_confusion + output: output_quantity_cut + config: null + cuts: + mag_i_lsst: 25.0 + input: None + name: quantity_cut + output: catalog/degraded/output_quantity_cut.pq + output_mode: default + seed: 12345 +table_conv_test: + aliases: + input: output_col_remapper_test + output: output_table_conv_test + config: null + input: None + name: table_conv_test + output: catalog/degraded/output_table_conv_test.hdf5 + output_format: numpyDict + output_mode: default +table_conv_train: + aliases: + input: output_col_remapper_train + output: output_table_conv_train + config: null + input: None + name: table_conv_train + output: catalog/degraded/output_table_conv_train.hdf5 + output_format: numpyDict + output_mode: default diff --git a/src/rail/pipelines/examples/survey_nonuniformity/tmp_survey_nonuniformity.yml b/src/rail/pipelines/examples/survey_nonuniformity/tmp_survey_nonuniformity.yml new file mode 100644 index 0000000..dfc21f0 --- /dev/null +++ b/src/rail/pipelines/examples/survey_nonuniformity/tmp_survey_nonuniformity.yml @@ -0,0 +1,38 @@ +config: tmp_survey_nonuniformity_config.yml +inputs: + model: /global/u2/q/qhang/desc/rail_base/src/rail/examples_data/goldenspike_data/data/pretrained_flow.pkl +log_dir: . +modules: rail +output_dir: . +resume: false +site: + max_threads: 2 +stages: +- classname: FlowCreator + module_name: rail.creation.engines.flowEngine + name: flow_engine_train + nprocess: 1 +- classname: ObsCondition + module_name: rail.creation.degradation.observing_condition_degrader + name: obs_condition + nprocess: 1 +- classname: ColumnMapper + module_name: rail.core.utilStages + name: col_remapper_train + nprocess: 1 +- classname: Dereddener + module_name: rail.tools.utilPhotometry + name: deredden + nprocess: 1 +- classname: BPZliteInformer + module_name: rail.estimation.algos.bpz_lite + name: inform_bpz + nprocess: 1 +- classname: BPZliteEstimator + module_name: rail.estimation.algos.bpz_lite + name: estimate_bpz + nprocess: 1 +- classname: UniformBinningClassifier + module_name: rail.estimation.algos.uniform_binning + name: tomopraphy + nprocess: 1 diff --git a/src/rail/pipelines/examples/survey_nonuniformity/tmp_survey_nonuniformity_config.yml b/src/rail/pipelines/examples/survey_nonuniformity/tmp_survey_nonuniformity_config.yml new file mode 100644 index 0000000..7d65d47 --- /dev/null +++ b/src/rail/pipelines/examples/survey_nonuniformity/tmp_survey_nonuniformity_config.yml @@ -0,0 +1,176 @@ +col_remapper_train: + aliases: + input: output_obs_condition + output: output_col_remapper_train + chunk_size: 100000 + columns: + mag_g_lsst_err: mag_err_g_lsst + mag_i_lsst_err: mag_err_i_lsst + mag_r_lsst_err: mag_err_r_lsst + mag_u_lsst_err: mag_err_u_lsst + mag_y_lsst_err: mag_err_y_lsst + mag_z_lsst_err: mag_err_z_lsst + config: null + inplace: false + input: None + name: col_remapper_train + output: catalog/degraded/output_col_remapper_train.pq + output_mode: default +deredden: + aliases: + input: output_col_remapper_train + output: output_deredden + band_a_env: + - 4.81 + - 3.64 + - 2.7 + - 2.06 + - 1.58 + - 1.31 + bands: ugrizy + config: null + copy_cols: [] + dustmap_dir: . + dustmap_name: sfd + input: None + mag_name: mag_{band}_lsst + name: deredden + output: catalog/degraded/output_deredden.pq + output_mode: default +estimate_bpz: + aliases: + input: output_deredden + model: model_inform_bpz + output: output_estimate_bpz + bands: &id001 + - mag_u_lsst + - mag_g_lsst + - mag_r_lsst + - mag_i_lsst + - mag_z_lsst + - mag_y_lsst + calculated_point_estimates: [] + chunk_size: 10000 + columns_file: /global/u2/q/qhang/desc/rail_bpz/src/rail/examples_data/estimation_data/configs/test_bpz.columns + config: null + data_path: None + dz: 0.01 + err_bands: &id002 + - mag_err_u_lsst + - mag_err_g_lsst + - mag_err_r_lsst + - mag_err_i_lsst + - mag_err_z_lsst + - mag_err_y_lsst + gauss_kernel: 0.0 + hdf5_groupname: '' + input: None + madau_flag: 'no' + mag_err_min: 0.005 + mag_limits: &id003 + mag_g_lsst: 29.04 + mag_i_lsst: 28.62 + mag_r_lsst: 29.06 + mag_u_lsst: 27.79 + mag_y_lsst: 27.05 + mag_z_lsst: 27.98 + model: None + name: estimate_bpz + no_prior: true + nondetect_val: 99.0 + nzbins: 301 + output: pdf/pz/output_estimate_bpz.hdf5 + output_mode: default + p_min: 0.005 + redshift_col: redshift + ref_band: mag_i_lsst + spectra_file: CWWSB4.list + unobserved_val: -99.0 + zmax: 3.0 + zmin: 0.0 + zp_errors: + - 0.01 + - 0.01 + - 0.01 + - 0.01 + - 0.01 + - 0.01 +flow_engine_train: + aliases: + output: output_flow_engine_train + config: null + model: /global/u2/q/qhang/desc/rail_base/src/rail/examples_data/goldenspike_data/data/pretrained_flow.pkl + n_samples: 10 + name: flow_engine_train + output: catalog/created/output_flow_engine_train.pq + output_mode: default + seed: 12345 +inform_bpz: + aliases: + input: output_deredden + model: model_inform_bpz + bands: *id001 + columns_file: /global/u2/q/qhang/desc/rail_bpz/src/rail/examples_data/estimation_data/configs/test_bpz.columns + config: null + data_path: None + err_bands: *id002 + hdf5_groupname: '' + init_alpha: 1.8 + init_km: 0.1 + init_kt: 0.3 + init_zo: 0.4 + input: None + m0: 20.0 + mag_limits: *id003 + mmax: 26.0 + mmin: 18.0 + model: model/estimator/trained_BPZ.pkl + name: inform_bpz + nondetect_val: 99.0 + nt_array: + - 8 + nzbins: 301 + output_mode: default + redshift_col: redshift + ref_band: mag_i_lsst + save_train: true + spectra_file: CWWSB4.list + type_file: '' + zmax: 3.0 + zmin: 0.0 +obs_condition: + aliases: + input: output_flow_engine_train + output: output_obs_condition + config: null + input: None + map_dict: + m5: + i: /global/u2/q/qhang/desc/rail_astro_tools/src/rail/creation/degradation/../../examples_data/creation_data/data/survey_conditions/minion_1016_dc2_Median_fiveSigmaDepth_i_and_nightlt1825_HEAL.fits + nYrObs: 5.0 + mask: /global/u2/q/qhang/desc/rail_astro_tools/src/rail/creation/degradation/../../examples_data/creation_data/data/survey_conditions/DC2-mask-neg-nside-128.fits + name: obs_condition + nside: 128 + output: catalog/degraded/output_obscondition.pq + output_mode: default + random_seed: 42 + seed: 12345 + tot_nVis_flag: true + weight: /global/u2/q/qhang/desc/rail_astro_tools/src/rail/creation/degradation/../../examples_data/creation_data/data/survey_conditions/DC2-dr6-galcounts-i20-i25.3-nside-128.fits +tomopraphy: + aliases: + input: output_estimate_bpz + output: output_tomopraphy + chunk_size: 10000 + config: null + id_name: '' + input: None + name: tomopraphy + nbins: 5 + no_assign: -99 + output: pdf/pz/output_tomography.hdf5 + output_mode: default + point_estimate: zmode + zbin_edges: [] + zmax: 3.0 + zmin: 0.0 From f08eb719d21d64eb8078768adb6cc1a433b12935 Mon Sep 17 00:00:00 2001 From: hangqianjun Date: Thu, 23 Nov 2023 15:25:14 -0800 Subject: [PATCH 08/10] updated pipeline notebook --- nb/examples/survey_nonuniform.ipynb | 501 ------------ .../survey_nonuniform.ipynb | 712 ++++++++++++++++++ .../examples/goldenspike/tmp_goldenspike.yml | 98 --- .../goldenspike/tmp_goldenspike_config.yml | 502 ------------ .../survey_nonuniformity.py | 28 +- .../tmp_survey_nonuniformity.yml | 38 - .../tmp_survey_nonuniformity_config.yml | 176 ----- 7 files changed, 724 insertions(+), 1331 deletions(-) delete mode 100644 nb/examples/survey_nonuniform.ipynb create mode 100644 nb/examples/survey_nonuniformity/survey_nonuniform.ipynb delete mode 100644 src/rail/pipelines/examples/goldenspike/tmp_goldenspike.yml delete mode 100644 src/rail/pipelines/examples/goldenspike/tmp_goldenspike_config.yml delete mode 100644 src/rail/pipelines/examples/survey_nonuniformity/tmp_survey_nonuniformity.yml delete mode 100644 src/rail/pipelines/examples/survey_nonuniformity/tmp_survey_nonuniformity_config.yml diff --git a/nb/examples/survey_nonuniform.ipynb b/nb/examples/survey_nonuniform.ipynb deleted file mode 100644 index e5f2f80..0000000 --- a/nb/examples/survey_nonuniform.ipynb +++ /dev/null @@ -1,501 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "id": "62c833e4-fde5-4ba0-8406-966805b80ed2", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Imported rail.hub\n", - "Imported rail.astro_tools\n", - "Imported rail.core\n", - "Imported rail.stages\n", - "Imported rail.bpz\n", - "Imported rail.cmnn\n", - "Imported rail.delight\n", - "Failed to import rail.dsps because: You need to have the SPS_HOME environment variable\n", - "Imported rail.flexzboost\n", - "Imported rail.gpz\n", - "Imported rail.pipelines\n", - "Failed to import rail.pzflow because: No module named 'rail.estimation.algos.pzflow'\n", - "Imported rail.sklearn\n", - "Imported rail.som\n", - "Attached 12 base classes and 53 fully formed stages to rail.stages\n" - ] - } - ], - "source": [ - "# usual imports\n", - "import os\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "from rail.core.utils import RAILDIR\n", - "#from rail.estimation.algos.bpz_version.utils import RAIL_BPZ_DIR\n", - "from rail.pipelines.examples.survey_nonuniformity.survey_nonuniformity import SurveyNonuniformDegraderPipeline\n", - "from rail.core import common_params\n", - "from rail.pipelines.utils.name_factory import NameFactory, DataType, CatalogType, ModelType, PdfType\n", - "import qp\n", - "import ceci" - ] - }, - { - "cell_type": "markdown", - "id": "2d022101-7f7b-4fb1-abaa-f1a4243027f9", - "metadata": {}, - "source": [ - "### Define the bands, magnitude limits, and put them into a dictionary" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "92e175b0-bcf4-4777-a165-a95afe061627", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "bands = 'grizy'\n", - "maglims = [27.79, 29.04, 29.06, 28.62, 27.98, 27.05]\n", - "maglim_dict={}\n", - "for band,limx in zip(bands, maglims):\n", - " maglim_dict[f\"mag_{band}_lsst\"] = limx" - ] - }, - { - "cell_type": "markdown", - "id": "3b1fb970-14d6-4e0c-b330-e341b6cb6be5", - "metadata": {}, - "source": [ - "### Setting common parameters to all the stages in the estimation\n" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "682d2489-ba1b-4344-af95-728667e53528", - "metadata": {}, - "outputs": [], - "source": [ - "common_params.set_param_defaults(\n", - " bands=[f'mag_{band}_lsst' for band in bands], # bands\n", - " err_bands=[f'mag_err_{band}_lsst' for band in bands], # uncertainty bands\n", - " nondetect_val=np.nan,\n", - " #ref_band='HSCi_cmodel_dered',\n", - " redshift_col='redshift',\n", - " mag_limits=maglim_dict,\n", - " #zmax=6.0, # set zmax to 6 for HSC\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "25accc6c-b50b-4acc-bfeb-1f72034e6d7e", - "metadata": {}, - "source": [ - "### Set up the pipeline" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "ba92106a-6ac6-42e3-822f-d5dcf30a5793", - "metadata": { - "tags": [] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Inserting handle into data store. model: /global/u2/q/qhang/desc/rail_base/src/rail/examples_data/goldenspike_data/data/pretrained_flow.pkl, flow_engine_train\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2023-08-03 15:58:44.859000: E external/xla/xla/stream_executor/cuda/cuda_dnn.cc:445] Could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR\n", - "2023-08-03 15:58:44.859049: E external/xla/xla/stream_executor/cuda/cuda_dnn.cc:449] Memory usage: 3276800 bytes free, 42297524224 bytes total.\n" - ] - }, - { - "ename": "XlaRuntimeError", - "evalue": "FAILED_PRECONDITION: DNN library initialization failed. Look at the errors above for more details.", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mXlaRuntimeError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[11], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m pipe \u001b[38;5;241m=\u001b[39m \u001b[43mSurveyNonuniformDegraderPipeline\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m/global/u2/q/qhang/desc/rail_pipelines/src/rail/pipelines/examples/survey_nonuniformity/survey_nonuniformity.py:36\u001b[0m, in \u001b[0;36mSurveyNonuniformDegraderPipeline.__init__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 33\u001b[0m rename_dict \u001b[38;5;241m=\u001b[39m {\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmag_\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mband\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m_lsst_err\u001b[39m\u001b[38;5;124m'\u001b[39m:\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mmag_err_\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mband\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m_lsst\u001b[39m\u001b[38;5;124m'\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m band \u001b[38;5;129;01min\u001b[39;00m bands}\n\u001b[1;32m 35\u001b[0m \u001b[38;5;66;03m# This may be changed later\u001b[39;00m\n\u001b[0;32m---> 36\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mflow_engine_train\u001b[49m \u001b[38;5;241m=\u001b[39m FlowCreator\u001b[38;5;241m.\u001b[39mbuild(\n\u001b[1;32m 37\u001b[0m model\u001b[38;5;241m=\u001b[39mflow_file,\n\u001b[1;32m 38\u001b[0m n_samples\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m10\u001b[39m,\n\u001b[1;32m 39\u001b[0m output\u001b[38;5;241m=\u001b[39mos\u001b[38;5;241m.\u001b[39mpath\u001b[38;5;241m.\u001b[39mjoin(namer\u001b[38;5;241m.\u001b[39mget_data_dir(DataType\u001b[38;5;241m.\u001b[39mcatalog, CatalogType\u001b[38;5;241m.\u001b[39mcreated), \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutput_flow_engine_train.pq\u001b[39m\u001b[38;5;124m\"\u001b[39m),\n\u001b[1;32m 40\u001b[0m )\n\u001b[1;32m 42\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mobs_condition \u001b[38;5;241m=\u001b[39m ObsCondition\u001b[38;5;241m.\u001b[39mbuild(\n\u001b[1;32m 43\u001b[0m connections\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mdict\u001b[39m(\u001b[38;5;28minput\u001b[39m\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mflow_engine_train\u001b[38;5;241m.\u001b[39mio\u001b[38;5;241m.\u001b[39moutput), \n\u001b[1;32m 44\u001b[0m output\u001b[38;5;241m=\u001b[39mos\u001b[38;5;241m.\u001b[39mpath\u001b[38;5;241m.\u001b[39mjoin(namer\u001b[38;5;241m.\u001b[39mget_data_dir(DataType\u001b[38;5;241m.\u001b[39mcatalog, CatalogType\u001b[38;5;241m.\u001b[39mdegraded), \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutput_obscondition.pq\u001b[39m\u001b[38;5;124m\"\u001b[39m),\n\u001b[1;32m 45\u001b[0m )\n\u001b[1;32m 47\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcol_remapper_train \u001b[38;5;241m=\u001b[39m ColumnMapper\u001b[38;5;241m.\u001b[39mbuild(\n\u001b[1;32m 48\u001b[0m connections\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mdict\u001b[39m(\u001b[38;5;28minput\u001b[39m\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mobs_condition\u001b[38;5;241m.\u001b[39mio\u001b[38;5;241m.\u001b[39moutput),\n\u001b[1;32m 49\u001b[0m columns\u001b[38;5;241m=\u001b[39mrename_dict,\n\u001b[1;32m 50\u001b[0m output\u001b[38;5;241m=\u001b[39mos\u001b[38;5;241m.\u001b[39mpath\u001b[38;5;241m.\u001b[39mjoin(namer\u001b[38;5;241m.\u001b[39mget_data_dir(DataType\u001b[38;5;241m.\u001b[39mcatalog, CatalogType\u001b[38;5;241m.\u001b[39mdegraded), \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moutput_col_remapper_train.pq\u001b[39m\u001b[38;5;124m\"\u001b[39m),\n\u001b[1;32m 51\u001b[0m )\n", - "File \u001b[0;32m/global/u2/q/qhang/desc/rail_base/src/rail/core/stage.py:83\u001b[0m, in \u001b[0;36mRailPipeline.__setattr__\u001b[0;34m(self, name, value)\u001b[0m\n\u001b[1;32m 81\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__setattr__\u001b[39m(\u001b[38;5;28mself\u001b[39m, name, value):\n\u001b[1;32m 82\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(value, RailStageBuild):\n\u001b[0;32m---> 83\u001b[0m stage \u001b[38;5;241m=\u001b[39m \u001b[43mvalue\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbuild\u001b[49m\u001b[43m(\u001b[49m\u001b[43mname\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 84\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39madd_stage(stage)\n\u001b[1;32m 85\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m stage\n", - "File \u001b[0;32m/global/u2/q/qhang/desc/rail_base/src/rail/core/stage.py:63\u001b[0m, in \u001b[0;36mRailStageBuild.build\u001b[0;34m(self, name)\u001b[0m\n\u001b[1;32m 49\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mbuild\u001b[39m(\u001b[38;5;28mself\u001b[39m, name):\n\u001b[1;32m 50\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Actually build the stage, this is called by the pipeline the stage\u001b[39;00m\n\u001b[1;32m 51\u001b[0m \u001b[38;5;124;03m belongs to\u001b[39;00m\n\u001b[1;32m 52\u001b[0m \n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 61\u001b[0m \u001b[38;5;124;03m The newly built stage\u001b[39;00m\n\u001b[1;32m 62\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m---> 63\u001b[0m stage \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstage_class\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmake_and_connect\u001b[49m\u001b[43m(\u001b[49m\u001b[43mname\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mname\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_kwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 64\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m stage\n", - "File \u001b[0;32m/global/u2/q/qhang/desc/rail_base/src/rail/core/stage.py:160\u001b[0m, in \u001b[0;36mRailStage.make_and_connect\u001b[0;34m(cls, **kwargs)\u001b[0m\n\u001b[1;32m 144\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"Make a stage and connects it to other stages\u001b[39;00m\n\u001b[1;32m 145\u001b[0m \n\u001b[1;32m 146\u001b[0m \u001b[38;5;124;03mNotes\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 157\u001b[0m \u001b[38;5;124;03mA stage\u001b[39;00m\n\u001b[1;32m 158\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 159\u001b[0m connections \u001b[38;5;241m=\u001b[39m kwargs\u001b[38;5;241m.\u001b[39mpop(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mconnections\u001b[39m\u001b[38;5;124m'\u001b[39m, {})\n\u001b[0;32m--> 160\u001b[0m stage \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mcls\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmake_stage\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 161\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m key, val \u001b[38;5;129;01min\u001b[39;00m connections\u001b[38;5;241m.\u001b[39mitems():\n\u001b[1;32m 162\u001b[0m stage\u001b[38;5;241m.\u001b[39mset_data(key, val, do_read\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m)\n", - "File \u001b[0;32m~/.conda/envs/rail_dev/lib/python3.11/site-packages/ceci/stage.py:115\u001b[0m, in \u001b[0;36mPipelineStage.make_stage\u001b[0;34m(cls, **kwargs)\u001b[0m\n\u001b[1;32m 113\u001b[0m aliases[outtag] \u001b[38;5;241m=\u001b[39m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mouttag\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m_\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mname\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 114\u001b[0m kwcopy[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124maliases\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m aliases\n\u001b[0;32m--> 115\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mcls\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mkwcopy\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcomm\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcomm\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m/global/u2/q/qhang/desc/rail_pzflow/src/rail/creation/engines/flowEngine.py:181\u001b[0m, in \u001b[0;36mFlowCreator.__init__\u001b[0;34m(self, args, comm)\u001b[0m\n\u001b[1;32m 176\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__init__\u001b[39m(\u001b[38;5;28mself\u001b[39m, args, comm\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m):\n\u001b[1;32m 177\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Constructor\u001b[39;00m\n\u001b[1;32m 178\u001b[0m \n\u001b[1;32m 179\u001b[0m \u001b[38;5;124;03m Does standard Creator initialization and also gets the `Flow` object\u001b[39;00m\n\u001b[1;32m 180\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m--> 181\u001b[0m \u001b[43mCreator\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[38;5;21;43m__init__\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcomm\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcomm\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m/global/u2/q/qhang/desc/rail_base/src/rail/creation/engine.py:65\u001b[0m, in \u001b[0;36mCreator.__init__\u001b[0;34m(self, args, comm)\u001b[0m\n\u001b[1;32m 63\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(args, \u001b[38;5;28mdict\u001b[39m): \u001b[38;5;66;03m# pragma: no cover\u001b[39;00m\n\u001b[1;32m 64\u001b[0m args \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mvars\u001b[39m(args)\n\u001b[0;32m---> 65\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mopen_model\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m/global/u2/q/qhang/desc/rail_base/src/rail/creation/engine.py:87\u001b[0m, in \u001b[0;36mCreator.open_model\u001b[0;34m(self, **kwargs)\u001b[0m\n\u001b[1;32m 85\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mmodel\n\u001b[1;32m 86\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(model, \u001b[38;5;28mstr\u001b[39m): \u001b[38;5;66;03m# pragma: no cover\u001b[39;00m\n\u001b[0;32m---> 87\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mmodel \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mset_data\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mmodel\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdata\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpath\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmodel\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 88\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mconfig[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmodel\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m model\n\u001b[1;32m 89\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mmodel\n", - "File \u001b[0;32m/global/u2/q/qhang/desc/rail_base/src/rail/core/stage.py:294\u001b[0m, in \u001b[0;36mRailStage.set_data\u001b[0;34m(self, tag, data, path, do_read)\u001b[0m\n\u001b[1;32m 292\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m handle\u001b[38;5;241m.\u001b[39mhas_data:\n\u001b[1;32m 293\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m arg_data \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m do_read:\n\u001b[0;32m--> 294\u001b[0m \u001b[43mhandle\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mread\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 295\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m arg_data \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 296\u001b[0m handle\u001b[38;5;241m.\u001b[39mdata \u001b[38;5;241m=\u001b[39m arg_data\n", - "File \u001b[0;32m/global/u2/q/qhang/desc/rail_base/src/rail/core/data.py:62\u001b[0m, in \u001b[0;36mDataHandle.read\u001b[0;34m(self, force, **kwargs)\u001b[0m\n\u001b[1;32m 60\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdata \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m force:\n\u001b[1;32m 61\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdata\n\u001b[0;32m---> 62\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mset_data(\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_read\u001b[49m\u001b[43m(\u001b[49m\u001b[43mos\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mpath\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mexpandvars\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mpath\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m)\n\u001b[1;32m 63\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdata\n", - "File \u001b[0;32m/global/u2/q/qhang/desc/rail_pzflow/src/rail/tools/flow_handle.py:52\u001b[0m, in \u001b[0;36mFlowHandle._read\u001b[0;34m(cls, path, **kwargs)\u001b[0m\n\u001b[1;32m 49\u001b[0m \u001b[38;5;129m@classmethod\u001b[39m\n\u001b[1;32m 50\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_read\u001b[39m(\u001b[38;5;28mcls\u001b[39m, path, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 51\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Read and return the data from the associated file \"\"\"\u001b[39;00m\n\u001b[0;32m---> 52\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mcls\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mflow_factory\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mread\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpath\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m/global/u2/q/qhang/desc/rail_pzflow/src/rail/tools/flow_handle.py:29\u001b[0m, in \u001b[0;36mFlowDict.read\u001b[0;34m(self, path, force)\u001b[0m\n\u001b[1;32m 27\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mpzflow\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m Flow\n\u001b[1;32m 28\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m force \u001b[38;5;129;01mor\u001b[39;00m path \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m:\n\u001b[0;32m---> 29\u001b[0m flow \u001b[38;5;241m=\u001b[39m \u001b[43mFlow\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfile\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mpath\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 30\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;21m__setitem__\u001b[39m(path, flow)\n\u001b[1;32m 31\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m flow\n", - "File \u001b[0;32m~/.conda/envs/rail_dev/lib/python3.11/site-packages/pzflow/flow.py:184\u001b[0m, in \u001b[0;36mFlow.__init__\u001b[0;34m(self, data_columns, bijector, latent, conditional_columns, data_error_model, condition_error_model, autoscale_conditions, seed, info, file, _dictionary)\u001b[0m\n\u001b[1;32m 182\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_bijector_info \u001b[38;5;241m=\u001b[39m save_dict[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mbijector_info\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n\u001b[1;32m 183\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_bijector_info \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m--> 184\u001b[0m init_fun, _ \u001b[38;5;241m=\u001b[39m \u001b[43mbuild_bijector_from_info\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_bijector_info\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 185\u001b[0m _, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_inverse \u001b[38;5;241m=\u001b[39m init_fun(\n\u001b[1;32m 186\u001b[0m random\u001b[38;5;241m.\u001b[39mPRNGKey(\u001b[38;5;241m0\u001b[39m), \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_input_dim\n\u001b[1;32m 187\u001b[0m )\n\u001b[1;32m 188\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_params \u001b[38;5;241m=\u001b[39m save_dict[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mparams\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n", - "File \u001b[0;32m~/.conda/envs/rail_dev/lib/python3.11/site-packages/pzflow/utils.py:16\u001b[0m, in \u001b[0;36mbuild_bijector_from_info\u001b[0;34m(info)\u001b[0m\n\u001b[1;32m 14\u001b[0m \u001b[38;5;66;03m# recurse through chains\u001b[39;00m\n\u001b[1;32m 15\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m info[\u001b[38;5;241m0\u001b[39m] \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mChain\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[0;32m---> 16\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mbijectors\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mChain\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mbuild_bijector_from_info\u001b[49m\u001b[43m(\u001b[49m\u001b[43mi\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mi\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43minfo\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 17\u001b[0m \u001b[38;5;66;03m# build individual bijector from name and parameters\u001b[39;00m\n\u001b[1;32m 18\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 19\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mgetattr\u001b[39m(bijectors, info[\u001b[38;5;241m0\u001b[39m])(\u001b[38;5;241m*\u001b[39minfo[\u001b[38;5;241m1\u001b[39m])\n", - "File \u001b[0;32m~/.conda/envs/rail_dev/lib/python3.11/site-packages/pzflow/utils.py:16\u001b[0m, in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 14\u001b[0m \u001b[38;5;66;03m# recurse through chains\u001b[39;00m\n\u001b[1;32m 15\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m info[\u001b[38;5;241m0\u001b[39m] \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mChain\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[0;32m---> 16\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m bijectors\u001b[38;5;241m.\u001b[39mChain(\u001b[38;5;241m*\u001b[39m(\u001b[43mbuild_bijector_from_info\u001b[49m\u001b[43m(\u001b[49m\u001b[43mi\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;28;01mfor\u001b[39;00m i \u001b[38;5;129;01min\u001b[39;00m info[\u001b[38;5;241m1\u001b[39m]))\n\u001b[1;32m 17\u001b[0m \u001b[38;5;66;03m# build individual bijector from name and parameters\u001b[39;00m\n\u001b[1;32m 18\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 19\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mgetattr\u001b[39m(bijectors, info[\u001b[38;5;241m0\u001b[39m])(\u001b[38;5;241m*\u001b[39minfo[\u001b[38;5;241m1\u001b[39m])\n", - "File \u001b[0;32m~/.conda/envs/rail_dev/lib/python3.11/site-packages/pzflow/utils.py:19\u001b[0m, in \u001b[0;36mbuild_bijector_from_info\u001b[0;34m(info)\u001b[0m\n\u001b[1;32m 16\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m bijectors\u001b[38;5;241m.\u001b[39mChain(\u001b[38;5;241m*\u001b[39m(build_bijector_from_info(i) \u001b[38;5;28;01mfor\u001b[39;00m i \u001b[38;5;129;01min\u001b[39;00m info[\u001b[38;5;241m1\u001b[39m]))\n\u001b[1;32m 17\u001b[0m \u001b[38;5;66;03m# build individual bijector from name and parameters\u001b[39;00m\n\u001b[1;32m 18\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m---> 19\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mgetattr\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mbijectors\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minfo\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m)\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43minfo\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/.conda/envs/rail_dev/lib/python3.11/site-packages/pzflow/bijectors.py:118\u001b[0m, in \u001b[0;36mBijector.__call__\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 117\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__call__\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Tuple[InitFunction, Bijector_Info]:\n\u001b[0;32m--> 118\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_func\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/.conda/envs/rail_dev/lib/python3.11/site-packages/pzflow/bijectors.py:345\u001b[0m, in \u001b[0;36mInvSoftplus\u001b[0;34m(column_idx, sharpness)\u001b[0m\n\u001b[1;32m 316\u001b[0m \u001b[38;5;129m@Bijector\u001b[39m\n\u001b[1;32m 317\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mInvSoftplus\u001b[39m(\n\u001b[1;32m 318\u001b[0m column_idx: \u001b[38;5;28mint\u001b[39m, sharpness: \u001b[38;5;28mfloat\u001b[39m \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m1\u001b[39m\n\u001b[1;32m 319\u001b[0m ) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Tuple[InitFunction, Bijector_Info]:\n\u001b[1;32m 320\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Bijector that applies inverse softplus to the specified column(s).\u001b[39;00m\n\u001b[1;32m 321\u001b[0m \n\u001b[1;32m 322\u001b[0m \u001b[38;5;124;03m Applying the inverse softplus ensures that samples from that column will\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 342\u001b[0m \u001b[38;5;124;03m This allows it to be recreated later.\u001b[39;00m\n\u001b[1;32m 343\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m--> 345\u001b[0m idx \u001b[38;5;241m=\u001b[39m \u001b[43mjnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43matleast_1d\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcolumn_idx\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 346\u001b[0m k \u001b[38;5;241m=\u001b[39m jnp\u001b[38;5;241m.\u001b[39matleast_1d(sharpness)\n\u001b[1;32m 347\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(idx) \u001b[38;5;241m!=\u001b[39m \u001b[38;5;28mlen\u001b[39m(k) \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(k) \u001b[38;5;241m!=\u001b[39m \u001b[38;5;241m1\u001b[39m:\n", - " \u001b[0;31m[... skipping hidden 14 frame]\u001b[0m\n", - "File \u001b[0;32m~/.conda/envs/rail_dev/lib/python3.11/site-packages/jax/_src/dispatch.py:464\u001b[0m, in \u001b[0;36mbackend_compile\u001b[0;34m(backend, module, options, host_callbacks)\u001b[0m\n\u001b[1;32m 459\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m backend\u001b[38;5;241m.\u001b[39mcompile(built_c, compile_options\u001b[38;5;241m=\u001b[39moptions,\n\u001b[1;32m 460\u001b[0m host_callbacks\u001b[38;5;241m=\u001b[39mhost_callbacks)\n\u001b[1;32m 461\u001b[0m \u001b[38;5;66;03m# Some backends don't have `host_callbacks` option yet\u001b[39;00m\n\u001b[1;32m 462\u001b[0m \u001b[38;5;66;03m# TODO(sharadmv): remove this fallback when all backends allow `compile`\u001b[39;00m\n\u001b[1;32m 463\u001b[0m \u001b[38;5;66;03m# to take in `host_callbacks`\u001b[39;00m\n\u001b[0;32m--> 464\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mbackend\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcompile\u001b[49m\u001b[43m(\u001b[49m\u001b[43mbuilt_c\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcompile_options\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moptions\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[0;31mXlaRuntimeError\u001b[0m: FAILED_PRECONDITION: DNN library initialization failed. Look at the errors above for more details." - ] - } - ], - "source": [ - "pipe = SurveyNonuniformDegraderPipeline()" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "6621e102-b0dd-4fb8-a524-6b4545189cf9", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "namer = NameFactory()" - ] - }, - { - "cell_type": "markdown", - "id": "511c9722-9c09-44a1-8b7e-6d058a199297", - "metadata": {}, - "source": [ - "### Define parameters for each stage" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "526a1831-6094-4ff2-826b-0c3df8662b29", - "metadata": {}, - "outputs": [], - "source": [ - "# dictionary used by ObsCondition\n", - "# first define a set of input map directories:\n", - "\n", - "base_path = \"/pscratch/sd/q/qhang/rubin_baseline_v2/MAF-1year/\"\n", - "\n", - "# nside of these maps:\n", - "nside=128\n", - "\n", - "# seeing maps:\n", - "seeing_u = base_path + \"baseline_v2_0_10yrs_Median_seeingFwhmEff_u_and_nightlt365_HEAL.fits\"\n", - "seeing_g = base_path + \"baseline_v2_0_10yrs_Median_seeingFwhmEff_g_and_nightlt365_HEAL.fits\"\n", - "seeing_r = base_path + \"baseline_v2_0_10yrs_Median_seeingFwhmEff_r_and_nightlt365_HEAL.fits\"\n", - "seeing_i = base_path + \"baseline_v2_0_10yrs_Median_seeingFwhmEff_i_and_nightlt365_HEAL.fits\"\n", - "seeing_z = base_path + \"baseline_v2_0_10yrs_Median_seeingFwhmEff_z_and_nightlt365_HEAL.fits\"\n", - "seeing_y = base_path + \"baseline_v2_0_10yrs_Median_seeingFwhmEff_y_and_nightlt365_HEAL.fits\"\n", - "\n", - "# coadd depth maps:\n", - "coaddm5_u = base_path + \"baseline_v2_0_10yrs_CoaddM5_u_and_nightlt365_HEAL.fits\"\n", - "coaddm5_g = base_path + \"baseline_v2_0_10yrs_CoaddM5_g_and_nightlt365_HEAL.fits\"\n", - "coaddm5_r = base_path + \"baseline_v2_0_10yrs_CoaddM5_r_and_nightlt365_HEAL.fits\"\n", - "coaddm5_i = base_path + \"baseline_v2_0_10yrs_CoaddM5_i_and_nightlt365_HEAL.fits\"\n", - "coaddm5_z = base_path + \"baseline_v2_0_10yrs_CoaddM5_z_and_nightlt365_HEAL.fits\"\n", - "coaddm5_y = base_path + \"baseline_v2_0_10yrs_CoaddM5_y_and_nightlt365_HEAL.fits\"\n", - "\n", - "# here we will set the observing year and number of visits per year to 1, because we are supplying coadd depth\n", - "\n", - "# mask:\n", - "maskdir = base_path + \"../wfd_footprint_nvisitcut_500_nside_128.fits\"\n", - "\n", - "# weight: for now we supply uniform weight\n", - "\n", - "# choose the systematic map to examine, here we choose the combined depth:\n", - "sys_to_check = base_path + \"baseline_v2_0_10yrs_CoaddM5_i_and_nightlt365_HEAL.fits\"\n", - "sys = \"CoaddM5\"\n", - "\n", - "map_dict={\n", - " \"theta\": {\n", - " \"u\": seeing_u,\n", - " \"g\": seeing_g,\n", - " \"r\": seeing_r,\n", - " \"i\": seeing_i,\n", - " \"z\": seeing_z,\n", - " \"y\": seeing_y,\n", - " },\n", - " \"m5\": {\n", - " \"u\": coaddm5_u,\n", - " \"g\": coaddm5_g,\n", - " \"r\": coaddm5_r,\n", - " \"i\": coaddm5_i,\n", - " \"z\": coaddm5_z,\n", - " \"y\": coaddm5_y,\n", - " },\n", - " \"nYrObs\": 1.,\n", - " \"nVisYr\": {\n", - " \"u\": 1.,\n", - " \"g\": 1.,\n", - " \"r\": 1.,\n", - " \"i\": 1.,\n", - " \"z\": 1.,\n", - " \"y\": 1., \n", - " },\n", - " \"sigLim\": 10,\n", - " \"ndFlag\": np.nan,\n", - " \"extendedType\": \"auto\",\n", - " \"majorCol\": \"major\",\n", - " \"minorCol\": \"minor\",\n", - " \"decorrelate\": True,\n", - " \"highSNR\": False,\n", - " \"renameDict\": band_dict, \n", - " }" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "2a64eb7b-d67e-422d-a60a-ed0085bbf677", - "metadata": {}, - "outputs": [], - "source": [ - "pipe.flow_engine_train.config.update(n_samples=20)\n", - "pipe.obs_condition.config.update(map_dict=map_dict, nside=nside, mask = maskdir, weight = \"\",)\n", - "pipe.deredden.config.update(dustmap_dir=\".\",)# where to save the dust map downloaded\n", - "pipe.estimate_bpz.config.update(spec_groupname = \"\", redshift_colname = 'redshift', prior_band='i',)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ff0d1439-169b-45dc-b224-27cc3189aab9", - "metadata": {}, - "outputs": [], - "source": [ - "pipe_info = pipe.initialize(input_dict, dict(output_dir='.', log_dir='.', resume=True), None)" - ] - }, - { - "cell_type": "markdown", - "id": "e0b21b58-94ca-425a-bf23-aedcc34cf233", - "metadata": {}, - "source": [ - "### Save the pipeline into a yml file" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "bcd3534c-ce25-48d9-a629-49ce17cdd279", - "metadata": {}, - "outputs": [], - "source": [ - "pipe.save('tmp_survey_nonuniformity.yml')" - ] - }, - { - "cell_type": "markdown", - "id": "333d990d-8050-4815-8329-74af6e94ada6", - "metadata": {}, - "source": [ - "### run pipeline" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7943d633-f27c-469b-944b-2ea79ee011ec", - "metadata": {}, - "outputs": [], - "source": [ - "import ceci\n", - "pr = ceci.Pipeline.read('tmp_survey_nonuniformity.yml')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a206fbe7-757e-4df6-803f-3abf170874de", - "metadata": {}, - "outputs": [], - "source": [ - "pr.run()" - ] - }, - { - "cell_type": "markdown", - "id": "5a507f0b-c130-4c74-b964-262f97c49629", - "metadata": {}, - "source": [ - "# Redshift distribution in each tomographic bins at different depth:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1761c908-9b6f-43f2-88c2-1614b48170eb", - "metadata": {}, - "outputs": [], - "source": [ - "# tomographic bin n(z) at different depth:\n", - "\n", - "# load the specific systematic map & mask to check correlation\n", - "mapin = hp.read_map(sys_to_check)\n", - "mask = hp.read_map(maskdir)\n", - "# quantile contains pixel indices, and meanv is the mean value of the systematic maps in each quantile\n", - "quantile, meanv = split_sys_map_quantiles(mapin, mask, nquantiles=nquantiles)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8d104602-2715-4dc1-84c7-bf7c7123567e", - "metadata": {}, - "outputs": [], - "source": [ - "# compute simple summary statistic\n", - "nzstat_summary_split={}\n", - "\n", - "for jj in range(npzbins):\n", - " nzstat_summary_split[\"tomo-%d\"%(jj+1)]={}\n", - " \n", - " ind0 = data_degraded_gold_tomo[\"tomo\"] == (jj+1)\n", - "\n", - " for ii in range(nquantiles):\n", - " ind = np.in1d(data_degraded_gold_tomo[\"pixels\"], quantile[ii])\n", - " ind = ind * ind0\n", - " usecat = data_degraded_gold_tomo.loc[ind, :]\n", - " # now for each tomographic bin, return redshift distribution:\n", - " nzstat_summary_split[\"tomo-%d\"%(jj+1)][ii] = compute_nzstats(usecat, z_col, \n", - " zgrid=zgrid, nbootstrap=nbootstrap)\n", - "\n", - " # compute the tot nz, meanz, sigmaz:\n", - " nzstat_summary_tot[\"tomo-%d\"%(jj+1)] = compute_nzstats(data_degraded_gold_tomo, z_col, \n", - " zgrid=zgrid, nbootstrap=nbootstrap)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "828c9902-368c-4dcf-8b5d-3597c5004966", - "metadata": {}, - "outputs": [], - "source": [ - "# write to file:\n", - "outroot = savedir + \"test-pz-with-i-band-coadd-Y1.yml\"\n", - "write_evaluation_results(outroot, meanv, nzstat_summary_split, nzstat_summary_tot)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "10625947-c56f-4536-b8aa-72b64a0324a5", - "metadata": {}, - "outputs": [], - "source": [ - "# Show results in a plot:\n", - "fig,axarr=plt.subplots(3,npzbins,figsize=[15,10],gridspec_kw={'height_ratios': [3, 1, 1]})\n", - "\n", - "## Top row: n(z) for each tomographic bin for each depth group\n", - "## Middle row: change in meanz as a function of depth with bootstrap errors\n", - "## Bottom row: change in sigmaz as a function of depth with boostrap errors\n", - "\n", - "for ii in range(npzbins):\n", - " \n", - " # top row\n", - " plt.sca(axarr[0,ii])\n", - " for q in range(nquantiles):\n", - " colorlab = q/(nquantiles*1.2)\n", - " nz = stat_summary_split[\"tomo-%d\"%(ii+1)][q][0]\n", - " plt.plot(nz[:,0], nz[:,1]/np.sum(nz[:,1])/(nz[1,0]-nz[0,0]), \n", - " color=cmap(colorlab))\n", - " plt.text(0.6, 3.5, \"tomo-%d\"%(ii+1))\n", - " plt.yticks([])\n", - " plt.xlabel(\"$z$\")\n", - " \n", - " # middle row\n", - " plt.sca(axarr[1, ii])\n", - " for q in range(nquantiles):\n", - " colorlab = q/(nquantiles*1.2)\n", - " \n", - " meanz = stat_summary_split[\"tomo-%d\"%(ii+1)][q][1]\n", - " meanztot = stat_summary_tot[\"tomo-%d\"%(ii+1)][q][1]\n", - " \n", - " plt.errorbar(meanv[q], meanz[0], yerr=meanz[1],fmt='o',\n", - " color=cmap(colorlab))\n", - " #dz = 0.005*(1+meanztot[0])\n", - " plt.plot(meanv, np.ones(len(meanv))*meanztot[0], 'k-', alpha=0.5)\n", - " #plt.fill_between([meanv[0], meanv[-1]], [-dz, -dz], \n", - " #[dz, dz],color='k',alpha=0.2)\n", - " if ii==0:\n", - " plt.ylabel(\"$\\\\langle z\\\\rangle$\")\n", - " if ii>0:\n", - " plt.yticks([])\n", - " #plt.xlabel(sys)\n", - " #plt.ylim([-0.015,0.015])\n", - " #plt.xlim([24.6, 25.7])\n", - " \n", - " # bottom row\n", - " plt.sca(axarr[2, ii])\n", - " for q in range(nquantiles):\n", - " colorlab = q/(nquantiles*1.2)\n", - " \n", - " sigmaz = stat_summary_split[\"tomo-%d\"%(ii+1)][q][2]\n", - " sigmaztot = stat_summary_tot[\"tomo-%d\"%(ii+1)][q][2]\n", - " \n", - " plt.errorbar(meanv[q], sigmaz[0], yerr=sigmaz[1],fmt='o',\n", - " color=cmap(colorlab))\n", - " #dz = 0.005\n", - " plt.plot(meanv, np.ones(len(meanv))*sigmaztot[0], 'k-', alpha=0.5)\n", - " #plt.fill_between([meanv[0], meanv[-1]], [-dz, -dz], \n", - " #[dz, dz],color='k',alpha=0.2)\n", - " if ii==0:\n", - " plt.ylabel(\"$\\\\sigma_z$\")\n", - " if ii>0:\n", - " plt.yticks([])\n", - " plt.xlabel(sys)\n", - " #plt.ylim([-0.015,0.015])\n", - "\n", - "plt.tight_layout()\n", - "plt.saveifg(savedir + 'fig.png', bbox_inches='tight')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "01ad28db-62c0-4f2f-abc2-fc4f6ee54c94", - "metadata": {}, - "outputs": [], - "source": [ - "###tests" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "rail_dev", - "language": "python", - "name": "rail_dev" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.4" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/nb/examples/survey_nonuniformity/survey_nonuniform.ipynb b/nb/examples/survey_nonuniformity/survey_nonuniform.ipynb new file mode 100644 index 0000000..5b2a87d --- /dev/null +++ b/nb/examples/survey_nonuniformity/survey_nonuniform.ipynb @@ -0,0 +1,712 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "62c833e4-fde5-4ba0-8406-966805b80ed2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Imported rail.hub\n", + "Imported rail.astro_tools\n", + "Imported rail.core\n", + "Imported rail.stages\n", + "Imported rail.bpz\n", + "Imported rail.cmnn\n", + "Imported rail.delight\n", + "Failed to import rail.dsps because: You need to have the SPS_HOME environment variable\n", + "Imported rail.flexzboost\n", + "Imported rail.gpz\n", + "Imported rail.pipelines\n", + "Failed to import rail.pzflow because: No module named 'rail.estimation.algos.pzflow'\n", + "Imported rail.sklearn\n", + "Imported rail.som\n", + "Attached 12 base classes and 57 fully formed stages to rail.stages\n" + ] + } + ], + "source": [ + "# usual imports\n", + "import os\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from rail.core.utils import find_rail_file\n", + "from rail.pipelines.examples.survey_nonuniformity.survey_nonuniformity import SurveyNonuniformDegraderPipeline\n", + "from rail.core import common_params\n", + "from rail.pipelines.utils.name_factory import NameFactory, DataType, CatalogType, ModelType, PdfType\n", + "import qp\n", + "import ceci" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "1d01d581-16b2-400e-9a68-8bb57a141a6b", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# other dependencies:\n", + "import healpy as hp\n", + "import tables_io" + ] + }, + { + "cell_type": "markdown", + "id": "2d022101-7f7b-4fb1-abaa-f1a4243027f9", + "metadata": {}, + "source": [ + "### Define the bands, magnitude limits, and put them into a dictionary" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "92e175b0-bcf4-4777-a165-a95afe061627", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "bands = 'ugrizy'\n", + "maglims = [27.05, 27.79, 29.04, 29.06, 28.62, 27.98]\n", + "maglim_dict={}\n", + "for band,limx in zip(bands, maglims):\n", + " maglim_dict[f\"mag_{band}_lsst\"] = limx" + ] + }, + { + "cell_type": "markdown", + "id": "3b1fb970-14d6-4e0c-b330-e341b6cb6be5", + "metadata": {}, + "source": [ + "### Setting common parameters to all the stages in the estimation\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "682d2489-ba1b-4344-af95-728667e53528", + "metadata": {}, + "outputs": [], + "source": [ + "common_params.set_param_defaults(\n", + " bands=[f'mag_{band}_lsst' for band in bands], # bands\n", + " err_bands=[f'mag_err_{band}_lsst' for band in bands], # uncertainty bands\n", + " nondetect_val=np.nan,\n", + " #ref_band='HSCi_cmodel_dered',\n", + " redshift_col='redshift',\n", + " mag_limits=maglim_dict,\n", + " #zmax=6.0, # set zmax to 6 for HSC\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "25accc6c-b50b-4acc-bfeb-1f72034e6d7e", + "metadata": {}, + "source": [ + "### Set up the pipeline" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "ba92106a-6ac6-42e3-822f-d5dcf30a5793", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Inserting handle into data store. model: /global/u2/q/qhang/desc/rail_base/src/rail/examples_data/goldenspike_data/data/pretrained_flow.pkl, flow_engine_train\n", + "Inserting handle into data store. output_flow_engine_train: catalog/created/inprogress_output_flow_engine_train.pq, flow_engine_train\n", + "Inserting handle into data store. output_obs_condition: catalog/degraded/inprogress_output_obscondition.pq, obs_condition\n", + "Inserting handle into data store. output_col_remapper: catalog/degraded/inprogress_output_col_remapper.pq, col_remapper\n", + "Inserting handle into data store. output_deredden: catalog/degraded/inprogress_output_deredden.pq, deredden\n", + "Inserting handle into data store. output_table_conv: catalog/degraded/inprogress_output_table_conv.hdf5, table_conv\n", + "Inserting handle into data store. model_inform_bpz: model/estimator/inprogress_trained_BPZ.pkl, inform_bpz\n", + "Inserting handle into data store. output_estimate_bpz: pdf/pz/inprogress_output_estimate_bpz.hdf5, estimate_bpz\n" + ] + } + ], + "source": [ + "pipe = SurveyNonuniformDegraderPipeline()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "6621e102-b0dd-4fb8-a524-6b4545189cf9", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "namer = NameFactory()" + ] + }, + { + "cell_type": "markdown", + "id": "bc6262c9-3a41-4ac9-9b15-5f68ed5dc0f2", + "metadata": {}, + "source": [ + "### Preparing input files" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "fb991e78-c465-48ec-89e1-93e5192c071b", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Downloading SFD data file to /global/u2/q/qhang/desc/rail_pipelines/nb/examples/survey_nonuniformity/sfd/SFD_dust_4096_ngp.fits\n", + "Downloading data to '/global/u2/q/qhang/desc/rail_pipelines/nb/examples/survey_nonuniformity/sfd/SFD_dust_4096_ngp.fits' ...\n", + "Downloading https://dataverse.harvard.edu/api/access/datafile/2902687 ...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 62.3 MiB of 64.0 MiB | 34.8 MiB/s |################## | 97% | ETA: 0:00:00" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Downloading SFD data file to /global/u2/q/qhang/desc/rail_pipelines/nb/examples/survey_nonuniformity/sfd/SFD_dust_4096_sgp.fits\n", + "Downloading data to '/global/u2/q/qhang/desc/rail_pipelines/nb/examples/survey_nonuniformity/sfd/SFD_dust_4096_sgp.fits' ...\n", + "Downloading https://dataverse.harvard.edu/api/access/datafile/2902695 ...\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " 64.0 MiB of 64.0 MiB | 31.6 MiB/s |###################| 100% | ETA: 00:00:00" + ] + } + ], + "source": [ + "# fetch dust map and save:\n", + "import dustmaps.sfd\n", + "dustmaps.sfd.fetch()" + ] + }, + { + "cell_type": "markdown", + "id": "4ce7267f-dc8c-4996-b2b4-394cb21dc55a", + "metadata": {}, + "source": [ + "Here, we will create a set of dummy coadd depth maps covering the DC2 area.\n", + "We will set the five-sigma depth roughly corresponds to mode of Y1. Pixels with $RA<62$ has a depth 1 magnitude shallower than $RA\\geq62$." + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "650cdbef-83c7-4a77-9df5-0eae563ccf51", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "setting the output map dtype to [dtype('>f8')]\n", + "setting the output map dtype to [dtype('>f8')]\n", + "setting the output map dtype to [dtype('>f8')]\n", + "setting the output map dtype to [dtype('>f8')]\n", + "setting the output map dtype to [dtype('>f8')]\n", + "setting the output map dtype to [dtype('>f8')]\n" + ] + } + ], + "source": [ + "# load the DC2 mask:\n", + "mask = hp.read_map(find_rail_file(\"examples_data/creation_data/data/survey_conditions/DC2-mask-neg-nside-128.fits\"))\n", + "mask[mask<0]=0\n", + "\n", + "m5={\n", + " \"u\":[23.80, 24.80],\n", + " \"g\":[25.20, 26.20],\n", + " \"r\":[25.25, 26.25],\n", + " \"i\":[24.50, 25.50],\n", + " \"z\":[24.20, 25.20],\n", + " \"y\":[23.25, 24.25],\n", + " }\n", + "\n", + "nside=hp.get_nside(mask)\n", + "for mm in m5.keys():\n", + " ipix=np.arange(len(mask))[mask.astype(bool)]\n", + " ra, dec=hp.pix2ang(nside,ipix,lonlat=True)\n", + " out=np.copy(mask)\n", + " out[ipix[ra<62]]=m5[mm][0]\n", + " out[ipix[ra>=62]]=m5[mm][1]\n", + " # save them in the current directory:\n", + " hp.write_map(f\"CoaddM5_{mm}_dummpy.fits\", out, overwrite=True)" + ] + }, + { + "cell_type": "markdown", + "id": "248e67cf-2583-4305-bbc1-62e3072453b0", + "metadata": {}, + "source": [ + "### Define parameters for each stage" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "526a1831-6094-4ff2-826b-0c3df8662b29", + "metadata": {}, + "outputs": [], + "source": [ + "# dictionary used by ObsCondition\n", + "# first define a set of input map directories:\n", + "# nside of maps\n", + "nside=128\n", + "\n", + "# coadd depth maps:\n", + "coaddm5_u = \"./CoaddM5_u_dummpy.fits\"\n", + "coaddm5_g = \"./CoaddM5_g_dummpy.fits\"\n", + "coaddm5_r = \"./CoaddM5_r_dummpy.fits\"\n", + "coaddm5_i = \"./CoaddM5_i_dummpy.fits\"\n", + "coaddm5_z = \"./CoaddM5_z_dummpy.fits\"\n", + "coaddm5_y = \"./CoaddM5_y_dummpy.fits\"\n", + "\n", + "# here we will set the observing year and number of visits per year to 1, because we are supplying coadd depth\n", + "\n", + "# mask:\n", + "maskdir = find_rail_file(\"examples_data/creation_data/data/survey_conditions/DC2-mask-neg-nside-128.fits\")\n", + "\n", + "# weight: for now we supply uniform weight\n", + "\n", + "band_dict={\n", + " \"u\": \"mag_u_lsst\",\n", + " \"g\": \"mag_g_lsst\",\n", + " \"r\": \"mag_r_lsst\",\n", + " \"i\": \"mag_i_lsst\",\n", + " \"z\": \"mag_z_lsst\",\n", + " \"y\": \"mag_y_lsst\",\n", + "}\n", + "\n", + "map_dict={\n", + " \"m5\": {\n", + " \"u\": coaddm5_u,\n", + " \"g\": coaddm5_g,\n", + " \"r\": coaddm5_r,\n", + " \"i\": coaddm5_i,\n", + " \"z\": coaddm5_z,\n", + " \"y\": coaddm5_y,\n", + " },\n", + " \"nYrObs\": 1.,\n", + " \"nVisYr\": {\n", + " \"u\": 1.,\n", + " \"g\": 1.,\n", + " \"r\": 1.,\n", + " \"i\": 1.,\n", + " \"z\": 1.,\n", + " \"y\": 1., \n", + " },\n", + " \"sigLim\": 3,\n", + " \"ndFlag\": np.nan,\n", + " \"extendedType\": \"point\", # not doing extended error here because no size info.\n", + " # if use extended errors, you might also want to supply\n", + " # PSF/seeing maps\n", + " \"majorCol\": \"major\",\n", + " \"minorCol\": \"minor\",\n", + " \"decorrelate\": True,\n", + " \"highSNR\": False,\n", + " \"renameDict\": band_dict, \n", + " }" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "2a64eb7b-d67e-422d-a60a-ed0085bbf677", + "metadata": {}, + "outputs": [], + "source": [ + "pipe.flow_engine_train.config.update(n_samples=200)\n", + "pipe.obs_condition.config.update(map_dict=map_dict, nside=nside, mask = maskdir, weight = \"\",)\n", + "pipe.deredden.config.update(dustmap_dir=\".\", copy_all_cols=True)# where to save the dust map downloaded\n", + "pipe.estimate_bpz.config.update(spec_groupname = \"\", redshift_colname = 'redshift', prior_band='i')\n", + "pipe.tomopraphy.config.update(nbins=3,)# uniform binning between [0,3], 3 bins" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "ff0d1439-169b-45dc-b224-27cc3189aab9", + "metadata": {}, + "outputs": [], + "source": [ + "from rail.core.utils import RAILDIR\n", + "flow_file = os.path.join(RAILDIR, 'rail/examples_data/goldenspike_data/data/pretrained_flow.pkl')\n", + "pipe_info = pipe.initialize(dict(model=flow_file), dict(output_dir='.', log_dir='.', resume=True), None)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "bc2f4d20-3dc5-40be-bd99-3c5d36e7d700", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(({'flow_engine_train': ,\n", + " 'obs_condition': ,\n", + " 'col_remapper': ,\n", + " 'deredden': ,\n", + " 'table_conv': ,\n", + " 'inform_bpz': ,\n", + " 'estimate_bpz': ,\n", + " 'tomopraphy': },\n", + " [,\n", + " Loaded observing conditions from configuration file: \n", + " nside = 128, \n", + " mask file: /global/u2/q/qhang/desc/rail_astro_tools/src/rail/examples_data/creation_data/data/survey_conditions/DC2-mask-neg-nside-128.fits, \n", + " weight file: , \n", + " tot_nVis_flag = True, \n", + " random_seed = 42, \n", + " map_dict contains the following items: \n", + " {'m5': {'u': './CoaddM5_u_dummpy.fits', 'g': './CoaddM5_g_dummpy.fits', 'r': './CoaddM5_r_dummpy.fits', 'i': './CoaddM5_i_dummpy.fits', 'z': './CoaddM5_z_dummpy.fits', 'y': './CoaddM5_y_dummpy.fits'}, 'nYrObs': 1.0, 'nVisYr': {'u': 1.0, 'g': 1.0, 'r': 1.0, 'i': 1.0, 'z': 1.0, 'y': 1.0}, 'sigLim': 3, 'ndFlag': nan, 'extendedType': 'point', 'majorCol': 'major', 'minorCol': 'minor', 'decorrelate': True, 'highSNR': False, 'renameDict': {'u': 'mag_u_lsst', 'g': 'mag_g_lsst', 'r': 'mag_r_lsst', 'i': 'mag_i_lsst', 'z': 'mag_z_lsst', 'y': 'mag_y_lsst'}},\n", + " Stage that applies remaps the following column names in a pandas DataFrame:\n", + " f{str(self.config.columns)},\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ]),\n", + " {'output_dir': '.', 'log_dir': '.', 'resume': True})" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pipe_info" + ] + }, + { + "cell_type": "markdown", + "id": "e0b21b58-94ca-425a-bf23-aedcc34cf233", + "metadata": {}, + "source": [ + "### Save the pipeline into a yml file" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "bcd3534c-ce25-48d9-a629-49ce17cdd279", + "metadata": {}, + "outputs": [], + "source": [ + "pipe.save('tmp_survey_nonuniformity.yml')" + ] + }, + { + "cell_type": "markdown", + "id": "333d990d-8050-4815-8329-74af6e94ada6", + "metadata": {}, + "source": [ + "### run pipeline" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "7943d633-f27c-469b-944b-2ea79ee011ec", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Inserting handle into data store. model: /global/u2/q/qhang/desc/rail_base/src/rail/examples_data/goldenspike_data/data/pretrained_flow.pkl, flow_engine_train\n" + ] + } + ], + "source": [ + "import ceci\n", + "pr = ceci.Pipeline.read('tmp_survey_nonuniformity.yml')" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "a206fbe7-757e-4df6-803f-3abf170874de", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Executing flow_engine_train\n", + "Command is:\n", + "OMP_NUM_THREADS=1 python3 -m ceci rail.creation.engines.flowEngine.FlowCreator --model=/global/u2/q/qhang/desc/rail_base/src/rail/examples_data/goldenspike_data/data/pretrained_flow.pkl --name=flow_engine_train --config=tmp_survey_nonuniformity_config.yml --output=./catalog/created/output_flow_engine_train.pq \n", + "Output writing to ./flow_engine_train.out\n", + "\n", + "Job flow_engine_train has failed with status 1\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n", + "*************************************************\n", + "Error running pipeline stage flow_engine_train.\n", + "\n", + "Standard output and error streams in ./flow_engine_train.out\n", + "*************************************************\n" + ] + }, + { + "data": { + "text/plain": [ + "1" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pr.run() # this somehow is not using the rail_dev environment to run" + ] + }, + { + "cell_type": "markdown", + "id": "68517448-1a1e-48fc-85f5-ea3ccbb541b8", + "metadata": {}, + "source": [ + "### *If you are running this on nersc:* \n", + "\n", + "Better use command line as Jupyter notebook may fail:\n", + "\n", + "```\n", + "ceci tmp_survey_nonuniformity.yml\n", + "```\n", + "\n", + "You need to set name of `site: name:` to `local` or `nersc` in `tmp_survey_nonuniformity.yml`. \n", + "\n", + "You might want to require an interactive node for the `flowEngine` to work (takes about 2.5G memory):\n", + "\n", + "```\n", + "salloc --nodes 1 --qos interactive --time 00:10:00 --constraint cpu\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "5a507f0b-c130-4c74-b964-262f97c49629", + "metadata": { + "tags": [] + }, + "source": [ + "# Check n(z) in tomographic bins with depth:" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "26c06fb4-0a88-4102-8415-11d08a3efd37", + "metadata": {}, + "outputs": [], + "source": [ + "# load the tomographic bins:\n", + "ftomo=tables_io.read(\"./pdf/pz/output_tomography.hdf5\")\n", + "tomo=ftomo['class_id']\n", + "objid=ftomo['row_index']" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "06e3c212-4cae-42cb-a1ee-4125d03ed2fa", + "metadata": {}, + "outputs": [], + "source": [ + "# load the object ra, dec:\n", + "fobj=tables_io.read(\"./catalog/degraded/output_table_conv.hdf5\")\n", + "ra=fobj['ra']\n", + "redshift=fobj['redshift']\n", + "magi=fobj['mag_i_lsst']\n", + "magi_err=fobj['mag_err_i_lsst']" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "id": "af3a447c-bed7-4101-98e8-42838ee4ed37", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "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n5+vffv2KTw8XB07dlRqaqqOHz+uNWvWSJIyMzN1/fXXKyEhQRcuXNCrr76q9evXa/369eYdIADAKS43pUJCQrRu3Tr9+c9/1ieffKKmTZuqZ8+eio2NdauA+Ph47du3T6dOndL69es1fvx45ebm2h+/+mNiDcO45kfHcr03AFiD2XkBAGg4zMyIvLw8DR061L6ckpIiSRo/fryysrJUUFBQ7T5VFy5c0KOPPqrjx4+radOmSkhI0LvvvquRI0fW/8AAAC5xuSl12fXXXy/DMNSpUyf7uxvuCAkJsd/ovF+/fvr444/17LPP6o9//KMkqbCwsNqptEVFRTXOnrpSamqqPYikS2dKdejQwe36AAD1Y1ZeAAAaHjMyYsiQITIMw+HjWVlZ1ZbnzJmjOXPmuPVcAABzuXxPqbKyMj3wwANq1qyZEhIS7O86zJgxQwsXLqx3QYZhqLy8XHFxcYqKitLmzZvtj124cEG5ubkaOHCgw/253hsArMHTeQEA8F9kBABAcqMplZqaqk8++UQ5OTlq0qSJff0vfvELrVu3zqWx5s6dq3/961/69ttv9emnn2revHnKycnRPffcI5vNplmzZik9PV0bNmzQZ599pgkTJqhZs2YaN26cq2UDALzMzLwAADQsZAQAQHLj8r233npL69at04ABA6rd26l79+76+uuvXRrrhx9+0L333quCggK1atVKvXr10saNGzV8+HBJl06tPXfunKZOnaqTJ0+qf//+ys7OVlhYmKtlAwC8zMy8AAA0LGQEAEByoyn1448/KiIiosb6s2fPXvMG5LVZuXLlNR+32WxKS0tTWlqaS+MCAHzPzLwAADQsZAQAQHLj8r1bbrlF7777rn35cmi88sorSkxMNK8yAIBfIy8AAI6QEQAAyY0zpTIyMnTHHXfo4MGDqqio0LPPPqsDBw5o586dys3N9USNAAA/RF4AABwhIwAAkhtnSg0cOFDbt29XWVmZOnXqpOzsbEVGRmrnzp3q27evJ2oEAPgh8gIA4AgZAQCQ3DhTSpJ69uyp1atXm10LAKCBIS8AAI6QEQAAp5pSJSUlatmypf3f19KsWTMFBbnV6wIA+DnyAgDgCBkBALiaU5fvXXfddSoqKpIktW7dWtddd53DryZNmqhbt27aunWrRwsHAFgPeQEAcISMAABczam3H95//32Fh4dLUp3B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BgB4BXkBAHCEjAAASG40pUJDQ/Xzn//cE7U0GgE2KSKsSb3HKTpzXlWGCQUBgAeQFwAAR8gIAIDkRlNq5syZev755/Xcc895op5GISKsiXbNHVbvcQakb+HMKwCWRV4AABwhIwAAkhtNqY8++kjvv/++/vGPfyghIaHGTQnffPNN04oDAPgv8gIA4AgZAQCQ3GhKtW7dWqNHj/ZELXBT0ZnzGpC+xZRxAMAs5AUAwBEyAgAgudGUWrVqlSfqQD1UGeIyPgCWQ14AABwhIwAAkhtNKVhHu7BQvxoXAAAAAADgMpebUnFxcbLZbA4f/+abb+pVEJz3zvRBvi4BABwiLwAAjpARAADJjabUrFmzqi1fvHhRe/fu1caNG/XYY4+ZVRcAwM+RFwAAR8gIAIDkRlNq5syZta5ftmyZ8vLy6l0QAKBhIC8AAI6QEQAASQowa6Dk5GStX7/erOEAAA0UeQEAcISMAIDGxbSm1BtvvKHw8HCzhgMANFDkBQDAETICABoXly/f69OnT7WbEhqGocLCQv3444968cUXTS0OAOC/yAu45OUkqbTIvPFKC80bC4DpyAgAgORGU+quu+6qthwQEKB27dppyJAhuvHGG82qCwDg58gLuKS0SDrzva+rAOAlZAQAQHKjKfXkk096og4AQANDXsAttgCpRZR547WIMG8sAKYhIwAAkhtNKQAAAI9pESU9csjXVQDwMy+++KKefvppFRQUKCEhQZmZmbr11ltr3TYnJ0dDhw6tsf7QoUOcpQUAXuZ0UyogIKDadd+1sdlsqqioqHdRAAD/RV4AABzxREasW7dOs2bN0osvvqif//znevnll5WcnKyDBw+qY8eODvc7fPiwWrZsaV9u166d088JADCH002pDRs2OHxsx44dev7552UYhktPvm3bNj399NPavXu3CgoKtGHDhmrXlxuGofnz52vFihU6efKk+vfvr2XLlikhIcGl5wEAeI8n8gIA0DB4IiOWLl2qBx54QA8++KAkKTMzU5s2bdLy5cuVkZHhcL+IiAi1bt3apecCAJjL6abUnXfeWWPd559/rtTUVL3zzju655579Oc//9mlJz979qx69+6tiRMnasyYMTUeX7x4sZYuXaqsrCx17dpVCxYs0PDhw3X48GGFhYW59FwAAO/wRF4AABoGszPiwoUL2r17tx5//PFq60eM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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# total:\n", + "fig,axarr=plt.subplots(1,3,figsize=[12,3])\n", + "for ii in range(3):\n", + " ind1=tomo==(ii+1)\n", + " plt.sca(axarr[ii])\n", + " cc=plt.hist(redshift[ind1], bins=15, range=[0,3],label=f'tomo {ii+1}', \n", + " histtype='step',color=f'C{ii}', lw=2)\n", + " plt.legend(loc='upper right')\n", + " plt.xlabel(\"redshift\")\n", + " plt.ylabel(\"Number of objects\")\n", + "plt.tight_layout()" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "id": "a1dfe4fe-bdd7-4bc0-b09c-4776643953fd", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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p04aNmyY0tPTlZ6erqioKJ04cUK9e/dW+/bttWfPHs2fP18LFy7USy+9ZLN8YmKiateurR07dmjMmDF68skn9eCDD6pz587atWuX9To/Fy5ckCS7x3WVxMRE+fv7a8uWLXrvvfckSX5+fnrzzTe1d+9eJSYm6uuvv9akSZOKXf7MmTOaP3++OnbsqObNm2vnzp2aOXOmXn75Zes8q1evVrt27fTggw8qNDRUrVu31vvvv3/NurKysmSxWKx/6QAAb+SrmZGVlaWQkBCHt5fMAADnOJIX/1j8D72a8KrN8h9/8LFq1aqlrzd/rSeefEJxY+M0+JHB6tCxg5K3J6vHHT00/LHh1rw4eeKkHrr3IbVp28bpvDh8+LDWrl2rbt26Oby95IX9OFIKgI3q1asrMDBQlStXVnj476eKzJs3T1FRUXr77bdlsVh088036+TJk3rmmWc0depU+fld6XG3bNlSzz33nKQr13CYOXOmateurWHDhkmSpk6dqvnz5+u7775Tx44d7R7XVW688Ua98sorNtP+eK57dHS0XnzxRT355JOaN2+epCuHzn755ZdKTEzU6tWrddNNN2nAgAFauXKlIiIiiqzjyJEjmj9/vuLi4jRlyhTt2LFDY8eOVVBQkM01LgpdunRJkydP1iOPPKJq1aqZu8EAYCJfzIxly5bp3//+t/VLgiPIDABwjiN58dOxnzTt2Wl65tlnrJ/rzVs018T4iZKkuElxmjt7rkJqhWjQ0EGSpElTJmnhgoXa9/0+te/QXgvfW6gb6t6gV+e+qhoVaziUF4V/GMnJydETTzyhF154weHtJS/sR1MKgF0OHDigTp06yWKxWKfdeuutOnfunH755Rfr4Z+33HKL9fUKFSqoVq1aatGihXVaWFiYpCu3XnZkXFdp165dkWkbN27UjBkztH//fmVnZysvL0+XLl3S+fPnVaVKFR07dkz33HOPatasqQ8//FD333//NddRUFCgdu3aWc9Fb926tfbt26f58+cXCYzLly/r4YcfVkFBgTWgAMDXeGtmJCUlafDgwXr//fcVExPj8HaRGQBgruI+1zt06qBz587pxC8nFFUvSpIU0+L3z+wKFSqoZkhNxTT/fVpoWKgk6ddff5V05aLl7Tu0dyovli5dqrNnz2rPnj2aOHGiZs+eXeIRTSUhL+zH6XsA7GIYhs2HeuE0STbTr76VssVisZlWOG9BQYFD47pKlSpVbJ4fPXpUvXv3VvPmzbV8+XLt3LlT77zzjiRZ77xRt25dffTRR+rQoYP69++v2267Te+//36J17aKiIhQs2bNbKY1bdrU5qKrheM/9NBDSktL0/r1673qLxgA4AhvzIzk5GT16dNHc+bMKfYvyPYgMwDAXPZ+rvsH2B5PY7FYbKaZmRdRUVFq1qyZ/vrXv2rmzJmaNm2a8vPzHdks8sIBNKUAFBEYGFjkg7dZs2baunWrzQVFt27dquDgYOsdIJzhqnGdlZKSory8PL322mvq2LGjbrrppiK3TfX399fDDz+sL7/8UseOHVOfPn00d+5chYeH68EHH9Tq1attbh1766236uDBgzZjHDp0SPXr17c+LwyLH3/8Uf/v//0/1apVy7UbCgAm8YXMSEpK0t13362ZM2fqiSeecHr9VyMzAMB+9ubFju07FBwcrMgbIp1e180336wd23eUOocMw9Dly5cdutlOcciLktGUAlBEgwYN9O233+rnn3/WqVOnVFBQoJEjR+r48eMaM2aMfvjhB3366ad6/vnnFRcXV6rrPjk77v79+5WamqrTp08rKytLqampSk1NdbqOQo0aNVJeXp7eeustHTlyRP/4xz/07rvvljh/RESEJk2apH379mnz5s0KCwvTY489psmTJ1vnGT9+vLZv364ZM2bo8OHD+vDDD7VgwQKNGjVKkpSXl6cHHnhAKSkp+uc//6n8/HxlZGQoIyNDubm5pd4mAHAlb8+MwobU2LFj1a9fP+vn6+nTp52uoxCZAQD2szcvEl5M0MixI0uVF0OHD9WJX05o0vhJdufFP//5T/3rX//SgQMHdOTIEX3yySeKj49X//79S7xjn73Ii5JxTSnAQzLPXlLHGa6/XWvm2UsOLzNhwgQNGjRIzZo108WLF623a12zZo0mTpyoli1bKiQkREOHDrVeoNZZN9xwg1Pj9u7dW0ePHrU+b926taTfD8v9+eefFR0drY0bNyo2Ntbuelq1aqU5c+Zo1qxZio+PV9euXZWQkGDXqR7t2rVTu3btNGfOHP3yyy/W6e3bt9fKlSsVHx+vF154QdHR0Zo7d64effRRSdIvv/yi1atXW9f/R47WD6CMOpchvdbU9etwgrdnxuLFi3XhwgUlJCQoISHBOr1bt25KSkqSRGYAKDtO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zxUIAPAK5AUAwF5kBjzN39MFAN4uNzdXgYGBni5D4eHhNs9/+ukn3X333apfv76HKgIA/BF5AQCwF5kBXMGRUsBVYmNjNXr0aMXFxal27dq64447tH//fvXu3VtVq1ZVWFiYBgwYoFOnTlmXOX/+vAYOHKiqVasqIiJCr732WpFx582bp8aNG6tixYoKCwvTAw88YPN6QUGBJk2apJCQEIWHh2vatGk2r//x0FqLxaKdO3fqhRdekMViUWxsrIYMGaKsrCxZLBZZLJYiywMAzEVeAADsRWYAxaMpBRQjMTFR/v7+2rJli2bOnKlu3bqpVatWSklJ0dq1a/Wf//xHDz30kHX+iRMnauPGjVq5cqXWrVunpKQk7dy50/p6SkqKxo4dqxdeeEEHDx7U2rVr1bVr1yLrrFKlir799lu98soreuGFF7R+/fpi60tPT1dMTIyefvpppaena/Xq1Zo7d66qVaum9PR0paena8KECa754QAArMgLAIC9yAygKE7fA4px44036pVXXpEkTZ06VW3atNGMGTOsr//9739XVFSUDh06pMjISC1cuFBLlizRHXfcIenKh3/dunWt8x87dkxVqlTRPffco+DgYNWvX1+tW7e2Wectt9yi559/XpLUuHFjvf3229qwYYN1zD8KDw+Xv7+/qlataj3ktnr16rJYLEUOwQUAuA55AQCwF5kBFEVTCihGu3btrP/euXOnNm7cqKpVqxaZ76efftLFixeVm5urTp06WaeHhISoSZMm1ud33HGH6tevr4YNG+quu+7SXXfdpfvuu0+VK1e2znPLLbfYjB0REaHMzEwzNwsAYDLyAgBgLzIDKIrT94BiVKlSxfrvgoIC9enTR6mpqTaPH3/8UV27dpVhGNcdLzg4WLt27dJHH32kiIgITZ06VS1bttRvv/1mnScgIMBmGYvFooKCAtO2CQBgPvICAGAvMgMoiqYUcB1t2rTRvn371KBBA9144402jypVqujGG29UQECAtm/fbl3mzJkzOnTokM04/v7++vOf/6xXXnlF3333nX7++Wd9/fXXptUZGBio/Px808YDADiGvAAA2IvMAK6gKQVcx6hRo3T69Gn99a9/1Y4dO3TkyBGtW7dOjz32mPLz81W1alUNHTpUEydO1IYNG7R3714NHjxYfn6/v70+//xzvfnmm0pNTdXRo0e1ZMkSFRQU2Bx+W1oNGjTQuXPntGHDBp06dUoXLlwwbWwAwPWRFwAAe5EZwBU0pYDriIyM1JYtW5Sfn68777xTzZs311NPPaXq1atbQ+HVV19V165d9Ze//EV//vOf1aVLF7Vt29Y6Ro0aNbRixQrdfvvtatq0qd5991199NFHiomJMa3Ozp07a8SIEerfv7/q1KljvYgiAMA9yAsAgL3IDOAKi2HPyaoAAAAAAACAiThSCgAAAAAAAG5HUwoAAAAAAABuR1MKAAAAAAAAbkdTCgAAAAAAAG5HUwoAAAAAAABuR1MKAAAAAAAAbkdTCgAAAAAAAG5HUwoAAAAAAABuR1MKAAAAAAAAbkdTCgAAAAAAAG5HUwoAAAAAAABuR1MKAAAAAAAAbvf/AUVRFLXticDvAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# now also split in depth:\n", + "fig,axarr=plt.subplots(1,3,figsize=[12,3])\n", + "for ii in range(3):\n", + " ind1=tomo==(ii+1)\n", + " ind2=ra<62\n", + " plt.sca(axarr[ii])\n", + " cc=plt.hist(redshift[ind1*ind2], bins=15, range=[0,3],label=f'tomo {ii+1}, ra<62', \n", + " histtype='step',color=f'C{ii}', lw=2)\n", + " cc=plt.hist(redshift[ind1*(~ind2)], bins=15, range=[0,3],label=f'tomo {ii+1}, ra>=62', \n", + " color=f'C{ii}', alpha=0.35)\n", + " plt.legend()\n", + " plt.xlabel(\"redshift\")\n", + " plt.ylabel(\"Number of objects\")\n", + "plt.tight_layout()" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "id": "dc934d61-8523-45d7-9ef2-9eccc5866ef1", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "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5ptvSpKqVaum1157TXv37lViYqI+/fRTTZkypdTlT58+rUWLFqlbt25q06aN0tLSNGfOHL3wwgv2edatW6cuXbronnvuUVhYmDp27Ki33nrrsnVlZ2fLZrPZ/9IBAFbkq5mRnZ2t0NBQp7eXzAAA1/hiXnz//ffasGGDevfu7fT2khflZ9kLnQPwjjp16iggIEA1a9ZUo0b/PVVk4cKFioqK0uuvvy6bzabrrrtOP//8s6ZOnaoZM2aoWrVLPe727dvr6aeflnTpGg5z5sxRgwYNNHLkSEnSjBkztGjRIn399dfq1q1bucd1l2uuuUYvvviiw7TfnuseHR2t5557Tk888YQWLlwo6dKhsx9//LESExO1bt06/eEPf9CQIUO0Zs0aRURElFjH4cOHtWjRIsXGxmr69On68ssvNX78eAUGBjpc46JYXl6epk2bpgcffFAhISHmbjAAmMgXM2P16tX66quv7F8SnEFmAIBrfCkvihtd+fn5euyxxzRr1iynt5e8KD+aUgDK5cCBA+revbtsNpt92g033KCzZ8/qp59+sh/+2a5dO/vr1atXV/369dW2bVv7tPDwcEmXbr3szLju0qVLlxLTtmzZotmzZ2v//v3KyclRQUGB8vLydO7cOdWqVUvHjh3T7bffrnr16mnlypW66667LruOoqIidenSxX4ueseOHbVv3z4tWrSoRGBcvHhR999/v4qKiuwBBQC+xqqZkZycrOHDh+utt95S69atnd4uMgMAzGXFvFi1apXOnDmjPXv2aPLkyZo3b16ZRzSVhbwoP07fA1AuhmE4fKgXT5PkMP33t1K22WwO04rnLSoqcmpcd6lVq5bD86NHj2rAgAFq06aNkpKSlJaWpjfeeEOS7HfeuPrqq/XOO+/o+uuv13333acbb7xRb731VpnXtoqIiFCrVq0cprVs2dLhoqvF49977706cuSINm3aZKm/YACAM6yYGSkpKRo4cKDmz59f6l+Qy4PMAABzWTEvoqKi1KpVKz3wwAOaM2eOnn32WRUWFjqzWeSFE2hKASghICCgxAdvq1attGPHDocLiu7YsUPBwcH2O0C4wl3juio1NVUFBQV6+eWX1a1bN/3hD38ocdtUPz8/3X///fr444917NgxDRw4UAkJCWrUqJHuuecerVu3zuHWsTfccIMOHjzoMMahQ4fUpEkT+/Pi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Sc2bN1dBQYEWLFiggQMHavv27Vq8eLHDPMeOHVPLli0VExOjmTNnavDgwSX+GvJbzhxaa7PZNHnyZD3zzDNq3769OnTooMTERH377bdavfrSdWV+/vlnxcTEqHHjxpo3b55++eUX+/IVuRshALjC6pmRnJys2267TRMmTNDgwYOVmZkp6dKXo4pevJXMAIDys3pe/POf/5S/v7/atm2rwMBApaWlKS4uTvfdd5/8/CrWOiEvymb5ptTFixd177336siRI/r000+veCHBuLg4h0PacnJyFBUV5e4ygUrlySef1LBhw9SqVSudP39eR44cUdOmTbV+/XpNnjxZ7du3V2hoqB555BE9/fTTFVrXVVdd5dK4AwYM0NGjR+3PO3bsKOm/h+X++OOPio6O1pYtWxQTE1Puejp06KD58+dr7ty5iouLU69evRQfH+9wqkeDBg105MgRt13vauLEicrLy9OkSZN06tQptW/fXps2bVLz5s0lSRs3btT333+v77//XldffbXDsl68dwWAKsrqmbF8+XLl5uYqPj7e4ZoZvXv3VnJysiQyAwA8wep54efnp7lz5+rQoUMyDENNmjTRmDFjNGnSJPs85IX5vHr3vd+y2WwOd9+T/tuQ+u6777RlyxY1bNjQ6XGtdmcMq+Pue+a67N2U4FbJycm68847dfjwYdWrV8/b5Xgdd1K6Mn4OlVBlufse3I7McERmXJnVfg7cfa9qITO8h7xw5PN33zt79qy+//57+/MjR44oPT1doaGhioyM1N13361du3bpww8/VGFhof1w69DQUAUEBHirbAA+YMOGDZo+fTphAQC4IjIDAFAe5IX5vNqUSk1NVZ8+fezPi0+7GzZsmJ599lmtW7dOUslrxDh7qByAqmfOnDneLgEA4CPIDABAeZAX5vNqUyomJuay5yZa5MxCAAAAAAAAmIz7wQIAAAAAAMDjaEoBAAAAAADA45xuSp0/f165ubn250ePHlVCQoI2btxoamFAZcKpqPA2b/wOkheA88gLWIEnfg/JCKDiyAx4mxm/g043pQYNGqQVK1ZIkn799Vddf/31evnllzVo0CAtWrSowgUBlUn16tUlSRcuXPByJajqiv/j7+/v77F1khdA+RW/N3/7JR3wFk9kBhkBuI7vGLAKM/LC6Qud79q1S6+88ookafXq1QoPD9fu3buVlJSkGTNm6IknnnC5GKCy8fPzU82aNfXLL7/I399f1apxxiw8yzAM5ebmKisrS3Xr1rX/J8YTyAug/KpXr666desqKytLklSzZk3ZbDYvV4WqxpOZQUYAruM7BrzNzLxwuimVm5ur4OBgSdLGjRt11113qVq1aurWrZuOHj3qciFAZWSz2RQREaEjR47w/oBX1a1bV40aNfLoOskLwDnF79HixhTgLZ7IDDICcB3fMWAVZuSF002pa665RmvXrtWdd96pTz75RJMmTZJ06T9QISEhFSoGqIwCAgJ07bXXcngtvMbf39+jR0gVIy8A5xR/yQgLC9PFixe9XQ6qKE9lBhkBVAzfMeBtZuWF002pGTNm6MEHH9SkSZPUt29fde/eXdKlv3B07NixwgUBlVG1atUUFBTk7TIAjyIvANdUr17dK41kwJPICKDi+I6BysDpptTdd9+tnj17KiMjQ+3bt7dP79u3r+666y5TiwMA+C7yAgBQFjICACC5cPe9hx9+WLVq1VLHjh0dLqjWunVrzZ0719TiAAC+i7wAAJSFjAAASC40pRITE3X+/PkS08+fP2+/rSsAAOQFAKAsZAQAQHLi9L2cnBwZhiHDMHTmzBmHc1cLCwu1fv16hYWFuaVIAIDvIC8AAGUhIwAAv1XuplTdunVls9lks9n0hz/8ocTrNptNM2fONLU4AIDvIS8AAGVxR0Zs3bpVL730ktLS0pSRkaE1a9bojjvuKHP+5ORk9enTp8T0AwcO6LrrrnNq3QCAiil3U2rLli0yDEN/+tOflJSUpNDQUPtrAQEBatKkiSIjI91SJADAd5AXAICyuCMjzp07p/bt22vEiBEaPHhwuZc7ePCgQkJC7M8bNmzo1HoBABVX7qZU7969JUlHjhxR48aNZbPZ3FYUAMB3kRcAgLK4IyP69++v/v37O71cWFiY6tatW+H1AwBc5/SFzj/99FOtXr26xPT33ntPiYmJphQFAPB95AUAoCxWyIiOHTsqIiJCffv21ZYtWzyyTgCAI6ebUnPmzFGDBg1KTA8LC9Ps2bNNKQoA4PvICwBAWbyZEREREVqyZImSkpL0/vvvq0WLFurbt6+2bt1a5jL5+fnKyclxeAAAKs7pptTRo0cVHR1dYnqTJk107NgxU4oCAPg+T+dFQUGBnn76aUVHR6tGjRpq1qyZZs2apaKiItPXBQCoGG9+p2jRooVGjhypTp06qXv37lq4cKFuu+02zZs3r8xl4uPjVadOHfsjKirKrTUCQFXhdFMqLCxMX3/9dYnpe/bsUf369U0pCgDg+zydF3PnztXixYv1+uuv68CBA3rxxRf10ksvacGCBaavCwBQMVb7TtGtWzd99913Zb4eFxen7Oxs++P48eMerA4AKq9yX+i82P3336/x48crODhYvXr1kiSlpKRowoQJuv/++00vEADgmzydFzt37tSgQYN02223SZKaNm2qd955R6mpqaavCwBQMVb7TrF7925FRESU+XpgYKACAwM9WBEAVA1OHyn1/PPP6/rrr1ffvn1Vo0YN1ahRQ/369dOf/vQnp8//3rp1qwYOHKjIyEjZbDatXbvW4XXDMPTss88qMjJSNWrUUExMjPbt2+dsyQAALzAzL8qjZ8+e2rx5sw4dOiTp0l/bt23bpgEDBpi+LgBAxZiZEWfPnlV6errS09MlXbqzX3p6uv00wLi4OA0dOtQ+f0JCgtauXavvvvtO+/btU1xcnJKSkjR27FjTtg8AUD5OHykVEBCgVatW6bnnntOePXtUo0YNtW3bVk2aNHF65efOnVP79u01YsQIDR48uMTrL774oubPn6/ly5frD3/4g55//nndfPPNOnjwoIKDg51eHwDAc8zMi/KYOnWqsrOzdd1116l69eoqLCzUCy+8oAceeKDU+fPz85Wfn29/zkVrAcBzzMyI1NRU9enTx/48NjZWkjRs2DAtX75cGRkZDtepunDhgp588kmdOHFCNWrUUOvWrfXRRx/xRwwA8AKnm1LFmjZtKsMw1Lx5c/n5uTZM//791b9//1JfMwxDCQkJeuqpp3TXXXdJkhITExUeHq6VK1fq8ccfd7V0AIAHmZEX5bFq1Sq9/fbbWrlypVq3bq309HRNnDhRkZGRGjZsWIn54+PjNXPmTLfVAwC4MjMyIiYmRoZhlPn68uXLHZ5PmTJFU6ZMcWldAABzOf3Jn5ubq3HjxikxMVGSdOjQITVr1kzjx49XZGSkpk2bZkphR44cUWZmpvr162efFhgYqN69e2vHjh1lNqX4y7d1zPvkoHLyCkwdM379t2oYHKgPxvU0dVwA5vNUXhSbPHmypk2bZr8WSdu2bXX06FHFx8eX2pSKi4uz/zVdupQX3E0JADzD0xkBALAmp68pFRcXpz179ig5OVlBQUH26TfddJNWrVplWmGZmZmSpPDwcIfp4eHh9tdKw+1arSMnr0DZ5y+a+sjMydMvZ/KvvHIAXuepvCiWm5uratUcY6169eoqKioqdf7AwECFhIQ4PAAAnuHpjAAAWJPTR0qtXbtWq1atUrdu3WSz2ezTW7VqpR9++MHU4iQ5rEO6dFrf76f9Fn/5th6bTQoJ8q/wODl5F3WZI7MBWIyn82LgwIF64YUX1LhxY7Vu3Vq7d+/W/Pnz9fDDD5u+LgBAxXg6IwAA1uR0U+qXX35RWFhYiennzp27bLPIWY0aNZJ06Yip396eNSsrq8TRU7/F7VqtJyTIX7MGta7wODP+tU/Z5y+aUBEAT/BUXhRbsGCB/va3v2n06NHKyspSZGSkHn/8cc2YMcP0dQEAKsbTGQEAsCanT9/r2rWrPvroI/vz4tB466231L17d9MKi46OVqNGjbRp0yb7tAsXLiglJUU9evQwbT0AAPfwVF4UCw4OVkJCgo4eParz58/rhx9+0PPPP6+AgADT1wUAqBhPZwQAwJqcPlIqPj5et956q/bv36+CggK9+uqr2rdvn3bu3KmUlBSnxjp79qy+//57+/MjR44oPT1doaGhaty4sSZOnKjZs2fr2muv1bXXXqvZs2erZs2aevDBB50tGwDgYWbmBQCgciEjAACSC0dK9ejRQ9u3b1dubq6aN2+ujRs3Kjw8XDt37lTnzp2dGis1NVUdO3ZUx44dJUmxsbHq2LGj/VSLKVOmaOLEiRo9erS6dOmiEydOaOPGjQoODna2bACAh5mZFwCAyoWMAABILhwpJV26zXbx7VsrIiYmRsZlrlxts9n07LPP6tlnn63wugAAnmdWXgAAKh8yAgBQrqZUTk6O/VbZOTk5l523Zs2a8vNzqdcFAPBx5AUAoCxkBADg98p1+l69evWUlZUlSapbt67q1atX5iMoKEgtW7bUli1b3Fo4AMB6yAsAQFnICADA75Xrzw+ffvqpQkNDJemKwZCfn6+1a9fqiSee0LffflvxCgEAPoO8AACUhYwAAPxeuZpSvXv3LvXfZenQoYO+/PJL16sCAPgk8gIAUBYyAgDwey6dqF1YWKg1a9bowIEDstlsatmypQYNGmQ/7zssLEypqammFgoA8D3kBQCgLGQEAMDpptTevXs1aNAgZWZmqkWLFpKkQ4cOqWHDhlq3bp3atm1repEAAN9DXgAAykJGAACkcl7o/LceffRRtW7dWj/99JN27dqlXbt26fjx42rXrp0ee+wxd9QIAPBB5AUAoCxkBABAcuFIqT179ig1NVX16tWzT6tXr55eeOEFde3a1dTiAAC+i7wAAJSFjAAASC4cKdWiRQv9+9//LjE9KytL11xzjSlFAQB8H3kBACgLGQEAkMrZlMrJybE/Zs+erfHjx2v16tX66aef9NNPP2n16tWaOHGi5s6d6+56AQAWRl4AAMpCRgAAfq9cp+/VrVtXNpvN/twwDN177732aYZhSJIGDhyowsJCN5QJAPAF5AUAoCxkBADg98rVlNqyZYu76wAAVALkBQCgLGQEAOD3ytWU6t27t7vrAABUAuQFAKAsZAQA4PecvvueJP36669aunSpDhw4IJvNplatWunhhx9WnTp1zK4PAODDyAsAQFnICACA03ffS01NVfPmzfXKK6/o1KlTOnnypObPn6/mzZtr165d7qgRAOCDyAsAQFnICACA5MKRUpMmTdKf//xnvfXWW/Lzu7R4QUGBHn30UU2cOFFbt241vUgAgO8hLwAAZSEjAACSC02p1NRUh/CQJD8/P02ZMkVdunQxtTgAgO8iLwAAZSEjAACSC6fvhYSE6NixYyWmHz9+XMHBwaYUBQDwfeQFAKAsZAQAQHKhKXXffffpkUce0apVq3T8+HH99NNPevfdd/Xoo4/qgQcecEeNAAAfRF4AAMpCRgAAJBdO35s3b55sNpuGDh2qgoICSZK/v7+eeOIJzZkzx/QCAQC+ibwAAJSFjAAASC4cKRUQEKBXX31Vp0+fVnp6unbv3q1Tp07plVdeUWBgoKnFFRQU6Omnn1Z0dLRq1KihZs2aadasWSoqKjJ1PQAA83kyLwAAvoWMAABILhwpVaxmzZpq27atmbWUMHfuXC1evFiJiYlq3bq1UlNTNWLECNWpU0cTJkxw67oBAObwRF4AAHwTGQEAVZvLTSlP2LlzpwYNGqTbbrtNktS0aVO98847Sk1N9XJlAAAAAAAAqAinT9/zpJ49e2rz5s06dOiQJGnPnj3atm2bBgwYUOYy+fn5ysnJcXgAAAAAAADAWix9pNTUqVOVnZ2t6667TtWrV1dhYaFeeOGFy96RIz4+XjNnzvRglQAAAAAAAHBWuY6U6tSpk06fPi1JmjVrlnJzc91aVLFVq1bp7bff1sqVK7Vr1y4lJiZq3rx5SkxMLHOZuLg4ZWdn2x/Hjx/3SK0AAO/lRbETJ07oL3/5i+rXr6+aNWuqQ4cOSktL82gNAIDSeTsjAADWU66m1IEDB3Tu3DlJ0syZM3X27Fm3FlVs8uTJmjZtmu6//361bdtWQ4YM0aRJkxQfH1/mMoGBgQoJCXF4AAA8w1t5IUmnT5/WDTfcIH9/f3388cfav3+/Xn75ZdWtW9djNQAAyubNjAAAWFO5Tt/r0KGDRowYoZ49e8owDM2bN0+1a9cudd4ZM2aYVlxubq6qVXPsm1WvXl1FRUWmrQMAYB5v5YV06Y6tUVFRWrZsmX1a06ZNTV0HAMB13swIAIA1lasptXz5cj3zzDP68MMPZbPZ9PHHH8vPr+SiNpvN1AAZOHCgXnjhBTVu3FitW7fW7t27NX/+fD388MOmrQMAYB5v5YUkrVu3TrfccovuuecepaSk6KqrrtLo0aM1cuRIU9cDAHCNNzMCAGBN5WpKtWjRQu+++64kqVq1atq8ebPCwsLcWpgkLViwQH/72980evRoZWVlKTIyUo8//jghBQAW5a28kKTDhw9r0aJFio2N1fTp0/Xll19q/PjxCgwM1NChQ0vMn5+fr/z8fPtz7tYKAO7lzYwAAFiT03ff8+Spc8HBwUpISFBCQoLH1gkAMIenT7UuKipSly5dNHv2bElSx44dtW/fPi1atKjUphR3awUA7+FyHAAAyYWmlCT98MMPSkhI0IEDB2Sz2dSyZUtNmDBBzZs3N7s+AIAP82ReREREqFWrVg7TWrZsqaSkpFLnj4uLU2xsrP15Tk6OoqKiTK8LAFA6vlMAAMp1973f+uSTT9SqVSt9+eWXateundq0aaMvvvhCrVu31qZNm9xRIwDAB3k6L2644QYdPHjQYdqhQ4fUpEmTUufnbq0A4D18pwAASC4cKTVt2jRNmjRJc+bMKTF96tSpuvnmm00rDgDguzydF5MmTVKPHj00e/Zs3Xvvvfryyy+1ZMkSLVmyxNT1AAAqju8UAADJhSOlDhw4oEceeaTE9Icfflj79+83pSgAgO/zdF507dpVa9as0TvvvKM2bdroueeeU0JCgh566CHT1wUAqBi+UwAAJBeaUg0bNlR6enqJ6enp6dw9AwBg5428uP322/XNN98oLy9PBw4c0MiRI92yHgBAxZiZEVu3btXAgQMVGRkpm82mtWvXXnGZlJQUde7cWUFBQWrWrJkWL17s1DoBAOZw+vS9kSNH6rHHHtPhw4fVo0cP2Ww2bdu2TXPnztVf//pXd9QIAPBB5AUAoCxmZsS5c+fUvn17jRgxQoMHD77i/EeOHNGAAQM0cuRIvf3229q+fbtGjx6thg0blmt5AIB5nG5K/e1vf1NwcLBefvllxcXFSZIiIyP17LPPavz48aYXCADwTeQFAKAsZmZE//791b9//3LPv3jxYjVu3FgJCQmSLt2pNTU1VfPmzaMpBQAe5nRTymazadKkSZo0aZLOnDkjSQoODja9MACAbyMvAABl8WZG7Ny5U/369XOYdsstt2jp0qW6ePGi/P39PVIHAMCFptRv8eUCAFAe5AUAoCyezojMzEyFh4c7TAsPD1dBQYFOnjypiIiIEsvk5+crPz/f/jwnJ8ftdcI33ffhfTp5/qTp4zao0UCrbl9l+riAt1WoKQUAAAAAvsZmszk8Nwyj1OnF4uPjNXPmTLfXBd938vxJZeVmebsMn7b+8HpTxxvQbICp48FcNKUAAAAAVBmNGjVSZmamw7SsrCz5+fmpfv36pS4TFxen2NhY+/OcnBxFRUW5tU74tmq2ampQo0GFxzl5/qSKjCITKgKsiaYUAAAAgCqje/fu+uCDDxymbdy4UV26dCnzelKBgYEKDAz0RHmoJBrUaKDN92yu8Dh93+vLkVeo1Ko5M/PFixfVp08fHTp0yF31AAAqAfICAFAWszPi7NmzSk9PV3p6uiTpyJEjSk9P17FjxyRdOspp6NCh9vlHjRqlo0ePKjY2VgcOHNDf//53LV26VE8++aQp9QAAys+pI6X8/f21d+/eMs+1BgBAIi8AAGUzOyNSU1PVp08f+/Pi0+yGDRum5cuXKyMjw96gkqTo6GitX79ekyZN0htvvKHIyEi99tprGjx4sCn1AADKz6kjpSRp6NChWrp0qTtqAQBUIuQFAKAsZmZETEyMDMMo8Vi+fLkkafny5UpOTnZYpnfv3tq1a5fy8/N15MgRjRo1ypRaAADOcfqaUhcuXND//M//aNOmTerSpYtq1arl8Pr8+fNNKw4A4LvICwBAWcgIAIDkQlNq79696tSpkySVOA+c0zQAAMXICwBAWcgIAIDkQlNqy5Yt7qgDAFDJkBcAgLKQEQAAyYVrShX7/vvv9cknn+j8+fOSJMMwTCsKAFB5kBcAgLKQEQBQtTndlPrPf/6jvn376g9/+IMGDBigjIwMSdKjjz6qv/71r6YXCADwTeQFAKAsZAQAQHKhKTVp0iT5+/vr2LFjqlmzpn36fffdpw0bNphanCSdOHFCf/nLX1S/fn3VrFlTHTp0UFpamunrAQCYy9N5AQDwHWQEAEBy4ZpSGzdu1CeffKKrr77aYfq1116ro0ePmlaYJJ0+fVo33HCD+vTpo48//lhhYWH64YcfVLduXVPXAwAwnyfzAgDgW8gIAIDkQlPq3LlzDn/NKHby5EkFBgaaUlSxuXPnKioqSsuWLbNPa9q0qanrAAC4hyfzAgDgW8gIAIDkQlOqV69eWrFihZ577jlJl27ZWlRUpJdeekl9+vQxtbh169bplltu0T333KOUlBRdddVVGj16tEaOHFnmMvn5+crPz7c/z8nJMbWmymzggm06dirXtPFy8i6aNhYA3+PJvAAA+BYyAgAgudCUeumllxQTE6PU1FRduHBBU6ZM0b59+3Tq1Clt377d1OIOHz6sRYsWKTY2VtOnT9eXX36p8ePHKzAwUEOHDi11mfj4eM2cOdPUOqzsX+knTBvr2KlcZZ+nkQTAHJ7MCwCAbyEjAACSC02pVq1a6euvv9aiRYtUvXp1nTt3TnfddZfGjBmjiIgIU4srKipSly5dNHv2bElSx44dtW/fPi1atKjMplRcXJxiY2Ptz3NychQVFWVqXZWdzSaFBPmbNl5IkNO/ZgAqAU/mBQDAt5ARAADJhaaUJDVq1MgjRyNFRESoVatWDtNatmyppKSkMpcJDAzkPPQKCgny16xBrb1dBoBKwFN5AQDwPWQEAMClptTp06e1dOlSHThwQDabTS1bttSIESMUGhpqanE33HCDDh486DDt0KFDatKkianrAQC4h6fyAgDge8gIAEA1ZxdISUlRdHS0XnvtNZ0+fVqnTp3Sa6+9pujoaKWkpJha3KRJk/T5559r9uzZ+v7777Vy5UotWbJEY8aMMXU9AADzeTIvAAC+hYwAAEguHCk1ZswY3XvvvfbzvyWpsLBQo0eP1pgxY7R3717TiuvatavWrFmjuLg4zZo1S9HR0UpISNBDDz1k2joAAO7hybwAAPgWMgIAILnQlPrhhx+UlJRkDw9Jql69umJjY7VixQpTi5Ok22+/Xbfffrvp4wIA3MvTeQEA8B1kBABAcuH0vU6dOunAgQMlph84cEAdOnQwoyYAQCVAXgAAykJGAACkch4p9fXXX9v/PX78eE2YMEHff/+9unXrJkn6/PPP9cYbb2jOnDnuqRIA4BPICwBAWcgIAMDvlasp1aFDB9lsNhmGYZ82ZcqUEvM9+OCDuu+++8yrDgDgU8gLAEBZyAgAwO+Vqyl15MgRd9cBAKgErJQX8fHxmj59uiZMmKCEhARvlwMAVZ6VMgIAYA3lako1adLE3XUAACoBq+TFV199pSVLlqhdu3beLgUA8H+skhEAAOtw+u57knTixAlt375dWVlZKioqcnht/PjxphQGAPB93siLs2fP6qGHHtJbb72l559/3i3rAABUHN8pAABON6WWLVumUaNGKSAgQPXr15fNZrO/ZrPZCBAAgCTv5cWYMWN022236aabbrpsUyo/P1/5+fn25zk5OW6pB17yZm/p16Pmjrnxb1LtMOnxFHPHBaogvlMAACQXmlIzZszQjBkzFBcXp2rVqrmjJgBAJeCNvHj33Xe1a9cuffXVV1ecNz4+XjNnzvRAVfCKs1nS+dMmD2r2eEDVxXcKAIDkQlMqNzdX999/P+FhAQMXbNOxU7mmjZeTd9G0sQDA03lx/PhxTZgwQRs3blRQUNAV54+Li1NsbKz9eU5OjqKiotxZIrzCJtWoW/Fhzv8qybjSXADKie8UAADJhabUI488ovfee0/Tpk1zRz1wwi9n8pV9nkYSAGvydF6kpaUpKytLnTt3tk8rLCzU1q1b9frrrys/P1/Vq1e3vxYYGKjAwECP1AYvqlFXGjCv4uOsf9INR14BVRffKQAAkgtNqfj4eN1+++3asGGD2rZtK39/f4fX58+fb1pxKB+bTQoJ8r/yjOUUEuTS9e8BwIGn86Jv37765ptvHKaNGDFC1113naZOnerQkAIAeBffKQAAkgtNqdmzZ+uTTz5RixYtJKnERQnheSFB/po1qLW3ywAAB57Oi+DgYLVp08ZhWq1atVS/fv0S0wEA3sV3CgCA5EJTav78+fr73/+u4cOHu6EcAEBlQV4AAMpCRgAAJBeaUoGBgbrhhhvcUQsAoBKxQl4kJyd7df0AgNJZISMAAN7n9O0uJkyYoAULFrijFgBAJUJeAADKQkYAACQXjpT68ssv9emnn+rDDz9U69atS1yU8P333zetOACA7yIvAABlISMAAJILTam6devqrrvuckctAIBKhLwAAJSFjAAASC40pZYtW+aOOgAAlQx5AQAoCxkBAJBcuKYUAAAAAAAAUFFOHykVHR0tm81W5uuHDx+uUEEAgMqBvAAAlIWMAABILjSlJk6c6PD84sWL2r17tzZs2KDJkyebVVep4uPjNX36dE2YMEEJCQluXRcAoGK8mRcAAGsjIwAAkgtNqQkTJpQ6/Y033lBqamqFCyrLV199pSVLlqhdu3ZuWwcAwDzeygsAgPWREQAAycRrSvXv319JSUlmDefg7Nmzeuihh/TWW2+pXr16blkHAMAz3JkXAADfRkYAQNXi9JFSZVm9erVCQ0PNGs7BmDFjdNttt+mmm27S888/f9l58/PzlZ+fb3+ek5PjlppcMXDBNv1yJv/KM5ZT1pk808YCAE9xZ14AAHwbGQEAVYvTTamOHTs6XJTQMAxlZmbql19+0cKFC00tTpLeffdd7dq1S1999VW55o+Pj9fMmTNNW/+/0k+YNtaxU7nKPn/RtPGqqvMXC03bL4M6XGXKOABK8nReAAB8BxkBAJBcaErdcccdDs+rVaumhg0bKiYmRtddd51ZdUmSjh8/rgkTJmjjxo0KCgoq1zJxcXGKjY21P8/JyVFUVJSpdVWUzSaFBPmbNl5IkGkHvAGAaTyZFwAA30JGAAAkF5pSzzzzjDvqKFVaWpqysrLUuXNn+7TCwkJt3bpVr7/+uvLz81W9enWHZQIDAxUYGOixGl0REuSvWYNae7sMAHArT+YFKoE3e0tns8wb72ymeWMBMB0ZAQCQTLymlDv07dtX33zzjcO0ESNG6LrrrtPUqVNLNKQAAICPOpslnfnZ21VcWcF56ZvV5ozV9m5zxgGghQsX6qWXXlJGRoZat26thIQE3XjjjaXOm5ycrD59+pSYfuDAAY7SAgAPK3dTqlq1ag7nfZfGZrOpoKCgwkUVCw4OVps2bRym1apVS/Xr1y8xHQBgDd7IC1QitmpS7UbmjFVwXgoMMWcsAKZwR0asWrVKEydO1MKFC3XDDTfozTffVP/+/bV//341bty4zOUOHjyokJD/fkY0bNiw3OsEAJij3E2pNWvWlPnajh07tGDBAhmGYUpRAADfRV6gQmo3kv56wJyxzDqiCYBp3JER8+fP1yOPPKJHH31UkpSQkKBPPvlEixYtUnx8fJnLhYWFqW7duk6tCwBgrnI3pQYNGlRi2rfffqu4uDh98MEHeuihh/Tcc8+ZWlxpkpOT3b4OAIDrrJIXAADrMTsjLly4oLS0NE2bNs1her9+/bRjx47LLtuxY0fl5eWpVatWevrpp0s9pQ8A4F7VXFno559/1siRI9WuXTsVFBQoPT1diYmJlz08FgBQ9ZAXAICymJERJ0+eVGFhocLDwx2mh4eHKzOz9BseREREaMmSJUpKStL777+vFi1aqG/fvtq6dWuZ68nPz1dOTo7DAwBQcU5d6Dw7O1uzZ8/WggUL1KFDB23evLnMCwgCAKou8gIAUBZ3ZMTvr1NlGEaZ165q0aKFWrRoYX/evXt3HT9+XPPmzVOvXr1KXSY+Pl4zZ86sUI0AgJLKfaTUiy++qGbNmunDDz/UO++8ox07dvAFAwBQAnkBACiL2RnRoEEDVa9evcRRUVlZWSWOnrqcbt266bvvvivz9bi4OGVnZ9sfx48fd7lmAMB/lftIqWnTpqlGjRq65pprlJiYqMTExFLne//9900rDgDge8gLAEBZzM6IgIAAde7cWZs2bdKdd95pn75p06ZSr19Vlt27dysiIqLM1wMDAxUYGFju8QAA5VPuptTQoUOvePtWAADICwBAWdyREbGxsRoyZIi6dOmi7t27a8mSJTp27JhGjRol6dJRTidOnNCKFSskXbo7X9OmTdW6dWtduHBBb7/9tpKSkpSUlGRqXQCAKyt3U2r58uVuLAMAUFmQFwCAsrgjI+677z795z//0axZs5SRkaE2bdpo/fr1atKkiSQpIyNDx44ds89/4cIFPfnkkzpx4oRq1Kih1q1b66OPPtKAAQNMrw0AcHlOXegcAAAAAKxm9OjRGj16dKmv/b4RNmXKFE2ZMsUDVQEArqTcFzoHAAAAAAAAzEJTCgAAAAAAAB5HUwoAAAAAAAAeR1MKAAAAAAAAHkdTCgBQKcTHx6tr164KDg5WWFiY7rjjDh08eNDbZQEAAAAoA00pAEClkJKSojFjxujzzz/Xpk2bVFBQoH79+uncuXPeLg0AAABAKfy8XQAAAGbYsGGDw/Nly5YpLCxMaWlp6tWrl5eqAgAAAFAWmlIAgEopOztbkhQaGlrq6/n5+crPz7c/z8nJ8Uhd8HHnf5XWP2nOWBv/JtUOkx5PMWc8AAAAH0NTCgBQ6RiGodjYWPXs2VNt2rQpdZ74+HjNnDnTw5XB9xnS+dMmjWXWOAAAAL6JphQAoNIZO3asvv76a23btq3MeeLi4hQbG2t/npOTo6ioKE+UB18UGGLueOd/lWSYOyYAAICPoSkFAKhUxo0bp3Xr1mnr1q26+uqry5wvMDBQgYGBHqwMPq3vDHPHW/+kiUdcAQAA+CaaUgCASsEwDI0bN05r1qxRcnKyoqOjvV0SAAAAgMuo5u0CLic+Pl5du3ZVcHCwwsLCdMcdd+jgwYPeLgsAYEFjxozR22+/rZUrVyo4OFiZmZnKzMzU+fPnvV0aAAAAgFJYuimVkpKiMWPG6PPPP9emTZtUUFCgfv366dy5c94uDQBgMYsWLVJ2drZiYmIUERFhf6xatcrbpQEAAAAohaVP39uwYYPD82XLliksLExpaWnq1auXl6oCAFiRYXDRaAAAAMCXWPpIqd/Lzs6WJIWGhnq5EgAAAAAAAFSEpY+U+i3DMBQbG6uePXuqTZs2Zc6Xn5+v/Px8+/OcnByX1zlwwTYdO5Xr8vK/l5N30bSxAAAAAAAAfJnPNKXGjh2rr7/+Wtu2bbvsfPHx8Zo5c6Yp6/zlTL6yz9NIAgAAAAAAMJtPNKXGjRundevWaevWrbr66qsvO29cXJxiY2Ptz3NychQVFVWh9dtsUkiQf4XG+K2QIJ/4sQMAAAAAALiNpbsjhmFo3LhxWrNmjZKTkxUdHX3FZQIDAxUYGGhqHSFB/po1qLWpYwIAAAAAAFRllm5KjRkzRitXrtS//vUvBQcHKzMzU5JUp04d1ahRw8vVAQAAAAAAwFWWvvveokWLlJ2drZiYGEVERNgfq1at8nZpAAAAAAAAqABLHyllGIa3SwAAAAAAAIAbWPpIKQAAAAAAAFRONKUAAAAAAADgcTSlAAAAAAAA4HE0pQAAAAAAAOBxlr7QOQAAQKV2NlN6uaV549UOkx5Pqfg4b/aWzmZVfJzfM6s+AABQKdCUAgAAzvtmtbnjFZw3dzxfYRRJZ342b7yC8+bsm1+PSudPV3yc3zOrPklqe7c54wAAAK+hKQUAAOBpgSHmjnf+V0mGuWNKkq2aVLtRxcc5m3mpAQcAAPAbNKUAAAA8re8Mc8db/6R7jmyq3Uj664GKj/NyS3OPCAMAAJUCTSn4nJy8i5rxr32mjBW//ls1DA7UB+N6VnisgQu26Zcz+SZU5cis+gAAAAAAsBKaUvA5hiFln79oylhmjSNJv5zJV2ZOnmnjucO/0k+YOt6gDleZOl5Vw/4AAAAAUJXRlILPCAky99c1J++iDDdcfqOaTQoLDqrwOFln8lTkhvoAAAAAALACmlLwGU/e0sLU8Wb8a5+pR0oVCwsO0ufT+1Z4nG6zN1v+yCsAAAAAAFxVzdsFAAAAAAAAoOqhKQUAAAAAAACPoykFAAAAAAAAj6MpBQAAAAAAAI+jKQUAAAAAAACPoykFAAAAAAAAj6MpBQAAAAAAAI+jKQUAAAAAAACP84mm1MKFCxUdHa2goCB17txZn332mbdLAgBYFJkBAFWPs5/9KSkp6ty5s4KCgtSsWTMtXrzYQ5UCAH7L8k2pVatWaeLEiXrqqae0e/du3Xjjjerfv7+OHTvm7dIAABZDZgBA1ePsZ/+RI0c0YMAA3Xjjjdq9e7emT5+u8ePHKykpycOVAwAs35SaP3++HnnkET366KNq2bKlEhISFBUVpUWLFnm7NACAxZAZAFD1OPvZv3jxYjVu3FgJCQlq2bKlHn30UT388MOaN2+ehysHAFi6KXXhwgWlpaWpX79+DtP79eunHTt2eKkqAIAVkRkAUPW48tm/c+fOEvPfcsstSk1N1cWLF91WKwCgJD9vF3A5J0+eVGFhocLDwx2mh4eHKzMzs9Rl8vPzlZ+fb3+enZ0tScrJyXF6/QV551SUn69Cm59yz55xenlYW2HeORXlFyjzZK66zFhX4fFOns1XkSEV5BW69Pv2e8W/f2bVJ0l5FwtNGafYc+9XN3W8qsbs/XEss5mG9Yh2erni31fDMEytx9OczQwz80KS9MWb0pdvubasLyrIM3e8vGxJhuRfKJnwGSpJOptrzji+IK9Iyjek/NPS+7EmjGfy/sgrNLc+SVo33Zxxqqo/jpSuf9zpxayWGa58X8jMzCx1/oKCAp08eVIRERElljE7M1YeWKl3vn3HpWVLk2fyZ/Lcz+aaOl5V8p+8/6jIKFKBCsz5TpBboMLzhfp33r/VO7G3CRVaH7/P1vLAdQ/owZYPOr1cefPC0k2pYjabzeG5YRglphWLj4/XzJkzS0yPioqqUA0PzqnQ4rC4oyaOdVxSnedMHFDm1ofKa/wcaXwFlj9z5ozq1KljWj3eUt7McFdeoKLOSE/7/u+hd5nU1JPknv1hZn1w3ZT/e7jGapnhzPeFsuYvbXoxMgPOOqADqjPcOu8RwFVbtVVP6AmXl79SXli6KdWgQQNVr169xF85srKySvx1o1hcXJxiY//7F7iioiKdOnVK9evXv2wwlSYnJ0dRUVE6fvy4QkJCnN8Ai2A7rIXtsBa249J/xM+cOaPIyEg3VecZzmYGeVFSZdkOqfJsC9thLWyH9TLDle8LjRo1KnV+Pz8/1a9fv9RlyIyS2A5rYTushe0of15YuikVEBCgzp07a9OmTbrzzjvt0zdt2qRBgwaVukxgYKACAwMdptWtW7dCdYSEhPj0L1IxtsNa2A5rqerbYaW/drvK2cwgL8pWWbZDqjzbwnZYS1XfDitlhivfF7p3764PPvjAYdrGjRvVpUsX+fv7l7oMmVE2tsNa2A5rqerbUZ68sHRTSpJiY2M1ZMgQdenSRd27d9eSJUt07NgxjRo1ytulAQAshswAgKrnSp/9cXFxOnHihFasWCFJGjVqlF5//XXFxsZq5MiR2rlzp5YuXap33jHvGk8AgPKxfFPqvvvu03/+8x/NmjVLGRkZatOmjdavX68mTZp4uzQAgMWQGQBQ9Vzpsz8jI0PHjh2zzx8dHa3169dr0qRJeuONNxQZGanXXntNgwcP9tYmAECVZfmmlCSNHj1ao0eP9vh6AwMD9cwzz5Q4VNfXsB3WwnZYC9tR+XgjMyrLz7+ybIdUebaF7bAWtsO6LvfZv3z58hLTevfurV27drm5qtJVlp8/22EtbIe1sB3lZzOscj9XAAAAAAAAVBnVvF0AAAAAAAAAqh6aUgAAAAAAAPA4mlIAAAAAAADwuCrflFq4cKGio6MVFBSkzp0767PPPrvs/CkpKercubOCgoLUrFkzLV682EOVXp4z25GcnCybzVbi8e2333qw4pK2bt2qgQMHKjIyUjabTWvXrr3iMlbcH85uhxX3R3x8vLp27arg4GCFhYXpjjvu0MGDB6+4nNX2hyvbYcX9sWjRIrVr104hISEKCQlR9+7d9fHHH192Gavti8qAvLDG+0EiL6y0P8gLa+0PicywCjLDGu8J8sI6+0IiM6y2T6ySF1W6KbVq1SpNnDhRTz31lHbv3q0bb7xR/fv3d7hl7G8dOXJEAwYM0I033qjdu3dr+vTpGj9+vJKSkjxcuSNnt6PYwYMHlZGRYX9ce+21Hqq4dOfOnVP79u31+uuvl2t+q+4PZ7ejmJX2R0pKisaMGaPPP/9cmzZtUkFBgfr166dz586VuYwV94cr21HMSvvj6quv1pw5c5SamqrU1FT96U9/0qBBg7Rv375S57fivvB15IV13g8SeWGl/UFeWGt/SGSGFZAZ1nlPkBfW2RcSmSFZa59YJi+MKuyPf/yjMWrUKIdp1113nTFt2rRS558yZYpx3XXXOUx7/PHHjW7durmtxvJwdju2bNliSDJOnz7tgepcI8lYs2bNZeex6v74rfJshy/sj6ysLEOSkZKSUuY8vrA/yrMdvrA/DMMw6tWrZ/zP//xPqa/5wr7wNeTFaQ9U5xrywlrIC2siMzyLzDjtgeqcR15YD5lhPd7Iiyp7pNSFCxeUlpamfv36OUzv16+fduzYUeoyO3fuLDH/LbfcotTUVF28eNFttV6OK9tRrGPHjoqIiFDfvn21ZcsWd5bpFlbcHxVh5f2RnZ0tSQoNDS1zHl/YH+XZjmJW3R+FhYV69913de7cOXXv3r3UeXxhX/gS8sK674fysuL+qAgr7w/ywlr7g8zwPDLD2u+JK7HivqgIq+8LMsM6+8SbeVFlm1InT55UYWGhwsPDHaaHh4crMzOz1GUyMzNLnb+goEAnT550W62X48p2REREaMmSJUpKStL777+vFi1aqG/fvtq6dasnSjaNFfeHK6y+PwzDUGxsrHr27Kk2bdqUOZ/V90d5t8Oq++Obb75R7dq1FRgYqFGjRmnNmjVq1apVqfNafV/4GvLCeu8HZ1lxf7jC6vuDvLDO/iAzvIfMsOZ7orysuC9c4Qv7gsywxj6xQl74ubxkJWGz2RyeG4ZRYtqV5i9tuqc5sx0tWrRQixYt7M+7d++u48ePa968eerVq5db6zSbVfeHM6y+P8aOHauvv/5a27Ztu+K8Vt4f5d0Oq+6PFi1aKD09Xb/++quSkpI0bNgwpaSklBkaVt4Xvoq8sM77wRVW3R/OsPr+IC+ssz/IDO8jM6z1nnCGVfeFM3xhX5AZ1tgnVsiLKnukVIMGDVS9evUSnf6srKwS3b9ijRo1KnV+Pz8/1a9f3221Xo4r21Gabt266bvvvjO7PLey4v4wi1X2x7hx47Ru3Tpt2bJFV1999WXntfL+cGY7SmOF/REQEKBrrrlGXbp0UXx8vNq3b69XX3211HmtvC98EXnhyArvB2dZcX+YxSr7g7y4xCr7g8zwHjLDkVXeE+VlxX1hFivtCzLjEivsEyvkRZVtSgUEBKhz587atGmTw/RNmzapR48epS7TvXv3EvNv3LhRXbp0kb+/v9tqvRxXtqM0u3fvVkREhNnluZUV94dZvL0/DMPQ2LFj9f777+vTTz9VdHT0FZex4v5wZTtK4+39URrDMJSfn1/qa1bcF76MvHBkxffDlVhxf5jF2/uDvHDk7f1RFjLDc8gMR1Z9T5TFivvCLFbYF2SGIyvsk9/zSl5U6DLpPu7dd981/P39jaVLlxr79+83Jk6caNSqVcv48ccfDcMwjGnTphlDhgyxz3/48GGjZs2axqRJk4z9+/cbS5cuNfz9/Y3Vq1d7axMMw3B+O1555RVjzZo1xqFDh4y9e/ca06ZNMyQZSUlJ3toEwzAM48yZM8bu3buN3bt3G5KM+fPnG7t37zaOHj1qGIbv7A9nt8OK++OJJ54w6tSpYyQnJxsZGRn2R25urn0eX9gfrmyHFfdHXFycsXXrVuPIkSPG119/bUyfPt2oVq2asXHjRsMwfGNf+DrywjrvB8MgL6y0P8gLa+0PwyAzrIDMsM57grywzr4wDDLDavvEKnlRpZtShmEYb7zxhtGkSRMjICDA6NSpk8NtHIcNG2b07t3bYf7k5GSjY8eORkBAgNG0aVNj0aJFHq64dM5sx9y5c43mzZsbQUFBRr169YyePXsaH330kReqdlR8m8zfP4YNG2YYhu/sD2e3w4r7o7T6JRnLli2zz+ML+8OV7bDi/nj44Yft7++GDRsaffv2tYeFYfjGvqgMyAtrvB8Mg7yw0v4gL6y1PwyDzLAKMsMa7wnywjr7wjDIDKvtE6vkhc0w/u/KVAAAAAAAAICHVNlrSgEAAAAAAMB7aEoBAAAAAADA42hKAQAAAAAAwONoSgEAAAAAAMDjaEoBAAAAAADA42hKAQAAAAAAwONoSgEAAAAAAMDjaEoBAAAAAADA42hKAW4SExOjiRMnmjavzWbT2rVr7c+//fZbdevWTUFBQerQoYPLdQIAvIu8AACUF5mByoamFOAjMjIy1L9/f/vzZ555RrVq1dLBgwe1efNmLV++XHXr1vVegQAASyAvAADlRWbA2/y8XQBgdRcuXFBAQIC3y1CjRo0cnv/www+67bbb1KRJEy9VBAD4LfICAFBeZAZwCUdKAb8TExOjsWPHKjY2Vg0aNNDNN9+s/fv3a8CAAapdu7bCw8M1ZMgQnTx50r7MuXPnNHToUNWuXVsRERF6+eWXS4y7cOFCXXvttQoKClJ4eLjuvvtuh9eLioo0ZcoUhYaGqlGjRnr22WcdXv/tobU2m01paWmaNWuWbDabYmJiNGLECGVnZ8tms8lms5VYHgBgLvICAFBeZAZQOppSQCkSExPl5+en7du3a86cOerdu7c6dOig1NRUbdiwQf/+979177332uefPHmytmzZojVr1mjjxo1KTk5WWlqa/fXU1FSNHz9es2bN0sGDB7Vhwwb16tWrxDpr1aqlL774Qi+++KJmzZqlTZs2lVpfRkaGWrdurb/+9a/KyMjQunXrlJCQoJCQEGVkZCgjI0NPPvmke344AAA78gIAUF5kBlASp+8Bpbjmmmv04osvSpJmzJihTp06afbs2fbX//73vysqKkqHDh1SZGSkli5dqhUrVujmm2+WdOnD/+qrr7bPf+zYMdWqVUu33367goOD1aRJE3Xs2NFhne3atdMzzzwjSbr22mv1+uuva/PmzfYxf6tRo0by8/NT7dq17Yfc1qlTRzabrcQhuAAA9yEvAADlRWYAJdGUAkrRpUsX+7/T0tK0ZcsW1a5du8R8P/zwg86fP68LFy6oe/fu9umhoaFq0aKF/fnNN9+sJk2aqFmzZrr11lt166236s4771TNmjXt87Rr185h7IiICGVlZZm5WQAAk5EXAIDyIjOAkjh9DyhFrVq17P8uKirSwIEDlZ6e7vD47rvv1KtXLxmGccXxgoODtWvXLr3zzjuKiIjQjBkz1L59e/3666/2efz9/R2WsdlsKioqMm2bAADmIy8AAOVFZgAl0ZQCrqBTp07at2+fmjZtqmuuucbhUatWLV1zzTXy9/fX559/bl/m9OnTOnTokMM4fn5+uummm/Tiiy/q66+/1o8//qhPP/3UtDoDAgJUWFho2ngAAOeQFwCA8iIzgEtoSgFXMGbMGJ06dUoPPPCAvvzySx0+fFgbN27Uww8/rMLCQtWuXVuPPPKIJk+erM2bN2vv3r0aPny4qlX779vrww8/1Guvvab09HQdPXpUK1asUFFRkcPhtxXVtGlTnT17Vps3b9bJkyeVm5tr2tgAgCsjLwAA5UVmAJfQlAKuIDIyUtu3b1dhYaFuueUWtWnTRhMmTFCdOnXsofDSSy+pV69e+vOf/6ybbrpJPXv2VOfOne1j1K1bV++//77+9Kc/qWXLllq8eLHeeecdtW7d2rQ6e/TooVGjRum+++5Tw4YN7RdRBAB4BnkBACgvMgO4xGaU52RVAAAAAAAAwEQcKQUAAAAAAACPoykFAAAAAAAAj6MpBQAAAAAAAI+jKQUAAAAAAACPoykFAAAAAAAAj6MpBQAAAAAAAI+jKQUAAAAAAACPoykFAAAAAAAAj6MpBQAAAAAAAI+jKQUAAAAAAACPoykFAAAAAAAAj6MpBQAAAAAAAI/7/6oAHuQodVwIAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# if we select sample with higher snr and i-band magnitude limit:\n", + "# compute snr:\n", + "snr=1/(10**(magi_err/2.5)-1)\n", + "ind3=snr>8\n", + "\n", + "# magnitude limit:\n", + "ind4=magi<24.5\n", + "\n", + "fig,axarr=plt.subplots(1,3,figsize=[12,3])\n", + "for ii in range(3):\n", + " ind1=tomo==(ii+1)\n", + " ind2=ra<62\n", + " plt.sca(axarr[ii])\n", + " cc=plt.hist(redshift[ind1*ind2*ind3*ind4], bins=15, range=[0,3],label=f'tomo {ii+1}, ra<62', \n", + " histtype='step',color=f'C{ii}', lw=2)\n", + " cc=plt.hist(redshift[ind1*(~ind2)*ind3*ind4], bins=15, range=[0,3],label=f'tomo {ii+1}, ra>=62', \n", + " color=f'C{ii}', alpha=0.35)\n", + " plt.legend()\n", + " plt.xlabel(\"redshift\")\n", + " plt.ylabel(\"Number of objects\")\n", + "plt.tight_layout()" + ] + }, + { + "cell_type": "markdown", + "id": "e1b76cbe-c52f-4a0f-b82d-20340db0642d", + "metadata": {}, + "source": [ + "We see that given a SNR cut of 8 and i-band magnitude cut at 24.5, we find more, higher redshift objects in the deeper pixels, as expected." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d2f4b2d4-412e-4394-a408-1b3de7de1894", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "rail_dev", + "language": "python", + "name": "rail_dev" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/src/rail/pipelines/examples/goldenspike/tmp_goldenspike.yml b/src/rail/pipelines/examples/goldenspike/tmp_goldenspike.yml deleted file mode 100644 index fa88a54..0000000 --- a/src/rail/pipelines/examples/goldenspike/tmp_goldenspike.yml +++ /dev/null @@ -1,98 +0,0 @@ -config: tmp_goldenspike_config.yml -inputs: - model: /global/u2/q/qhang/desc/rail_base/src/rail/examples_data/goldenspike_data/data/pretrained_flow.pkl -log_dir: . -modules: rail -output_dir: . -resume: false -site: - max_threads: 2 -stages: -- classname: FlowCreator - module_name: rail.creation.engines.flowEngine - name: flow_engine_train - nprocess: 1 -- classname: LSSTErrorModel - module_name: rail.creation.degradation.lsst_error_model - name: lsst_error_model_train - nprocess: 1 -- classname: InvRedshiftIncompleteness - module_name: rail.creation.degradation.spectroscopic_degraders - name: inv_redshift - nprocess: 1 -- classname: LineConfusion - module_name: rail.creation.degradation.spectroscopic_degraders - name: line_confusion - nprocess: 1 -- classname: QuantityCut - module_name: rail.creation.degradation.quantityCut - name: quantity_cut - nprocess: 1 -- classname: ColumnMapper - module_name: rail.core.utilStages - name: col_remapper_train - nprocess: 1 -- classname: TableConverter - module_name: rail.core.utilStages - name: table_conv_train - nprocess: 1 -- classname: FlowCreator - module_name: rail.creation.engines.flowEngine - name: flow_engine_test - nprocess: 1 -- classname: LSSTErrorModel - module_name: rail.creation.degradation.lsst_error_model - name: lsst_error_model_test - nprocess: 1 -- classname: ColumnMapper - module_name: rail.core.utilStages - name: col_remapper_test - nprocess: 1 -- classname: TableConverter - module_name: rail.core.utilStages - name: table_conv_test - nprocess: 1 -- classname: KNearNeighInformer - module_name: rail.estimation.algos.k_nearneigh - name: inform_knn - nprocess: 1 -- classname: FlexZBoostInformer - module_name: rail.estimation.algos.flexzboost - name: inform_fzboost - nprocess: 1 -- classname: BPZliteInformer - module_name: rail.estimation.algos.bpz_lite - name: inform_bpz - nprocess: 1 -- classname: BPZliteEstimator - module_name: rail.estimation.algos.bpz_lite - name: estimate_bpz - nprocess: 1 -- classname: KNearNeighEstimator - module_name: rail.estimation.algos.k_nearneigh - name: estimate_knn - nprocess: 1 -- classname: FlexZBoostEstimator - module_name: rail.estimation.algos.flexzboost - name: estimate_fzboost - nprocess: 1 -- classname: Evaluator - module_name: rail.evaluation.evaluator - name: bpz_eval - nprocess: 1 -- classname: Evaluator - module_name: rail.evaluation.evaluator - name: fzboost_eval - nprocess: 1 -- classname: Evaluator - module_name: rail.evaluation.evaluator - name: knn_eval - nprocess: 1 -- classname: PointEstHistSummarizer - module_name: rail.estimation.algos.point_est_hist - name: point_estimate_test - nprocess: 1 -- classname: NaiveStackSummarizer - module_name: rail.estimation.algos.naive_stack - name: naive_stack_test - nprocess: 1 diff --git a/src/rail/pipelines/examples/goldenspike/tmp_goldenspike_config.yml b/src/rail/pipelines/examples/goldenspike/tmp_goldenspike_config.yml deleted file mode 100644 index 96e391f..0000000 --- a/src/rail/pipelines/examples/goldenspike/tmp_goldenspike_config.yml +++ /dev/null @@ -1,502 +0,0 @@ -bpz_eval: - aliases: - input: output_estimate_bpz - output: output_bpz_eval - truth: output_flow_engine_train - config: null - do_cde: true - input: None - name: bpz_eval - nzbins: 301 - output: pdf/pz/output_bpz_eval.pq - output_mode: default - pit_metrics: all - point_metrics: all - truth: None - zmax: 3.0 - zmin: 0.0 -col_remapper_test: - aliases: - input: output_lsst_error_model_test - output: output_col_remapper_test - chunk_size: 100000 - columns: &id001 - mag_g_lsst_err: mag_err_g_lsst - mag_i_lsst_err: mag_err_i_lsst - mag_r_lsst_err: mag_err_r_lsst - mag_u_lsst_err: mag_err_u_lsst - mag_y_lsst_err: mag_err_y_lsst - mag_z_lsst_err: mag_err_z_lsst - config: null - inplace: false - input: None - name: col_remapper_test - output: catalog/degraded/output_col_remapper_test.pq - output_mode: default -col_remapper_train: - aliases: - input: output_quantity_cut - output: output_col_remapper_train - chunk_size: 100000 - columns: *id001 - config: null - inplace: false - input: None - name: col_remapper_train - output: catalog/degraded/output_col_remapper_train.pq - output_mode: default -estimate_bpz: - aliases: - input: output_table_conv_test - model: model_inform_bpz - output: output_estimate_bpz - bands: &id002 - - mag_u_lsst - - mag_g_lsst - - mag_r_lsst - - mag_i_lsst - - mag_z_lsst - - mag_y_lsst - calculated_point_estimates: &id003 [] - chunk_size: 10000 - columns_file: /global/u2/q/qhang/desc/rail_bpz/src/rail/examples_data/estimation_data/configs/test_bpz.columns - config: null - data_path: None - dz: 0.01 - err_bands: &id004 - - mag_err_u_lsst - - mag_err_g_lsst - - mag_err_r_lsst - - mag_err_i_lsst - - mag_err_z_lsst - - mag_err_y_lsst - gauss_kernel: 0.0 - hdf5_groupname: '' - input: None - madau_flag: 'no' - mag_err_min: 0.005 - mag_limits: &id005 - mag_g_lsst: 29.04 - mag_i_lsst: 28.62 - mag_r_lsst: 29.06 - mag_u_lsst: 27.79 - mag_y_lsst: 27.05 - mag_z_lsst: 27.98 - model: None - name: estimate_bpz - no_prior: true - nondetect_val: 99.0 - nzbins: 301 - output: pdf/pz/output_estimate_bpz.hdf5 - output_mode: default - p_min: 0.005 - redshift_col: redshift - ref_band: mag_i_lsst - spectra_file: CWWSB4.list - unobserved_val: -99.0 - zmax: 3.0 - zmin: 0.0 - zp_errors: - - 0.01 - - 0.01 - - 0.01 - - 0.01 - - 0.01 - - 0.01 -estimate_fzboost: - aliases: - input: output_table_conv_test - model: model_inform_fzboost - output: output_estimate_fzboost - bands: *id002 - calculated_point_estimates: *id003 - chunk_size: 10000 - config: null - err_bands: *id004 - hdf5_groupname: '' - input: None - mag_limits: *id005 - model: None - name: estimate_fzboost - nondetect_val: .nan - nzbins: 301 - output: pdf/pz/output_estimate_FZBoost.hdf5 - output_mode: default - qp_representation: interp - ref_band: mag_i_lsst -estimate_knn: - aliases: - input: output_table_conv_test - model: model_inform_knn - output: output_estimate_knn - bands: *id002 - calculated_point_estimates: *id003 - chunk_size: 10000 - config: null - hdf5_groupname: '' - input: None - mag_limits: *id005 - model: None - name: estimate_knn - nondetect_val: .nan - nzbins: 301 - output: pdf/pz/output_estimate_knn.hdf5 - output_mode: default - redshift_col: redshift - ref_band: mag_i_lsst - zmax: 3.0 - zmin: 0.0 -flow_engine_test: - aliases: - output: output_flow_engine_test - config: null - model: /global/u2/q/qhang/desc/rail_base/src/rail/examples_data/goldenspike_data/data/pretrained_flow.pkl - n_samples: 50 - name: flow_engine_test - output: catalog/degraded/output_flow_engine_test.pq - output_mode: default - seed: 12345 -flow_engine_train: - aliases: - output: output_flow_engine_train - config: null - model: /global/u2/q/qhang/desc/rail_base/src/rail/examples_data/goldenspike_data/data/pretrained_flow.pkl - n_samples: 50 - name: flow_engine_train - output: catalog/created/output_flow_engine_train.pq - output_mode: default - seed: 1235 -fzboost_eval: - aliases: - input: output_estimate_fzboost - output: output_fzboost_eval - truth: output_flow_engine_train - config: null - do_cde: true - input: None - name: fzboost_eval - nzbins: 301 - output: pdf/pz/output_fzboost_eval.pq - output_mode: default - pit_metrics: all - point_metrics: all - truth: None - zmax: 3.0 - zmin: 0.0 -inform_bpz: - aliases: - input: output_table_conv_train - model: model_inform_bpz - bands: *id002 - columns_file: /global/u2/q/qhang/desc/rail_bpz/src/rail/examples_data/estimation_data/configs/test_bpz.columns - config: null - data_path: None - err_bands: *id004 - hdf5_groupname: '' - init_alpha: 1.8 - init_km: 0.1 - init_kt: 0.3 - init_zo: 0.4 - input: None - m0: 20.0 - mag_limits: *id005 - mmax: 26.0 - mmin: 18.0 - model: model/estimator/trained_BPZ.pkl - name: inform_bpz - nondetect_val: 99.0 - nt_array: - - 8 - nzbins: 301 - output_mode: default - redshift_col: redshift - ref_band: mag_i_lsst - save_train: true - spectra_file: CWWSB4.list - type_file: '' - zmax: 3.0 - zmin: 0.0 -inform_fzboost: - aliases: - input: output_table_conv_train - model: model_inform_fzboost - bands: *id002 - basis_system: cosine - bumpmax: 0.35 - bumpmin: 0.02 - config: null - err_bands: *id004 - hdf5_groupname: '' - input: None - mag_limits: *id005 - max_basis: 35 - model: model/estimator/fzboost.pkl - name: inform_fzboost - nbump: 20 - nondetect_val: 99.0 - nsharp: 15 - nzbins: 301 - output_mode: default - redshift_col: redshift - ref_band: mag_i_lsst - regression_params: - max_depth: 8 - objective: reg:squarederror - retrain_full: true - save_train: true - seed: 1138 - sharpmax: 2.1 - sharpmin: 0.7 - trainfrac: 0.75 - zmax: 3.0 - zmin: 0.0 -inform_knn: - aliases: - input: output_table_conv_train - model: model_inform_knn - bands: *id002 - config: null - hdf5_groupname: '' - input: None - leaf_size: 15 - mag_limits: *id005 - model: model/estimator/knnpz.pkl - name: inform_knn - ngrid_sigma: 10 - nneigh_max: 7 - nneigh_min: 3 - nondetect_val: .nan - nzbins: 301 - output_mode: default - redshift_col: redshift - ref_band: mag_i_lsst - save_train: true - seed: 0 - sigma_grid_max: 0.075 - sigma_grid_min: 0.01 - trainfrac: 0.75 - zmax: 3.0 - zmin: 0.0 -inv_redshift: - aliases: - input: output_lsst_error_model_train - output: output_inv_redshift - config: null - input: None - name: inv_redshift - output: catalog/degraded/output_inv_redshift.pq - output_mode: default - pivot_redshift: 1.0 - seed: 12345 -knn_eval: - aliases: - input: output_estimate_knn - output: output_knn_eval - truth: output_flow_engine_train - config: null - do_cde: true - input: None - name: knn_eval - nzbins: 301 - output: pdf/pz/output_knn_eval.pq - output_mode: default - pit_metrics: all - point_metrics: all - truth: None - zmax: 3.0 - zmin: 0.0 -line_confusion: - aliases: - input: output_inv_redshift - output: output_line_confusion - config: null - frac_wrong: 0.05 - input: None - name: line_confusion - output: catalog/degraded/output_line_confusion.pq - output_mode: default - seed: 12345 - true_wavelen: 5007.0 - wrong_wavelen: 3727.0 -lsst_error_model_test: - Cm: &id006 - g: 24.42 - i: 24.32 - r: 24.44 - u: 23.09 - y: 23.73 - z: 24.16 - aMax: 2.0 - aMin: 0.7 - absFlux: false - airmass: 1.2 - aliases: - input: output_flow_engine_test - output: output_lsst_error_model_test - bandNames: &id012 - g: mag_g_lsst - i: mag_i_lsst - r: mag_r_lsst - u: mag_u_lsst - y: mag_y_lsst - z: mag_z_lsst - config: null - decorrelate: true - errLoc: after - extendedType: point - gamma: &id007 - g: 0.039 - i: 0.039 - r: 0.039 - u: 0.038 - y: 0.039 - z: 0.039 - highSNR: false - input: None - km: &id008 - g: 0.213 - i: 0.096 - r: 0.126 - u: 0.491 - y: 0.17 - z: 0.069 - m5: &id009 {} - majorCol: major - minorCol: minor - msky: &id010 - g: 22.26 - i: 20.48 - r: 21.2 - u: 22.99 - y: 18.61 - z: 19.6 - nVisYr: &id011 - g: 8.0 - i: 18.4 - r: 18.4 - u: 5.6 - y: 16.0 - z: 16.0 - nYrObs: 10.0 - name: lsst_error_model_test - ndFlag: .inf - ndMode: flag - output: catalog/degraded/output_lsst_error_model_test.pq - output_mode: default - renameDict: null - scale: &id013 {} - seed: 12345 - sigLim: 0 - sigmaSys: 0.005 - theta: &id014 - g: 0.77 - i: 0.71 - r: 0.73 - u: 0.81 - y: 0.68 - z: 0.69 - tvis: 30.0 - validate: true -lsst_error_model_train: - Cm: *id006 - aMax: 2.0 - aMin: 0.7 - absFlux: false - airmass: 1.2 - aliases: - input: output_flow_engine_train - output: output_lsst_error_model_train - config: null - decorrelate: true - errLoc: after - extendedType: point - gamma: *id007 - highSNR: false - input: None - km: *id008 - m5: *id009 - majorCol: major - minorCol: minor - msky: *id010 - nVisYr: *id011 - nYrObs: 10.0 - name: lsst_error_model_train - ndFlag: .inf - ndMode: flag - output: catalog/degraded/output_lsst_error_model_train.pq - output_mode: default - renameDict: *id012 - scale: *id013 - seed: 29 - sigLim: 0 - sigmaSys: 0.005 - theta: *id014 - tvis: 30.0 - validate: true -naive_stack_test: - aliases: - input: output_estimate_bpz - output: output_naive_stack_test - single_NZ: single_NZ_naive_stack_test - chunk_size: 10000 - config: null - input: None - name: naive_stack_test - nsamples: 1000 - nzbins: 301 - output: pdf/nz/output_naive_stack_test.hdf5 - output_mode: default - seed: 87 - single_NZ: pdf/nz/single_NZ_naive_stack_test.hdf5 - zmax: 3.0 - zmin: 0.0 -point_estimate_test: - aliases: - input: output_estimate_bpz - output: output_point_estimate_test - single_NZ: single_NZ_point_estimate_test - chunk_size: 10000 - config: null - input: None - name: point_estimate_test - nsamples: 1000 - nzbins: 301 - output: pdf/nz/output_point_estimate_test.hdf5 - output_mode: default - point_estimate: zmode - seed: 87 - single_NZ: pdf/nz/single_NZ_point_estimate_test.hdf5 - zmax: 3.0 - zmin: 0.0 -quantity_cut: - aliases: - input: output_line_confusion - output: output_quantity_cut - config: null - cuts: - mag_i_lsst: 25.0 - input: None - name: quantity_cut - output: catalog/degraded/output_quantity_cut.pq - output_mode: default - seed: 12345 -table_conv_test: - aliases: - input: output_col_remapper_test - output: output_table_conv_test - config: null - input: None - name: table_conv_test - output: catalog/degraded/output_table_conv_test.hdf5 - output_format: numpyDict - output_mode: default -table_conv_train: - aliases: - input: output_col_remapper_train - output: output_table_conv_train - config: null - input: None - name: table_conv_train - output: catalog/degraded/output_table_conv_train.hdf5 - output_format: numpyDict - output_mode: default diff --git a/src/rail/pipelines/examples/survey_nonuniformity/survey_nonuniformity.py b/src/rail/pipelines/examples/survey_nonuniformity/survey_nonuniformity.py index 9e9697a..74aecac 100644 --- a/src/rail/pipelines/examples/survey_nonuniformity/survey_nonuniformity.py +++ b/src/rail/pipelines/examples/survey_nonuniformity/survey_nonuniformity.py @@ -44,22 +44,28 @@ def __init__(self): output=os.path.join(namer.get_data_dir(DataType.catalog, CatalogType.degraded), "output_obscondition.pq"), ) - self.col_remapper_train = ColumnMapper.build( + self.col_remapper = ColumnMapper.build( connections=dict(input=self.obs_condition.io.output), columns=rename_dict, - output=os.path.join(namer.get_data_dir(DataType.catalog, CatalogType.degraded), "output_col_remapper_train.pq"), + output=os.path.join(namer.get_data_dir(DataType.catalog, CatalogType.degraded), "output_col_remapper.pq"), ) ### Estimation steps: - self.deredden = Dereddener.build( - connections=dict(input=self.col_remapper_train.io.output), + connections=dict(input=self.col_remapper.io.output), dustmap_dir=".", output=os.path.join(namer.get_data_dir(DataType.catalog, CatalogType.degraded), "output_deredden.pq"), ) - self.inform_bpz = BPZliteInformer.build( + ### convert table into hdf5 format for estimation + self.table_conv = TableConverter.build( connections=dict(input=self.deredden.io.output), + output_format='numpyDict', + output=os.path.join(namer.get_data_dir(DataType.catalog, CatalogType.degraded), "output_table_conv.hdf5"), + ) + + self.inform_bpz = BPZliteInformer.build( + connections=dict(input=self.table_conv.io.output), model=os.path.join(namer.get_data_dir(DataType.model, ModelType.estimator), 'trained_BPZ.pkl'), hdf5_groupname='', nt_array=[8], @@ -68,23 +74,13 @@ def __init__(self): ) self.estimate_bpz = BPZliteEstimator.build( - connections=dict(input=self.deredden.io.output, + connections=dict(input=self.table_conv.io.output, model=self.inform_bpz.io.model,), hdf5_groupname='', output=os.path.join(namer.get_data_dir(DataType.pdf, PdfType.pz), "output_estimate_bpz.hdf5"), ) - """ - # some sort of point estimates for pz - self.point_estimate_test = PointEstimateHist.build( - connections=dict(input=self.estimate_bpz.io.output), - output=os.path.join(namer.get_data_dir(DataType.pdf, PdfType.nz), "output_point_estimate_test.hdf5"), - single_NZ=os.path.join(namer.get_data_dir(DataType.pdf, PdfType.nz), "single_NZ_point_estimate_test.hdf5"), - ) - """ - ### Tomographic binning - self.tomopraphy = UniformBinningClassifier.build( connections=dict(input=self.estimate_bpz.io.output), output=os.path.join(namer.get_data_dir(DataType.pdf, PdfType.pz), "output_tomography.hdf5"), diff --git a/src/rail/pipelines/examples/survey_nonuniformity/tmp_survey_nonuniformity.yml b/src/rail/pipelines/examples/survey_nonuniformity/tmp_survey_nonuniformity.yml deleted file mode 100644 index dfc21f0..0000000 --- a/src/rail/pipelines/examples/survey_nonuniformity/tmp_survey_nonuniformity.yml +++ /dev/null @@ -1,38 +0,0 @@ -config: tmp_survey_nonuniformity_config.yml -inputs: - model: /global/u2/q/qhang/desc/rail_base/src/rail/examples_data/goldenspike_data/data/pretrained_flow.pkl -log_dir: . -modules: rail -output_dir: . -resume: false -site: - max_threads: 2 -stages: -- classname: FlowCreator - module_name: rail.creation.engines.flowEngine - name: flow_engine_train - nprocess: 1 -- classname: ObsCondition - module_name: rail.creation.degradation.observing_condition_degrader - name: obs_condition - nprocess: 1 -- classname: ColumnMapper - module_name: rail.core.utilStages - name: col_remapper_train - nprocess: 1 -- classname: Dereddener - module_name: rail.tools.utilPhotometry - name: deredden - nprocess: 1 -- classname: BPZliteInformer - module_name: rail.estimation.algos.bpz_lite - name: inform_bpz - nprocess: 1 -- classname: BPZliteEstimator - module_name: rail.estimation.algos.bpz_lite - name: estimate_bpz - nprocess: 1 -- classname: UniformBinningClassifier - module_name: rail.estimation.algos.uniform_binning - name: tomopraphy - nprocess: 1 diff --git a/src/rail/pipelines/examples/survey_nonuniformity/tmp_survey_nonuniformity_config.yml b/src/rail/pipelines/examples/survey_nonuniformity/tmp_survey_nonuniformity_config.yml deleted file mode 100644 index 7d65d47..0000000 --- a/src/rail/pipelines/examples/survey_nonuniformity/tmp_survey_nonuniformity_config.yml +++ /dev/null @@ -1,176 +0,0 @@ -col_remapper_train: - aliases: - input: output_obs_condition - output: output_col_remapper_train - chunk_size: 100000 - columns: - mag_g_lsst_err: mag_err_g_lsst - mag_i_lsst_err: mag_err_i_lsst - mag_r_lsst_err: mag_err_r_lsst - mag_u_lsst_err: mag_err_u_lsst - mag_y_lsst_err: mag_err_y_lsst - mag_z_lsst_err: mag_err_z_lsst - config: null - inplace: false - input: None - name: col_remapper_train - output: catalog/degraded/output_col_remapper_train.pq - output_mode: default -deredden: - aliases: - input: output_col_remapper_train - output: output_deredden - band_a_env: - - 4.81 - - 3.64 - - 2.7 - - 2.06 - - 1.58 - - 1.31 - bands: ugrizy - config: null - copy_cols: [] - dustmap_dir: . - dustmap_name: sfd - input: None - mag_name: mag_{band}_lsst - name: deredden - output: catalog/degraded/output_deredden.pq - output_mode: default -estimate_bpz: - aliases: - input: output_deredden - model: model_inform_bpz - output: output_estimate_bpz - bands: &id001 - - mag_u_lsst - - mag_g_lsst - - mag_r_lsst - - mag_i_lsst - - mag_z_lsst - - mag_y_lsst - calculated_point_estimates: [] - chunk_size: 10000 - columns_file: /global/u2/q/qhang/desc/rail_bpz/src/rail/examples_data/estimation_data/configs/test_bpz.columns - config: null - data_path: None - dz: 0.01 - err_bands: &id002 - - mag_err_u_lsst - - mag_err_g_lsst - - mag_err_r_lsst - - mag_err_i_lsst - - mag_err_z_lsst - - mag_err_y_lsst - gauss_kernel: 0.0 - hdf5_groupname: '' - input: None - madau_flag: 'no' - mag_err_min: 0.005 - mag_limits: &id003 - mag_g_lsst: 29.04 - mag_i_lsst: 28.62 - mag_r_lsst: 29.06 - mag_u_lsst: 27.79 - mag_y_lsst: 27.05 - mag_z_lsst: 27.98 - model: None - name: estimate_bpz - no_prior: true - nondetect_val: 99.0 - nzbins: 301 - output: pdf/pz/output_estimate_bpz.hdf5 - output_mode: default - p_min: 0.005 - redshift_col: redshift - ref_band: mag_i_lsst - spectra_file: CWWSB4.list - unobserved_val: -99.0 - zmax: 3.0 - zmin: 0.0 - zp_errors: - - 0.01 - - 0.01 - - 0.01 - - 0.01 - - 0.01 - - 0.01 -flow_engine_train: - aliases: - output: output_flow_engine_train - config: null - model: /global/u2/q/qhang/desc/rail_base/src/rail/examples_data/goldenspike_data/data/pretrained_flow.pkl - n_samples: 10 - name: flow_engine_train - output: catalog/created/output_flow_engine_train.pq - output_mode: default - seed: 12345 -inform_bpz: - aliases: - input: output_deredden - model: model_inform_bpz - bands: *id001 - columns_file: /global/u2/q/qhang/desc/rail_bpz/src/rail/examples_data/estimation_data/configs/test_bpz.columns - config: null - data_path: None - err_bands: *id002 - hdf5_groupname: '' - init_alpha: 1.8 - init_km: 0.1 - init_kt: 0.3 - init_zo: 0.4 - input: None - m0: 20.0 - mag_limits: *id003 - mmax: 26.0 - mmin: 18.0 - model: model/estimator/trained_BPZ.pkl - name: inform_bpz - nondetect_val: 99.0 - nt_array: - - 8 - nzbins: 301 - output_mode: default - redshift_col: redshift - ref_band: mag_i_lsst - save_train: true - spectra_file: CWWSB4.list - type_file: '' - zmax: 3.0 - zmin: 0.0 -obs_condition: - aliases: - input: output_flow_engine_train - output: output_obs_condition - config: null - input: None - map_dict: - m5: - i: /global/u2/q/qhang/desc/rail_astro_tools/src/rail/creation/degradation/../../examples_data/creation_data/data/survey_conditions/minion_1016_dc2_Median_fiveSigmaDepth_i_and_nightlt1825_HEAL.fits - nYrObs: 5.0 - mask: /global/u2/q/qhang/desc/rail_astro_tools/src/rail/creation/degradation/../../examples_data/creation_data/data/survey_conditions/DC2-mask-neg-nside-128.fits - name: obs_condition - nside: 128 - output: catalog/degraded/output_obscondition.pq - output_mode: default - random_seed: 42 - seed: 12345 - tot_nVis_flag: true - weight: /global/u2/q/qhang/desc/rail_astro_tools/src/rail/creation/degradation/../../examples_data/creation_data/data/survey_conditions/DC2-dr6-galcounts-i20-i25.3-nside-128.fits -tomopraphy: - aliases: - input: output_estimate_bpz - output: output_tomopraphy - chunk_size: 10000 - config: null - id_name: '' - input: None - name: tomopraphy - nbins: 5 - no_assign: -99 - output: pdf/pz/output_tomography.hdf5 - output_mode: default - point_estimate: zmode - zbin_edges: [] - zmax: 3.0 - zmin: 0.0 From 6f90ba7cf3757e744e34a90e2c663256e6ab666f Mon Sep 17 00:00:00 2001 From: hangqianjun Date: Thu, 23 Nov 2023 15:34:27 -0800 Subject: [PATCH 09/10] reverting some notebook meta data that was accidentally changed --- nb/estimation/estimate_all_hsc.ipynb | 6 +++--- nb/examples/goldenspike/goldenspike.ipynb | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/nb/estimation/estimate_all_hsc.ipynb b/nb/estimation/estimate_all_hsc.ipynb index c78aae1..74a9cdd 100644 --- a/nb/estimation/estimate_all_hsc.ipynb +++ b/nb/estimation/estimate_all_hsc.ipynb @@ -471,9 +471,9 @@ ], "metadata": { "kernelspec": { - "display_name": "NERSC Python", + "display_name": "rail_env", "language": "python", - "name": "python3" + "name": "rail_env" }, "language_info": { "codemirror_mode": { @@ -485,7 +485,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.7" + "version": "3.11.4" } }, "nbformat": 4, diff --git a/nb/examples/goldenspike/goldenspike.ipynb b/nb/examples/goldenspike/goldenspike.ipynb index 78d36b5..1dd468c 100644 --- a/nb/examples/goldenspike/goldenspike.ipynb +++ b/nb/examples/goldenspike/goldenspike.ipynb @@ -105,7 +105,7 @@ ], "metadata": { "kernelspec": { - "display_name": "NERSC Python", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -119,7 +119,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.7" + "version": "3.10.10" } }, "nbformat": 4, From 359d5f164c0272eb6dc6ef3a3bddbd2ad8efa257 Mon Sep 17 00:00:00 2001 From: hangqianjun Date: Mon, 18 Dec 2023 02:46:42 -0800 Subject: [PATCH 10/10] Reset the notebook and remove all outputs --- .../survey_nonuniform.ipynb | 255 +++--------------- 1 file changed, 30 insertions(+), 225 deletions(-) diff --git a/nb/examples/survey_nonuniformity/survey_nonuniform.ipynb b/nb/examples/survey_nonuniformity/survey_nonuniform.ipynb index 5b2a87d..63a4eba 100644 --- a/nb/examples/survey_nonuniformity/survey_nonuniform.ipynb +++ b/nb/examples/survey_nonuniformity/survey_nonuniform.ipynb @@ -2,32 +2,10 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "62c833e4-fde5-4ba0-8406-966805b80ed2", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Imported rail.hub\n", - "Imported rail.astro_tools\n", - "Imported rail.core\n", - "Imported rail.stages\n", - "Imported rail.bpz\n", - "Imported rail.cmnn\n", - "Imported rail.delight\n", - "Failed to import rail.dsps because: You need to have the SPS_HOME environment variable\n", - "Imported rail.flexzboost\n", - "Imported rail.gpz\n", - "Imported rail.pipelines\n", - "Failed to import rail.pzflow because: No module named 'rail.estimation.algos.pzflow'\n", - "Imported rail.sklearn\n", - "Imported rail.som\n", - "Attached 12 base classes and 57 fully formed stages to rail.stages\n" - ] - } - ], + "outputs": [], "source": [ "# usual imports\n", "import os\n", @@ -43,7 +21,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "1d01d581-16b2-400e-9a68-8bb57a141a6b", "metadata": { "tags": [] @@ -65,7 +43,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "92e175b0-bcf4-4777-a165-a95afe061627", "metadata": { "tags": [] @@ -89,7 +67,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "682d2489-ba1b-4344-af95-728667e53528", "metadata": {}, "outputs": [], @@ -115,34 +93,19 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "id": "ba92106a-6ac6-42e3-822f-d5dcf30a5793", "metadata": { "tags": [] }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Inserting handle into data store. model: /global/u2/q/qhang/desc/rail_base/src/rail/examples_data/goldenspike_data/data/pretrained_flow.pkl, flow_engine_train\n", - "Inserting handle into data store. output_flow_engine_train: catalog/created/inprogress_output_flow_engine_train.pq, flow_engine_train\n", - "Inserting handle into data store. output_obs_condition: catalog/degraded/inprogress_output_obscondition.pq, obs_condition\n", - "Inserting handle into data store. output_col_remapper: catalog/degraded/inprogress_output_col_remapper.pq, col_remapper\n", - "Inserting handle into data store. output_deredden: catalog/degraded/inprogress_output_deredden.pq, deredden\n", - "Inserting handle into data store. output_table_conv: catalog/degraded/inprogress_output_table_conv.hdf5, table_conv\n", - "Inserting handle into data store. model_inform_bpz: model/estimator/inprogress_trained_BPZ.pkl, inform_bpz\n", - "Inserting handle into data store. output_estimate_bpz: pdf/pz/inprogress_output_estimate_bpz.hdf5, estimate_bpz\n" - ] - } - ], + "outputs": [], "source": [ "pipe = SurveyNonuniformDegraderPipeline()" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "id": "6621e102-b0dd-4fb8-a524-6b4545189cf9", "metadata": { "tags": [] @@ -162,45 +125,12 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "id": "fb991e78-c465-48ec-89e1-93e5192c071b", "metadata": { "tags": [] }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Downloading SFD data file to /global/u2/q/qhang/desc/rail_pipelines/nb/examples/survey_nonuniformity/sfd/SFD_dust_4096_ngp.fits\n", - "Downloading data to '/global/u2/q/qhang/desc/rail_pipelines/nb/examples/survey_nonuniformity/sfd/SFD_dust_4096_ngp.fits' ...\n", - "Downloading https://dataverse.harvard.edu/api/access/datafile/2902687 ...\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " 62.3 MiB of 64.0 MiB | 34.8 MiB/s |################## | 97% | ETA: 0:00:00" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Downloading SFD data file to /global/u2/q/qhang/desc/rail_pipelines/nb/examples/survey_nonuniformity/sfd/SFD_dust_4096_sgp.fits\n", - "Downloading data to '/global/u2/q/qhang/desc/rail_pipelines/nb/examples/survey_nonuniformity/sfd/SFD_dust_4096_sgp.fits' ...\n", - "Downloading https://dataverse.harvard.edu/api/access/datafile/2902695 ...\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - " 64.0 MiB of 64.0 MiB | 31.6 MiB/s |###################| 100% | ETA: 00:00:00" - ] - } - ], + "outputs": [], "source": [ "# fetch dust map and save:\n", "import dustmaps.sfd\n", @@ -218,25 +148,12 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": null, "id": "650cdbef-83c7-4a77-9df5-0eae563ccf51", "metadata": { "tags": [] }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "setting the output map dtype to [dtype('>f8')]\n", - "setting the output map dtype to [dtype('>f8')]\n", - "setting the output map dtype to [dtype('>f8')]\n", - "setting the output map dtype to [dtype('>f8')]\n", - "setting the output map dtype to [dtype('>f8')]\n", - "setting the output map dtype to [dtype('>f8')]\n" - ] - } - ], + "outputs": [], "source": [ "# load the DC2 mask:\n", "mask = hp.read_map(find_rail_file(\"examples_data/creation_data/data/survey_conditions/DC2-mask-neg-nside-128.fits\"))\n", @@ -272,7 +189,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "id": "526a1831-6094-4ff2-826b-0c3df8662b29", "metadata": {}, "outputs": [], @@ -339,7 +256,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "id": "2a64eb7b-d67e-422d-a60a-ed0085bbf677", "metadata": {}, "outputs": [], @@ -353,7 +270,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "id": "ff0d1439-169b-45dc-b224-27cc3189aab9", "metadata": {}, "outputs": [], @@ -365,47 +282,12 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "id": "bc2f4d20-3dc5-40be-bd99-3c5d36e7d700", "metadata": { "tags": [] }, - "outputs": [ - { - "data": { - "text/plain": [ - "(({'flow_engine_train': ,\n", - " 'obs_condition': ,\n", - " 'col_remapper': ,\n", - " 'deredden': ,\n", - " 'table_conv': ,\n", - " 'inform_bpz': ,\n", - " 'estimate_bpz': ,\n", - " 'tomopraphy': },\n", - " [,\n", - " Loaded observing conditions from configuration file: \n", - " nside = 128, \n", - " mask file: /global/u2/q/qhang/desc/rail_astro_tools/src/rail/examples_data/creation_data/data/survey_conditions/DC2-mask-neg-nside-128.fits, \n", - " weight file: , \n", - " tot_nVis_flag = True, \n", - " random_seed = 42, \n", - " map_dict contains the following items: \n", - " {'m5': {'u': './CoaddM5_u_dummpy.fits', 'g': './CoaddM5_g_dummpy.fits', 'r': './CoaddM5_r_dummpy.fits', 'i': './CoaddM5_i_dummpy.fits', 'z': './CoaddM5_z_dummpy.fits', 'y': './CoaddM5_y_dummpy.fits'}, 'nYrObs': 1.0, 'nVisYr': {'u': 1.0, 'g': 1.0, 'r': 1.0, 'i': 1.0, 'z': 1.0, 'y': 1.0}, 'sigLim': 3, 'ndFlag': nan, 'extendedType': 'point', 'majorCol': 'major', 'minorCol': 'minor', 'decorrelate': True, 'highSNR': False, 'renameDict': {'u': 'mag_u_lsst', 'g': 'mag_g_lsst', 'r': 'mag_r_lsst', 'i': 'mag_i_lsst', 'z': 'mag_z_lsst', 'y': 'mag_y_lsst'}},\n", - " Stage that applies remaps the following column names in a pandas DataFrame:\n", - " f{str(self.config.columns)},\n", - " ,\n", - " ,\n", - " ,\n", - " ,\n", - " ]),\n", - " {'output_dir': '.', 'log_dir': '.', 'resume': True})" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "pipe_info" ] @@ -420,7 +302,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "id": "bcd3534c-ce25-48d9-a629-49ce17cdd279", "metadata": {}, "outputs": [], @@ -438,18 +320,10 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "7943d633-f27c-469b-944b-2ea79ee011ec", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Inserting handle into data store. model: /global/u2/q/qhang/desc/rail_base/src/rail/examples_data/goldenspike_data/data/pretrained_flow.pkl, flow_engine_train\n" - ] - } - ], + "outputs": [], "source": [ "import ceci\n", "pr = ceci.Pipeline.read('tmp_survey_nonuniformity.yml')" @@ -457,46 +331,10 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "a206fbe7-757e-4df6-803f-3abf170874de", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Executing flow_engine_train\n", - "Command is:\n", - "OMP_NUM_THREADS=1 python3 -m ceci rail.creation.engines.flowEngine.FlowCreator --model=/global/u2/q/qhang/desc/rail_base/src/rail/examples_data/goldenspike_data/data/pretrained_flow.pkl --name=flow_engine_train --config=tmp_survey_nonuniformity_config.yml --output=./catalog/created/output_flow_engine_train.pq \n", - "Output writing to ./flow_engine_train.out\n", - "\n", - "Job flow_engine_train has failed with status 1\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\n", - "*************************************************\n", - "Error running pipeline stage flow_engine_train.\n", - "\n", - "Standard output and error streams in ./flow_engine_train.out\n", - "*************************************************\n" - ] - }, - { - "data": { - "text/plain": [ - "1" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "pr.run() # this somehow is not using the rail_dev environment to run" ] @@ -535,7 +373,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": null, "id": "26c06fb4-0a88-4102-8415-11d08a3efd37", "metadata": {}, "outputs": [], @@ -548,7 +386,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": null, "id": "06e3c212-4cae-42cb-a1ee-4125d03ed2fa", "metadata": {}, "outputs": [], @@ -563,23 +401,12 @@ }, { "cell_type": "code", - "execution_count": 67, + "execution_count": null, "id": "af3a447c-bed7-4101-98e8-42838ee4ed37", "metadata": { "tags": [] }, - "outputs": [ - { - "data": { - "image/png": "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n5+vffv2KTw8XB07dlRqaqqOHz+uNWvWSJIyMzN1/fXXKyEhQRcuXNCrr76q9evXa/369eYdIADAKS43pUJCQrRu3Tr9+c9/1ieffKKmTZuqZ8+eio2NdauA+Ph47du3T6dOndL69es1fvx45ebm2h+/+mNiDcO45kfHcr03AFiD2XkBAGg4zMyIvLw8DR061L6ckpIiSRo/fryysrJUUFBQ7T5VFy5c0KOPPqrjx4+radOmSkhI0LvvvquRI0fW/8AAAC5xuSl12fXXXy/DMNSpUyf7uxvuCAkJsd/ovF+/fvr444/17LPP6o9//KMkqbCwsNqptEVFRTXOnrpSamqqPYikS2dKdejQwe36AAD1Y1ZeAAAaHjMyYsiQITIMw+HjWVlZ1ZbnzJmjOXPmuPVcAABzuXxPqbKyMj3wwANq1qyZEhIS7O86zJgxQwsXLqx3QYZhqLy8XHFxcYqKitLmzZvtj124cEG5ubkaOHCgw/253hsArMHTeQEA8F9kBABAcqMplZqaqk8++UQ5OTlq0qSJff0vfvELrVu3zqWx5s6dq3/961/69ttv9emnn2revHnKycnRPffcI5vNplmzZik9PV0bNmzQZ599pgkTJqhZs2YaN26cq2UDALzMzLwAADQsZAQAQHLj8r233npL69at04ABA6rd26l79+76+uuvXRrrhx9+0L333quCggK1atVKvXr10saNGzV8+HBJl06tPXfunKZOnaqTJ0+qf//+ys7OVlhYmKtlAwC8zMy8AAA0LGQEAEByoyn1448/KiIiosb6s2fPXvMG5LVZuXLlNR+32WxKS0tTWlqaS+MCAHzPzLwAADQsZAQAQHLj8r1bbrlF7777rn35cmi88sorSkxMNK8yAIBfIy8AAI6QEQAAyY0zpTIyMnTHHXfo4MGDqqio0LPPPqsDBw5o586dys3N9USNAAA/RF4AABwhIwAAkhtnSg0cOFDbt29XWVmZOnXqpOzsbEVGRmrnzp3q27evJ2oEAPgh8gIA4AgZAQCQ3DhTSpJ69uyp1atXm10LAKCBIS8AAI6QEQAAp5pSJSUlatmypf3f19KsWTMFBbnV6wIA+DnyAgDgCBkBALiaU5fvXXfddSoqKpIktW7dWtddd53DryZNmqhbt27aunWrRwsHAFgPeQEAcISMAABczam3H95//32Fh4dLUp3B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BgB4BXkBAHCEjAAASG40pUJDQ/Xzn//cE7U0GgE2KSKsSb3HKTpzXlWGCQUBgAeQFwAAR8gIAIDkRlNq5syZev755/Xcc895op5GISKsiXbNHVbvcQakb+HMKwCWRV4AABwhIwAAkhtNqY8++kjvv/++/vGPfyghIaHGTQnffPNN04oDAPgv8gIA4AgZAQCQ3GhKtW7dWqNHj/ZELXBT0ZnzGpC+xZRxAMAs5AUAwBEyAgAgudGUWrVqlSfqQD1UGeIyPgCWQ14AABwhIwAAkhtNKVhHu7BQvxoXAAAAAADgMpebUnFxcbLZbA4f/+abb+pVEJz3zvRBvi4BABwiLwAAjpARAADJjabUrFmzqi1fvHhRe/fu1caNG/XYY4+ZVRcAwM+RFwAAR8gIAIDkRlNq5syZta5ftmyZ8vLy6l0QAKBhIC8AAI6QEQAASQowa6Dk5GStX7/erOEAAA0UeQEAcISMAIDGxbSm1BtvvKHw8HCzhgMANFDkBQDAETICABoXly/f69OnT7WbEhqGocLCQv3444968cUXTS0OAOC/yAu45OUkqbTIvPFKC80bC4DpyAgAgORGU+quu+6qthwQEKB27dppyJAhuvHGG82qCwDg58gLuKS0SDrzva+rAOAlZAQAQHKjKfXkk096og4AQANDXsAttgCpRZR547WIMG8sAKYhIwAAkhtNKQAAAI9pESU9csjXVQDwMy+++KKefvppFRQUKCEhQZmZmbr11ltr3TYnJ0dDhw6tsf7QoUOcpQUAXuZ0UyogIKDadd+1sdlsqqioqHdRAAD/RV4AABzxREasW7dOs2bN0osvvqif//znevnll5WcnKyDBw+qY8eODvc7fPiwWrZsaV9u166d088JADCH002pDRs2OHxsx44dev7552UYhktPvm3bNj399NPavXu3CgoKtGHDhmrXlxuGofnz52vFihU6efKk+vfvr2XLlikhIcGl5wEAeI8n8gIA0DB4IiOWLl2qBx54QA8++KAkKTMzU5s2bdLy5cuVkZHhcL+IiAi1bt3apecCAJjL6abUnXfeWWPd559/rtTUVL3zzju655579Oc//9mlJz979qx69+6tiRMnasyYMTUeX7x4sZYuXaqsrCx17dpVCxYs0PDhw3X48GGFhYW59FwAAO/wRF4AABoGszPiwoUL2r17tx5//PFq60eM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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# total:\n", "fig,axarr=plt.subplots(1,3,figsize=[12,3])\n", @@ -596,21 +423,10 @@ }, { "cell_type": "code", - "execution_count": 65, + "execution_count": null, "id": "a1dfe4fe-bdd7-4bc0-b09c-4776643953fd", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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p04aNmyY0tPTlZ6erqioKJ04cUK9e/dW+/bttWfPHs2fP18LFy7USy+9ZLN8YmKiateurR07dmjMmDF68skn9eCDD6pz587atWuX9To/Fy5ckCS7x3WVxMRE+fv7a8uWLXrvvfckSX5+fnrzzTe1d+9eJSYm6uuvv9akSZOKXf7MmTOaP3++OnbsqObNm2vnzp2aOXOmXn75Zes8q1evVrt27fTggw8qNDRUrVu31vvvv3/NurKysmSxWKx/6QAAb+SrmZGVlaWQkBCHt5fMAADnOJIX/1j8D72a8KrN8h9/8LFq1aqlrzd/rSeefEJxY+M0+JHB6tCxg5K3J6vHHT00/LHh1rw4eeKkHrr3IbVp28bpvDh8+LDWrl2rbt26Oby95IX9OFIKgI3q1asrMDBQlStXVnj476eKzJs3T1FRUXr77bdlsVh088036+TJk3rmmWc0depU+fld6XG3bNlSzz33nKQr13CYOXOmateurWHDhkmSpk6dqvnz5+u7775Tx44d7R7XVW688Ua98sorNtP+eK57dHS0XnzxRT355JOaN2+epCuHzn755ZdKTEzU6tWrddNNN2nAgAFauXKlIiIiiqzjyJEjmj9/vuLi4jRlyhTt2LFDY8eOVVBQkM01LgpdunRJkydP1iOPPKJq1aqZu8EAYCJfzIxly5bp3//+t/VLgiPIDABwjiN58dOxnzTt2Wl65tlnrJ/rzVs018T4iZKkuElxmjt7rkJqhWjQ0EGSpElTJmnhgoXa9/0+te/QXgvfW6gb6t6gV+e+qhoVaziUF4V/GMnJydETTzyhF154weHtJS/sR1MKgF0OHDigTp06yWKxWKfdeuutOnfunH755Rfr4Z+33HKL9fUKFSqoVq1aatGihXVaWFiYpCu3XnZkXFdp165dkWkbN27UjBkztH//fmVnZysvL0+XLl3S+fPnVaVKFR07dkz33HOPatasqQ8//FD333//NddRUFCgdu3aWc9Fb926tfbt26f58+cXCYzLly/r4YcfVkFBgTWgAMDXeGtmJCUlafDgwXr//fcVExPj8HaRGQBgruI+1zt06qBz587pxC8nFFUvSpIU0+L3z+wKFSqoZkhNxTT/fVpoWKgk6ddff5V05aLl7Tu0dyovli5dqrNnz2rPnj2aOHGiZs+eXeIRTSUhL+zH6XsA7GIYhs2HeuE0STbTr76VssVisZlWOG9BQYFD47pKlSpVbJ4fPXpUvXv3VvPmzbV8+XLt3LlT77zzjiRZ77xRt25dffTRR+rQoYP69++v2267Te+//36J17aKiIhQs2bNbKY1bdrU5qKrheM/9NBDSktL0/r1673qLxgA4AhvzIzk5GT16dNHc+bMKfYvyPYgMwDAXPZ+rvsH2B5PY7FYbKaZmRdRUVFq1qyZ/vrXv2rmzJmaNm2a8vPzHdks8sIBNKUAFBEYGFjkg7dZs2baunWrzQVFt27dquDgYOsdIJzhqnGdlZKSory8PL322mvq2LGjbrrppiK3TfX399fDDz+sL7/8UseOHVOfPn00d+5chYeH68EHH9Tq1attbh1766236uDBgzZjHDp0SPXr17c+LwyLH3/8Uf/v//0/1apVy7UbCgAm8YXMSEpK0t13362ZM2fqiSeecHr9VyMzAMB+9ubFju07FBwcrMgbIp1e180336wd23eUOocMw9Dly5cdutlOcciLktGUAlBEgwYN9O233+rnn3/WqVOnVFBQoJEjR+r48eMaM2aMfvjhB3366ad6/vnnFRcXV6rrPjk77v79+5WamqrTp08rKytLqampSk1NdbqOQo0aNVJeXp7eeustHTlyRP/4xz/07rvvljh/RESEJk2apH379mnz5s0KCwvTY489psmTJ1vnGT9+vLZv364ZM2bo8OHD+vDDD7VgwQKNGjVKkpSXl6cHHnhAKSkp+uc//6n8/HxlZGQoIyNDubm5pd4mAHAlb8+MwobU2LFj1a9fP+vn6+nTp52uoxCZAQD2szcvEl5M0MixI0uVF0OHD9WJX05o0vhJdufFP//5T/3rX//SgQMHdOTIEX3yySeKj49X//79S7xjn73Ii5JxTSnAQzLPXlLHGa6/XWvm2UsOLzNhwgQNGjRIzZo108WLF623a12zZo0mTpyoli1bKiQkREOHDrVeoNZZN9xwg1Pj9u7dW0ePHrU+b926taTfD8v9+eefFR0drY0bNyo2Ntbuelq1aqU5c+Zo1qxZio+PV9euXZWQkGDXqR7t2rVTu3btNGfOHP3yyy/W6e3bt9fKlSsVHx+vF154QdHR0Zo7d64effRRSdIvv/yi1atXW9f/R47WD6CMOpchvdbU9etwgrdnxuLFi3XhwgUlJCQoISHBOr1bt25KSkqSRGYAKDtO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zxUIAPAK5AUAwF5kBjzN39MFAN4uNzdXgYGBni5D4eHhNs9/+ukn3X333apfv76HKgIA/BF5AQCwF5kBXMGRUsBVYmNjNXr0aMXFxal27dq64447tH//fvXu3VtVq1ZVWFiYBgwYoFOnTlmXOX/+vAYOHKiqVasqIiJCr732WpFx582bp8aNG6tixYoKCwvTAw88YPN6QUGBJk2apJCQEIWHh2vatGk2r//x0FqLxaKdO3fqhRdekMViUWxsrIYMGaKsrCxZLBZZLJYiywMAzEVeAADsRWYAxaMpBRQjMTFR/v7+2rJli2bOnKlu3bqpVatWSklJ0dq1a/Wf//xHDz30kHX+iRMnauPGjVq5cqXWrVunpKQk7dy50/p6SkqKxo4dqxdeeEEHDx7U2rVr1bVr1yLrrFKlir799lu98soreuGFF7R+/fpi60tPT1dMTIyefvpppaena/Xq1Zo7d66qVaum9PR0paena8KECa754QAArMgLAIC9yAygKE7fA4px44036pVXXpEkTZ06VW3atNGMGTOsr//9739XVFSUDh06pMjISC1cuFBLlizRHXfcIenKh3/dunWt8x87dkxVqlTRPffco+DgYNWvX1+tW7e2Wectt9yi559/XpLUuHFjvf3229qwYYN1zD8KDw+Xv7+/qlataj3ktnr16rJYLEUOwQUAuA55AQCwF5kBFEVTCihGu3btrP/euXOnNm7cqKpVqxaZ76efftLFixeVm5urTp06WaeHhISoSZMm1ud33HGH6tevr4YNG+quu+7SXXfdpfvuu0+VK1e2znPLLbfYjB0REaHMzEwzNwsAYDLyAgBgLzIDKIrT94BiVKlSxfrvgoIC9enTR6mpqTaPH3/8UV27dpVhGNcdLzg4WLt27dJHH32kiIgITZ06VS1bttRvv/1mnScgIMBmGYvFooKCAtO2CQBgPvICAGAvMgMoiqYUcB1t2rTRvn371KBBA9144402jypVqujGG29UQECAtm/fbl3mzJkzOnTokM04/v7++vOf/6xXXnlF3333nX7++Wd9/fXXptUZGBio/Px808YDADiGvAAA2IvMAK6gKQVcx6hRo3T69Gn99a9/1Y4dO3TkyBGtW7dOjz32mPLz81W1alUNHTpUEydO1IYNG7R3714NHjxYfn6/v70+//xzvfnmm0pNTdXRo0e1ZMkSFRQU2Bx+W1oNGjTQuXPntGHDBp06dUoXLlwwbWwAwPWRFwAAe5EZwBU0pYDriIyM1JYtW5Sfn68777xTzZs311NPPaXq1atbQ+HVV19V165d9Ze//EV//vOf1aVLF7Vt29Y6Ro0aNbRixQrdfvvtatq0qd5991199NFHiomJMa3Ozp07a8SIEerfv7/q1KljvYgiAMA9yAsAgL3IDOAKi2HPyaoAAAAAAACAiThSCgAAAAAAAG5HUwoAAAAAAABuR1MKAAAAAAAAbkdTCgAAAAAAAG5HUwoAAAAAAABuR1MKAAAAAAAAbkdTCgAAAAAAAG5HUwoAAAAAAABuR1MKAAAAAAAAbkdTCgAAAAAAAG5HUwoAAAAAAABuR1MKAAAAAAAAbvf/AUVRFLXticDvAAAAAElFTkSuQmCC", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# now also split in depth:\n", "fig,axarr=plt.subplots(1,3,figsize=[12,3])\n", @@ -630,23 +446,12 @@ }, { "cell_type": "code", - "execution_count": 64, + "execution_count": null, "id": "dc934d61-8523-45d7-9ef2-9eccc5866ef1", "metadata": { "tags": [] }, - "outputs": [ - { - "data": { - "image/png": "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5ptvSpKqVaum1157TXv37lViYqI+/fRTTZkypdTlT58+rUWLFqlbt25q06aN0tLSNGfOHL3wwgv2edatW6cuXbronnvuUVhYmDp27Ki33nrrsnVlZ2fLZrPZ/9IBAFbkq5mRnZ2t0NBQp7eXzAAA1/hiXnz//ffasGGDevfu7fT2khflZ9kLnQPwjjp16iggIEA1a9ZUo0b/PVVk4cKFioqK0uuvvy6bzabrrrtOP//8s6ZOnaoZM2aoWrVLPe727dvr6aeflnTpGg5z5sxRgwYNNHLkSEnSjBkztGjRIn399dfq1q1bucd1l2uuuUYvvviiw7TfnuseHR2t5557Tk888YQWLlwo6dKhsx9//LESExO1bt06/eEPf9CQIUO0Zs0aRURElFjH4cOHtWjRIsXGxmr69On68ssvNX78eAUGBjpc46JYXl6epk2bpgcffFAhISHmbjAAmMgXM2P16tX66quv7F8SnEFmAIBrfCkvihtd+fn5euyxxzRr1iynt5e8KD+aUgDK5cCBA+revbtsNpt92g033KCzZ8/qp59+sh/+2a5dO/vr1atXV/369dW2bVv7tPDwcEmXbr3szLju0qVLlxLTtmzZotmzZ2v//v3KyclRQUGB8vLydO7cOdWqVUvHjh3T7bffrnr16mnlypW66667LruOoqIidenSxX4ueseOHbVv3z4tWrSoRGBcvHhR999/v4qKiuwBBQC+xqqZkZycrOHDh+utt95S69atnd4uMgMAzGXFvFi1apXOnDmjPXv2aPLkyZo3b16ZRzSVhbwoP07fA1AuhmE4fKgXT5PkMP33t1K22WwO04rnLSoqcmpcd6lVq5bD86NHj2rAgAFq06aNkpKSlJaWpjfeeEOS7HfeuPrqq/XOO+/o+uuv13333acbb7xRb731VpnXtoqIiFCrVq0cprVs2dLhoqvF49977706cuSINm3aZKm/YACAM6yYGSkpKRo4cKDmz59f6l+Qy4PMAABzWTEvoqKi1KpVKz3wwAOaM2eOnn32WRUWFjqzWeSFE2hKASghICCgxAdvq1attGPHDocLiu7YsUPBwcH2O0C4wl3juio1NVUFBQV6+eWX1a1bN/3hD38ocdtUPz8/3X///fr444917NgxDRw4UAkJCWrUqJHuuecerVu3zuHWsTfccIMOHjzoMMahQ4fUpEkT+/Pi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Sc2bN1dBQYEWLFiggQMHavv27Vq8eLHDPMeOHVPLli0VExOjmTNnavDgwSX+GvJbzhxaa7PZNHnyZD3zzDNq3769OnTooMTERH377bdavfrSdWV+/vlnxcTEqHHjxpo3b55++eUX+/IVuRshALjC6pmRnJys2267TRMmTNDgwYOVmZkp6dKXo4pevJXMAIDys3pe/POf/5S/v7/atm2rwMBApaWlKS4uTvfdd5/8/CrWOiEvymb5ptTFixd177336siRI/r000+veCHBuLg4h0PacnJyFBUV5e4ygUrlySef1LBhw9SqVSudP39eR44cUdOmTbV+/XpNnjxZ7du3V2hoqB555BE9/fTTFVrXVVdd5dK4AwYM0NGjR+3PO3bsKOm/h+X++OOPio6O1pYtWxQTE1Puejp06KD58+dr7ty5iouLU69evRQfH+9wqkeDBg105MgRt13vauLEicrLy9OkSZN06tQptW/fXps2bVLz5s0lSRs3btT333+v77//XldffbXDsl68dwWAKsrqmbF8+XLl5uYqPj7e4ZoZvXv3VnJysiQyAwA8wep54efnp7lz5+rQoUMyDENNmjTRmDFjNGnSJPs85IX5vHr3vd+y2WwOd9+T/tuQ+u6777RlyxY1bNjQ6XGtdmcMq+Pue+a67N2U4FbJycm68847dfjwYdWrV8/b5Xgdd1K6Mn4OlVBlufse3I7McERmXJnVfg7cfa9qITO8h7xw5PN33zt79qy+//57+/MjR44oPT1doaGhioyM1N13361du3bpww8/VGFhof1w69DQUAUEBHirbAA+YMOGDZo+fTphAQC4IjIDAFAe5IX5vNqUSk1NVZ8+fezPi0+7GzZsmJ599lmtW7dOUslrxDh7qByAqmfOnDneLgEA4CPIDABAeZAX5vNqUyomJuay5yZa5MxCAAAAAAAAmIz7wQIAAAAAAMDjaEoBAAAAAADA45xuSp0/f165ubn250ePHlVCQoI2btxoamFAZcKpqPA2b/wOkheA88gLWIEnfg/JCKDiyAx4mxm/g043pQYNGqQVK1ZIkn799Vddf/31evnllzVo0CAtWrSowgUBlUn16tUlSRcuXPByJajqiv/j7+/v77F1khdA+RW/N3/7JR3wFk9kBhkBuI7vGLAKM/LC6Qud79q1S6+88ookafXq1QoPD9fu3buVlJSkGTNm6IknnnC5GKCy8fPzU82aNfXLL7/I399f1apxxiw8yzAM5ebmKisrS3Xr1rX/J8YTyAug/KpXr666desqKytLklSzZk3ZbDYvV4WqxpOZQUYAruM7BrzNzLxwuimVm5ur4OBgSdLGjRt11113qVq1aurWrZuOHj3qciFAZWSz2RQREaEjR47w/oBX1a1bV40aNfLoOskLwDnF79HixhTgLZ7IDDICcB3fMWAVZuSF002pa665RmvXrtWdd96pTz75RJMmTZJ06T9QISEhFSoGqIwCAgJ07bXXcngtvMbf39+jR0gVIy8A5xR/yQgLC9PFixe9XQ6qKE9lBhkBVAzfMeBtZuWF002pGTNm6MEHH9SkSZPUt29fde/eXdKlv3B07NixwgUBlVG1atUUFBTk7TIAjyIvANdUr17dK41kwJPICKDi+I6BysDpptTdd9+tnj17KiMjQ+3bt7dP79u3r+666y5TiwMA+C7yAgBQFjICACC5cPe9hx9+WLVq1VLHjh0dLqjWunVrzZ0719TiAAC+i7wAAJSFjAAASC40pRITE3X+/PkS08+fP2+/rSsAAOQFAKAsZAQAQHLi9L2cnBwZhiHDMHTmzBmHc1cLCwu1fv16hYWFuaVIAIDvIC8AAGUhIwAAv1XuplTdunVls9lks9n0hz/8ocTrNptNM2fONLU4AIDvIS8AAGVxR0Zs3bpVL730ktLS0pSRkaE1a9bojjvuKHP+5ORk9enTp8T0AwcO6LrrrnNq3QCAiil3U2rLli0yDEN/+tOflJSUpNDQUPtrAQEBatKkiSIjI91SJADAd5AXAICyuCMjzp07p/bt22vEiBEaPHhwuZc7ePCgQkJC7M8bNmzo1HoBABVX7qZU7969JUlHjhxR48aNZbPZ3FYUAMB3kRcAgLK4IyP69++v/v37O71cWFiY6tatW+H1AwBc5/SFzj/99FOtXr26xPT33ntPiYmJphQFAPB95AUAoCxWyIiOHTsqIiJCffv21ZYtWzyyTgCAI6ebUnPmzFGDBg1KTA8LC9Ps2bNNKQoA4PvICwBAWbyZEREREVqyZImSkpL0/vvvq0WLFurbt6+2bt1a5jL5+fnKyclxeAAAKs7pptTRo0cVHR1dYnqTJk107NgxU4oCAPg+T+dFQUGBnn76aUVHR6tGjRpq1qyZZs2apaKiItPXBQCoGG9+p2jRooVGjhypTp06qXv37lq4cKFuu+02zZs3r8xl4uPjVadOHfsjKirKrTUCQFXhdFMqLCxMX3/9dYnpe/bsUf369U0pCgDg+zydF3PnztXixYv1+uuv68CBA3rxxRf10ksvacGCBaavCwBQMVb7TtGtWzd99913Zb4eFxen7Oxs++P48eMerA4AKq9yX+i82P3336/x48crODhYvXr1kiSlpKRowoQJuv/++00vEADgmzydFzt37tSgQYN02223SZKaNm2qd955R6mpqaavCwBQMVb7TrF7925FRESU+XpgYKACAwM9WBEAVA1OHyn1/PPP6/rrr1ffvn1Vo0YN1ahRQ/369dOf/vQnp8//3rp1qwYOHKjIyEjZbDatXbvW4XXDMPTss88qMjJSNWrUUExMjPbt2+dsyQAALzAzL8qjZ8+e2rx5sw4dOiTp0l/bt23bpgEDBpi+LgBAxZiZEWfPnlV6errS09MlXbqzX3p6uv00wLi4OA0dOtQ+f0JCgtauXavvvvtO+/btU1xcnJKSkjR27FjTtg8AUD5OHykVEBCgVatW6bnnntOePXtUo0YNtW3bVk2aNHF65efOnVP79u01YsQIDR48uMTrL774oubPn6/ly5frD3/4g55//nndfPPNOnjwoIKDg51eHwDAc8zMi/KYOnWqsrOzdd1116l69eoqLCzUCy+8oAceeKDU+fPz85Wfn29/zkVrAcBzzMyI1NRU9enTx/48NjZWkjRs2DAtX75cGRkZDtepunDhgp588kmdOHFCNWrUUOvWrfXRRx/xRwwA8AKnm1LFmjZtKsMw1Lx5c/n5uTZM//791b9//1JfMwxDCQkJeuqpp3TXXXdJkhITExUeHq6VK1fq8ccfd7V0AIAHmZEX5bFq1Sq9/fbbWrlypVq3bq309HRNnDhRkZGRGjZsWIn54+PjNXPmTLfVAwC4MjMyIiYmRoZhlPn68uXLHZ5PmTJFU6ZMcWldAABzOf3Jn5ubq3HjxikxMVGSdOjQITVr1kzjx49XZGSkpk2bZkphR44cUWZmpvr162efFhgYqN69e2vHjh1lNqX4y7d1zPvkoHLyCkwdM379t2oYHKgPxvU0dVwA5vNUXhSbPHmypk2bZr8WSdu2bXX06FHFx8eX2pSKi4uz/zVdupQX3E0JADzD0xkBALAmp68pFRcXpz17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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# if we select sample with higher snr and i-band magnitude limit:\n", "# compute snr:\n",