PycWB 0.30.1__tar.gz → 0.30.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pycwb-0.30.1 → pycwb-0.30.2}/PKG-INFO +1 -1
- {pycwb-0.30.1 → pycwb-0.30.2}/PycWB.egg-info/PKG-INFO +1 -1
- {pycwb-0.30.1 → pycwb-0.30.2}/PycWB.egg-info/SOURCES.txt +2 -0
- pycwb-0.30.2/examples/injection_with_coordinate_system/injection_module_test.ipynb +317 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/_version.py +3 -3
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/injection/injection.py +32 -16
- pycwb-0.30.2/pycwb/modules/injection/scripts/injection_module_test.ipynb +405 -0
- pycwb-0.30.2/pycwb/modules/injection/scripts/injection_parameters.py +39 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/injection/sky_distribution.py +69 -54
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/job_segment/job_segment.py +1 -1
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/read_data/mdc.py +22 -7
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/report/read_results.py +16 -16
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/types/network_event.py +33 -0
- pycwb-0.30.2/pycwb/utils/skymap_coord.py +71 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/workflow/batch.py +1 -0
- pycwb-0.30.1/pycwb/modules/injection/scripts/injection_module_test.ipynb +0 -207
- pycwb-0.30.1/pycwb/utils/skymap_coord.py +0 -15
- {pycwb-0.30.1 → pycwb-0.30.2}/.gitignore +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/.gitlab-ci.yml +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/.readthedocs.yaml +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/LICENSE +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/MANIFEST.in +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/Makefile +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/PycWB.egg-info/dependency_links.txt +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/PycWB.egg-info/requires.txt +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/PycWB.egg-info/top_level.txt +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/README.md +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/benchmark/README.md +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/benchmark/io_performance/README.md +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/benchmark/io_performance/data_gen.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/benchmark/io_performance/parquet_perf.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/benchmark/io_performance/parquet_read_perf.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/benchmark/io_performance/read_pref.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/benchmark/likelihood/README.md +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/benchmark/likelihood/data_generator.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/benchmark/likelihood/perf_cuda.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/benchmark/likelihood/performance_test_dpf.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/benchmark/likelihood/performance_test_opt_sky.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/benchmark/likelihood/user_parameters_injection.yaml +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/benchmark/supercluster/README.md +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/benchmark/supercluster/generate_data.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/benchmark/supercluster/generate_data_2.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/benchmark/supercluster/performance_supercluster.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/benchmark/supercluster/user_parameters_injection.yaml +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/bin/pycwb +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/bin/pycwb_search +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/bin/pycwb_show +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/Biorthogonal.cc +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/Biorthogonal.hh +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/CMakeLists.txt +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/Daubechies.cc +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/Daubechies.hh +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/FourierCoefficients.icc +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/Haar.cc +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/Haar.hh +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/LineFilter.cc +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/LineFilter.hh +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/Makefile +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/Meyer.cc +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/Meyer.hh +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/Symlet.cc +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/Symlet.hh +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/SymmArray.cc +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/SymmArray.hh +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/SymmArraySSE.cc +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/SymmArraySSE.hh +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/SymmObjArray.cc +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/SymmObjArray.hh +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/WDM.cc +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/WDM.hh +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/WDMOverlap.cc +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/WDMOverlap.hh +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/WaveDWT.cc +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/WaveDWT.hh +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/Wavelet.cc +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/Wavelet.hh +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/alm.hh +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/build.sh +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/cluster.cc +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/cluster.hh +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/cmake/FindHealpix.cmake +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/cmake/FindeBBH.cmake +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/cmake/install_function.cmake +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/constants.hh +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/detector.cc +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/detector.hh +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/injection.cc +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/injection.hh +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/lossy.cc +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/lossy.hh +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/monster.cc +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/monster.hh +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/netcluster.cc +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/netcluster.hh +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/netevent.cc +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/netevent.hh +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/netpixel.cc +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/netpixel.hh +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/network.cc +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/network.hh +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/pycwb.hh +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/rdfr.cc +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/rdfr.hh +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/readframe.cc +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/readframe.hh +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/readfrfile.cc +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/readfrfile.hh +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/regression.cc +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/regression.hh +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/skycoord.hh +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/skymap.cc +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/skymap.hh +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/sseries.cc +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/sseries.hh +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/time.cc +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/time.hh +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/wat.hh +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/watasm.S +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/watasm_elf64.o +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/watavx.hh +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/watbranch.in +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/watfun.hh +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/wathash.in +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/watplot.cc +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/watplot.hh +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/watsse.hh +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/wattag.in +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/waturl.in +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/watversion.hh.in +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/wavearray.cc +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/wavearray.hh +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/wavecomplex.cc +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/wavecomplex.hh +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/wavecor.cc +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/wavecor.hh +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/wavefft.cc +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/wavefft.hh +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/wavelet_LinkDef.h +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/wavelinefilter.cc +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/wavelinefilter.hh +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/waverdc.cc +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/waverdc.hh +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/wseries.cc +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/wseries.hh +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/cwb-core/wslice.hh +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/docs/0.installation_guide.md +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/docs/1.initialisation_guide.md +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/docs/2.test_interactive_multistages_2G_analysis.md +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/docs/3.run_pycwb_with_yaml_config.md +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/docs/4.py_cwb_inet_2G.md +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/docs/5.cwb2G_analyse.md +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/docs/6.wat_codes_notes.md +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/docs/Makefile +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/docs/diagram.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/docs/make.bat +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/docs/source/_static/.keep +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/docs/source/_templates/.keep +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/docs/source/conf.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/docs/source/credit.rst +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/docs/source/index.rst +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/docs/source/install.rst +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/docs/source/mod_cwb.rst +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/docs/source/package.rst +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/docs/source/schema.rst +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/docs/source/tutorial_batch_inj.rst +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/docs/source/tutorial_customized_wf_gen.rst +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/docs/source/tutorial_injection.rst +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/docs/source/tutorial_multi_injection.rst +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/docs/source/tutorial_search.rst +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/docs/source/tutorials.rst +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/docs/source/workflow.png +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/envs/Dockerfile +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/envs/environment.yml +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/envs/mamba/Dockerfile +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/GW190521_search/README.md +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/GW190521_search/user_parameters.yaml +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/autoencoder/pycwb_injection.ipynb +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/autoencoder/user_parameters_injection.yaml +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/batch_injection/generate_parameters.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/batch_injection/pycbc_inject/hyperbolicTD/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/batch_injection/pycbc_inject/hyperbolicTD/parameters.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/batch_injection/pycbc_inject/hyperbolicTD/waveform.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/batch_injection/pycwb_injection.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/batch_injection/user_parameters_injection.yaml +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/benchmark/DQ/H1_cat0.txt +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/benchmark/DQ/H1_cat1.txt +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/benchmark/DQ/H1_cat2.txt +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/benchmark/DQ/H1_cat4.txt +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/benchmark/DQ/L1_cat0.txt +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/benchmark/DQ/L1_cat1.txt +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/benchmark/DQ/L1_cat2.txt +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/benchmark/DQ/L1_cat4.txt +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/benchmark/input/OPBM.period +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/benchmark/input/OPBM_H1.frames +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/benchmark/input/OPBM_L1.frames +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/benchmark/pycwb_mdc.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/benchmark/user_parameters_mdc.yaml +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/colab/notebook_updated/pycWB_GW150914_VScode_adapted.ipynb +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/colab/pycWB_GW150914.ipynb +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/data_injection/README.md +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/data_injection/injection_parameters.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/data_injection/user_parameters.yaml +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/gwosc/user_parameters.yaml +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/injection/pycwb_injection.ipynb +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/injection/user_parameters_injection.yaml +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/injection/wdmXTalk/OverlapCatalog16-1024.bin +0 -0
- {pycwb-0.30.1/pycwb/modules/injection/scripts → pycwb-0.30.2/examples/injection_with_coordinate_system}/injection_parameters.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/lvk_sep_2023/demo.ipynb +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/lvk_sep_2023/user_parameters.yaml +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/multiple_injection/pycwb_injection.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/multiple_injection/user_parameters_injection.yaml +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/new_injection_infra_with_LHV/README.md +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/new_injection_infra_with_LHV/analyze_events.ipynb +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/new_injection_infra_with_LHV/injection_parameters.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/new_injection_infra_with_LHV/input/LIGO_zero_det_HP.txt +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/new_injection_infra_with_LHV/input/aligo_O4high.txt +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/new_injection_infra_with_LHV/input/avirgo_O4high_NEW.txt +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/new_injection_infra_with_LHV/user_parameters.yaml +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/new_injection_infra_with_gaussian_noise/README.md +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/new_injection_infra_with_gaussian_noise/injection_parameters.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/new_injection_infra_with_gaussian_noise/user_parameters.yaml +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/new_injection_infra_with_real_data/README.md +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/new_injection_infra_with_real_data/injection_parameters.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/new_injection_infra_with_real_data/user_parameters.yaml +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/new_injection_infra_with_sky_patch/README.md +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/new_injection_infra_with_sky_patch/analyze_events.ipynb +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/new_injection_infra_with_sky_patch/injection_parameters.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/new_injection_infra_with_sky_patch/input/aligo_O4high.txt +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/new_injection_infra_with_sky_patch/user_parameters.yaml +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/pyseobnr_injection/generate_parameters.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/pyseobnr_injection/user_parameters_injection.yaml +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/pyseobnr_injection/waveform_model/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/pyseobnr_injection/waveform_model/waveform.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/sine_gaussian_injection/README.md +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/sine_gaussian_injection/injection_parameters.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/sine_gaussian_injection/user_parameters.yaml +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/waveform_reconstruction/reconstruct_waveform_from_cluster.ipynb +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/white_noise_burst_injection/README.md +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/white_noise_burst_injection/injection_parameters.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/examples/white_noise_burst_injection/user_parameters.yaml +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/prototypes/cwb_core/coherence.cc +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/prototypes/cwb_core/coherence.hh +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/prototypes/cwb_core/likelihood.cc +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/prototypes/cwb_core/likelihood.hh +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/prototypes/dag/dag.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/prototypes/dag/dask-prefect.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/prototypes/dag/prefect_test.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/prototypes/messenger/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/prototypes/messenger/server.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/prototypes/messenger/visualizition.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/prototypes/messenger-web-interface/.eslintrc.cjs +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/prototypes/messenger-web-interface/.gitignore +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/prototypes/messenger-web-interface/.prettierrc.json +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/prototypes/messenger-web-interface/README.md +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/prototypes/messenger-web-interface/index.html +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/prototypes/messenger-web-interface/package-lock.json +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/prototypes/messenger-web-interface/package.json +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/prototypes/messenger-web-interface/public/favicon.ico +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/prototypes/messenger-web-interface/src/App.vue +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/prototypes/messenger-web-interface/src/assets/base.css +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/prototypes/messenger-web-interface/src/assets/cwb_icon_modern_blue_alfa.png +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/prototypes/messenger-web-interface/src/assets/main.css +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/prototypes/messenger-web-interface/src/assets/style.css +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/prototypes/messenger-web-interface/src/components/HelloWorld.vue +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/prototypes/messenger-web-interface/src/components/TheWelcome.vue +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/prototypes/messenger-web-interface/src/components/WelcomeItem.vue +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/prototypes/messenger-web-interface/src/components/__tests__/HelloWorld.spec.js +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/prototypes/messenger-web-interface/src/components/icons/IconCommunity.vue +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/prototypes/messenger-web-interface/src/components/icons/IconDocumentation.vue +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/prototypes/messenger-web-interface/src/components/icons/IconEcosystem.vue +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/prototypes/messenger-web-interface/src/components/icons/IconSupport.vue +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/prototypes/messenger-web-interface/src/components/icons/IconTooling.vue +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/prototypes/messenger-web-interface/src/main.js +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/prototypes/messenger-web-interface/src/router/index.js +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/prototypes/messenger-web-interface/src/stores/counter.js +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/prototypes/messenger-web-interface/src/views/drawflow.vue +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/prototypes/messenger-web-interface/src/views/nodes/node1.vue +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/prototypes/messenger-web-interface/src/views/nodes/node2.vue +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/prototypes/messenger-web-interface/src/views/nodes/node3.vue +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/prototypes/messenger-web-interface/src/views/nodes/nodeHeader.vue +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/prototypes/messenger-web-interface/vite.config.js +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/prototypes/performance/numba_test.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/prototypes/performance/taichi_test.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/prototypes/pp_workflow/simple.yaml +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/prototypes/pp_workflow/simple_module.yaml +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/prototypes/pp_workflow/workflow.yaml +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/prototypes/search.yaml +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/cli/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/cli/batch_runner.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/cli/batch_setup.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/cli/flow.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/cli/get_external_modules.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/cli/gwosc.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/cli/gwosc_data.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/cli/merge_catalog.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/cli/post_process.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/cli/run.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/cli/server.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/cli/xtalk.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/config/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/config/config.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/constants/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/constants/detectors.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/constants/physics_constants.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/constants/project_constants.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/constants/user_parameters_schema.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/autoencoder/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/autoencoder/autoencoder.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/autoencoder/cwb_autoencoder.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/autoencoder/module.yaml +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/catalog/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/catalog/catalog.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/catalog/module.yaml +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/coherence/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/coherence/coherence.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/coherence/coherence_lite.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/coherence/module.yaml +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/condor/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/condor/condor.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/condor/module.yaml +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/cwb_conversions/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/cwb_conversions/cluster.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/cwb_conversions/detector.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/cwb_conversions/module.yaml +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/cwb_conversions/pixel.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/cwb_conversions/series.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/cwb_conversions/sparse_series.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/cwb_xgboost/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/cwb_xgboost/config.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/cwb_xgboost/cwb_xgboost.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/cwb_xgboost/module.yaml +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/cwb_xgboost/prediction.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/cwb_xgboost/read_data.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/cwb_xgboost/training.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/cwb_xgboost/utils.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/data_conditioning/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/data_conditioning/data_conditioning.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/data_conditioning/module.yaml +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/data_conditioning/regression.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/data_conditioning/whitening_cwb.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/data_conditioning/whitening_mesa.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/energy_threshold/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/energy_threshold/threshold.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/external_module_manager/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/external_module_manager/config_schema.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/external_module_manager/manager.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/external_module_manager/test/sample_config.yaml +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/external_module_manager/test/test.ipynb +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/gracedb/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/gracedb/gracedb.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/gracedb/module.yaml +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/gracedb/test_gracedb.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/gwosc/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/gwosc/gwosc.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/gwosc/utils.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/injection/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/injection/distribution_utils.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/injection/inj_generators.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/injection/module.yaml +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/injection/par_generator.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/injection/tests/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/injection/tests/test_injection.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/injection/wf_generator.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/job_segment/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/job_segment/dq_segment.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/job_segment/frame.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/job_segment/module.yaml +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/job_segment/plots.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/job_segment/super_lag.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/job_segment/test_job_segment.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/likelihood/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/likelihood/likelihood.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/likelihood/module.yaml +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/likelihoodWP/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/likelihoodWP/dpf.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/likelihoodWP/dpf_cython.pyx +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/likelihoodWP/likelihood.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/likelihoodWP/sky_stat.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/likelihoodWP/typing.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/likelihoodWP/utils.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/logger/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/logger/logger.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/logger/module.yaml +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/multi_resolution_wdm/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/multi_resolution_wdm/module.yaml +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/multi_resolution_wdm/wdm.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/plot/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/plot/cluster_statistics.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/plot/event.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/plot/module.yaml +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/plot/spectrogram.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/plot/waveform.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/plot_data_quality/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/plot_data_quality/module.yaml +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/plot_data_quality/plot.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/plot_map/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/plot_map/module.yaml +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/plot_map/world_map.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/qveto/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/qveto/qveto.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/qveto/qveto_ext.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/qveto/utils.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/read_data/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/read_data/data_check.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/read_data/data_find.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/read_data/module.yaml +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/read_data/read_data.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/read_data/tests/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/read_data/tests/test_mdc.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/reconstruction/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/reconstruction/getMRAwaveform.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/reconstruction/module.yaml +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/report/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/report/continues_poisson.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/report/far_rho.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/report/report.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/slurm/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/slurm/module.yaml +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/slurm/slurm.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/sparse_series/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/sparse_series/module.yaml +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/sparse_series/sparse_table.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/statistics/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/statistics/eff.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/statistics/eff_plot.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/statistics/merge.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/statistics/sigmoid_fit.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/super_cluster/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/super_cluster/module.yaml +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/super_cluster/sub_net_cut.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/super_cluster/super_cluster.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/super_cluster/supercluster.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/super_cluster/utils.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/supercluster_naive/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/supercluster_naive/supercluster2.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/superlag/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/superlag/module.yaml +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/superlag/superlag.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/web_viewer/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/web_viewer/create.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/web_viewer/module.yaml +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/workflow_utils/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/workflow_utils/job_setup.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/xtalk/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/xtalk/monster.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/xtalk/monster_old.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/xtalk/type.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/modules/xtalk/xtalk_data.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/post_production/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/post_production/workflow.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/prefect_flow/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/prefect_flow/pycwb_flow.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/prefect_flow/tasks/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/prefect_flow/tasks/builtin.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/types/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/types/data_quality_file.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/types/detector.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/types/job.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/types/network.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/types/network_cluster.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/types/network_pixel.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/types/sparse_series.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/types/time_frequency_series.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/types/time_series.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/types/wdm.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/types/wdm_xtalk.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/utils/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/utils/async_write.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/utils/check_ROOT.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/utils/conversions/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/utils/conversions/timeseries.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/utils/dataclass_object_io.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/utils/dep_check.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/utils/generate_params_table.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/utils/image.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/utils/module.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/utils/network.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/utils/parser.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/utils/yaml_helper.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/vendor/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/vendor/autoencoder/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/vendor/autoencoder/cwb_autoencoder.h5 +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/vendor/example.yaml +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/vendor/lib/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/vendor/template/gwosc/user_parameters.yaml +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/vendor/web_viewer/event_dump.html +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/vendor/web_viewer/styles.css +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/vendor/web_viewer/viewer.html +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/workflow/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/workflow/merge.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/workflow/run.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/workflow/subflow/__init__.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/workflow/subflow/fake_processor.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/workflow/subflow/postprocess_and_plots.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/workflow/subflow/prepare_job_runs.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pycwb/workflow/subflow/process_job_segment.py +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/pyproject.toml +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/setup.cfg +0 -0
- {pycwb-0.30.1 → pycwb-0.30.2}/setup.py +0 -0
|
@@ -191,6 +191,8 @@ examples/gwosc/user_parameters.yaml
|
|
|
191
191
|
examples/injection/pycwb_injection.ipynb
|
|
192
192
|
examples/injection/user_parameters_injection.yaml
|
|
193
193
|
examples/injection/wdmXTalk/OverlapCatalog16-1024.bin
|
|
194
|
+
examples/injection_with_coordinate_system/injection_module_test.ipynb
|
|
195
|
+
examples/injection_with_coordinate_system/injection_parameters.py
|
|
194
196
|
examples/lvk_sep_2023/demo.ipynb
|
|
195
197
|
examples/lvk_sep_2023/user_parameters.yaml
|
|
196
198
|
examples/multiple_injection/pycwb_injection.py
|
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
{
|
|
2
|
+
"cells": [
|
|
3
|
+
{
|
|
4
|
+
"cell_type": "code",
|
|
5
|
+
"execution_count": 1,
|
|
6
|
+
"metadata": {},
|
|
7
|
+
"outputs": [
|
|
8
|
+
{
|
|
9
|
+
"name": "stdout",
|
|
10
|
+
"output_type": "stream",
|
|
11
|
+
"text": [
|
|
12
|
+
"Welcome to JupyROOT 6.26/10\n",
|
|
13
|
+
"Loading wavelet library\n",
|
|
14
|
+
"Trying to load wavelet library from /home/alessandro.martini/.conda/envs/pycwb_test/lib/python3.11/site-packages/lib/wavelet.so\n",
|
|
15
|
+
"Version used for this test: 0.30.2.dev23+ge1b92b0\n"
|
|
16
|
+
]
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"name": "stderr",
|
|
20
|
+
"output_type": "stream",
|
|
21
|
+
"text": [
|
|
22
|
+
"\n",
|
|
23
|
+
"WARNING: version mismatch between CFITSIO header (v4.000999999999999) and linked library (v4.01).\n",
|
|
24
|
+
"\n"
|
|
25
|
+
]
|
|
26
|
+
}
|
|
27
|
+
],
|
|
28
|
+
"source": [
|
|
29
|
+
"# add current directory to path\n",
|
|
30
|
+
"import sys\n",
|
|
31
|
+
"sys.path.insert(0, '..')\n",
|
|
32
|
+
"\n",
|
|
33
|
+
"import pycwb\n",
|
|
34
|
+
"\n",
|
|
35
|
+
"print(\"Version used for this test: %s\" % pycwb.__version__)"
|
|
36
|
+
]
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"cell_type": "code",
|
|
40
|
+
"execution_count": 12,
|
|
41
|
+
"metadata": {},
|
|
42
|
+
"outputs": [
|
|
43
|
+
{
|
|
44
|
+
"name": "stdout",
|
|
45
|
+
"output_type": "stream",
|
|
46
|
+
"text": [
|
|
47
|
+
"25-11-19 15:50:31 - logger_init - INFO - Logging initialized\n",
|
|
48
|
+
"25-11-19 15:50:31 - logger_init - INFO - Logging level: INFO\n",
|
|
49
|
+
"25-11-19 15:50:31 - logger_init - INFO - Logging file: None\n",
|
|
50
|
+
"Repeat injection: 10\n",
|
|
51
|
+
"Rate: 0.005\n",
|
|
52
|
+
"Jitter: 50\n",
|
|
53
|
+
"Sky distribution: {'type': 'Fixed', 'coordinates': {'unit': 'deg', 'phi': -110, 'theta': 50}}\n",
|
|
54
|
+
"25-11-19 15:50:31 - import_function - INFO - Successfully imported function 'get_injection_parameters' from 'injection_parameters.py'\n",
|
|
55
|
+
"25-11-19 15:50:31 - get_injection_list_from_parameters - INFO - 6400 injection parameters generated\n",
|
|
56
|
+
"Number of injections: 6400\n",
|
|
57
|
+
"Number of injections after repeat: 64000\n",
|
|
58
|
+
"25-11-19 15:50:31 - distribute_inj_in_gps_time_by_rate - INFO - Distributing 64000 injections in 10800 s with rate 0.005 and jitter 50\n",
|
|
59
|
+
"25-11-19 15:50:31 - distribute_inj_in_gps_time_by_rate - INFO - Using 1186 data repeats to distribute 64000 injections, each trail contains 54 injections\n"
|
|
60
|
+
]
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"data": {
|
|
64
|
+
"image/png": "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",
|
|
65
|
+
"text/plain": [
|
|
66
|
+
"<Figure size 400x400 with 1 Axes>"
|
|
67
|
+
]
|
|
68
|
+
},
|
|
69
|
+
"metadata": {},
|
|
70
|
+
"output_type": "display_data"
|
|
71
|
+
}
|
|
72
|
+
],
|
|
73
|
+
"source": [
|
|
74
|
+
"from pycwb.config import Config\n",
|
|
75
|
+
"from pycwb.modules.logger import logger_init\n",
|
|
76
|
+
"from pycwb.modules.injection.par_generator import get_injection_list_from_parameters, repeat\n",
|
|
77
|
+
"from pycwb.modules.injection.sky_distribution import generate_sky_distribution, distribute_injections_on_sky\n",
|
|
78
|
+
"from pycwb.modules.injection.injection import distribute_inj_in_gps_time_by_rate\n",
|
|
79
|
+
"from math import ceil\n",
|
|
80
|
+
"import numpy as np\n",
|
|
81
|
+
"\n",
|
|
82
|
+
"logger_init()\n",
|
|
83
|
+
"\n",
|
|
84
|
+
"injection = {\n",
|
|
85
|
+
" 'rate': '1/200',\n",
|
|
86
|
+
" 'jitter': 50,\n",
|
|
87
|
+
" 'allow_reuse_data': True,\n",
|
|
88
|
+
" 'repeat_injection': 10,\n",
|
|
89
|
+
" 'sky_distribution': {\n",
|
|
90
|
+
" 'type': 'Fixed',\n",
|
|
91
|
+
" 'coordinates': {\n",
|
|
92
|
+
" 'unit': 'deg',\n",
|
|
93
|
+
" 'phi': -110,\n",
|
|
94
|
+
" 'theta': 50\n",
|
|
95
|
+
" }\n",
|
|
96
|
+
" },\n",
|
|
97
|
+
" 'parameters_from_python': {\n",
|
|
98
|
+
" 'function': 'injection_parameters.py.get_injection_parameters',\n",
|
|
99
|
+
" },\n",
|
|
100
|
+
" 'approximant': 'Ringdown',\n",
|
|
101
|
+
" 'generator': {\n",
|
|
102
|
+
" 'module': './input/waveform.py', \n",
|
|
103
|
+
" 'function': 'get_td_waveform'\n",
|
|
104
|
+
" }\n",
|
|
105
|
+
"}\n",
|
|
106
|
+
"\n",
|
|
107
|
+
"\n",
|
|
108
|
+
"repeat_injection = injection['repeat_injection']\n",
|
|
109
|
+
"rate = eval(injection['rate'])\n",
|
|
110
|
+
"jitter = injection['jitter']\n",
|
|
111
|
+
"sky_distribution = injection['sky_distribution']\n",
|
|
112
|
+
"\n",
|
|
113
|
+
"print(f\"Repeat injection: {repeat_injection}\")\n",
|
|
114
|
+
"print(f\"Rate: {rate}\")\n",
|
|
115
|
+
"print(f\"Jitter: {jitter}\")\n",
|
|
116
|
+
"print(f\"Sky distribution: {sky_distribution}\")\n",
|
|
117
|
+
"\n",
|
|
118
|
+
"total_live_time = 3600 * 3 \n",
|
|
119
|
+
"start_gps_time = 1262304000\n",
|
|
120
|
+
"end_gps_time = start_gps_time + total_live_time\n",
|
|
121
|
+
"injections = get_injection_list_from_parameters(injection)\n",
|
|
122
|
+
"print(f\"Number of injections: {len(injections)}\")\n",
|
|
123
|
+
"injections = repeat(injections, repeat_injection)\n",
|
|
124
|
+
"print(f\"Number of injections after repeat: {len(injections)}\")\n",
|
|
125
|
+
"\n",
|
|
126
|
+
"\n",
|
|
127
|
+
"%matplotlib inline\n",
|
|
128
|
+
"import matplotlib.pyplot as plt\n",
|
|
129
|
+
"\n",
|
|
130
|
+
"distribute_inj_in_gps_time_by_rate(injections, rate, jitter, start_gps_time, end_gps_time, shuffle=False)\n",
|
|
131
|
+
"\n",
|
|
132
|
+
"plt.figure(figsize=(4, 4))\n",
|
|
133
|
+
"plt.plot([inj['gps_time'] for inj in injections], [inj['trail_idx'] for inj in injections], 'o')\n",
|
|
134
|
+
"plt.xlim(start_gps_time, end_gps_time)\n",
|
|
135
|
+
"plt.show()"
|
|
136
|
+
]
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
"cell_type": "markdown",
|
|
140
|
+
"metadata": {},
|
|
141
|
+
"source": [
|
|
142
|
+
"## Patch sky distribution"
|
|
143
|
+
]
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
"cell_type": "code",
|
|
147
|
+
"execution_count": 16,
|
|
148
|
+
"metadata": {},
|
|
149
|
+
"outputs": [
|
|
150
|
+
{
|
|
151
|
+
"name": "stdout",
|
|
152
|
+
"output_type": "stream",
|
|
153
|
+
"text": [
|
|
154
|
+
"25-11-19 15:52:14 - generate_sky_distribution - INFO - Generating sky distribution of type: Patch with 64000 samples\n",
|
|
155
|
+
"25-11-19 15:52:14 - generate_sky_distribution - INFO - Generating points in a small circular patch around a center RA/Dec\n",
|
|
156
|
+
"25-11-19 15:52:14 - generate_sky_distribution - INFO - Patch generation uses degree internally, and will return RA/Dec in radians for injection.\n",
|
|
157
|
+
"25-11-19 15:52:14 - generate_sky_distribution - INFO - Center Phi: 45 degrees, Center Theta: 45 degrees, Radius: 10 degrees\n",
|
|
158
|
+
"25-11-19 15:52:14 - generate_sky_distribution - INFO - Generating points in a small circular patch around a center Phi/Theta\n",
|
|
159
|
+
"Number of sky locations: 64000\n",
|
|
160
|
+
"25-11-19 15:52:14 - distribute_injections_on_sky - INFO - Distributing 64000 injections on sky locations with coordsys: geo\n",
|
|
161
|
+
"Number of injections after sky distribution: 64000\n"
|
|
162
|
+
]
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
"data": {
|
|
166
|
+
"image/png": "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5NO2bVuEhoZi69atMJlMUCqVlvcee+wxjBkzBlOmTMHVq1dvepyJEydi7dq1+Otf/4pBgwbh6NGjePTRR1FWVmZTnEajEY888ggmTZqEV199Fdu3b8c//vEP6HQ6vPnmm5b1Tp48ieeeew7t2rUDUFMUvvTSSygoKLBazxY//fQTjEYjRo4cadP6586dQ3h4OCorK/GPf/wD7du3x7fffosZM2YgNzfX0rWgvLwcAwcORG5uLhISEhASEoIdO3YgMTERBw4cqJWg169fjx07duDNN99EQEAA/Pz8cPToUQwePBjt27fHypUr4e3tjaSkJHz22Wc2n9+SJUvQuXNnSx+xN954Aw8//DBOnDgBnU4HoObz7NSpE8aMGYNmzZqhqKgIycnJuO+++3D06FG0aNECMTExePfdd/H3v/8dS5YsQa9evQDA8gdQSkoKxo8fjxEjRmDVqlVQqVT4v//7P0RHRyMtLQ2DBw8GAIwbNw6//PIL3nnnHXTs2BElJSX45ZdfcOHCBZvPichZTCYTtm7ditDQULRt29ambd599128/vrrmDhxIl5//XVUVlbi/fffR//+/bF3795b3o2xdduHH34YJpMJ8+fPR7t27XD+/Hns3r0bJSUlAIB169Zh1KhR0Ol0lpxUV7FuVlhYiObNm2PevHlo2bIlLl68iFWrVqFv377Izs5Gp06dbPzEamzZsgVKpRLDhw+3af3PPvsMTz31FKKiopCamoqKigrMnz8fkZGR+PHHH3H//fcDALZt24aHHnoIISEhWL58OdRqNZKSkjB8+HCkpqYiNjbWar/PPPMMYmJi8J///AdXr16FSqVCQkICEhISMGnSJIwaNQqnTp3CX/7yF5hMJpvP8/HHH0dsbCwmTZqE//73v5g1axYAYMWKFZZ1cnNzMXbsWHTo0AFeXl44ePAg3nnnHfy///f/LOslJSXh2WefRW5ubq0uMdXV1RgxYgR27NiBv/71rwgPD0deXh7mzJmDyMhI7N+/H1qtFidPnkRMTAz69++PFStWwNfXFwUFBdi8eTMqKyvh7e1t0znJjiC3VFxcLACIMWPG3HK92NhYAUCcOXNGCCHEnDlzBADx5ptv1lrX/J7ZkSNHBADxt7/9zWq91NRUAUA8/fTTlmU//fSTACB++ukny7Knn35aABCff/651fYPP/yw6NSp001jNplM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clYeZQvvdSorK5GVlYWoqCir5VFRUdi9e7dEUclfaWkpAKBZs2YSRyI/L7zwAmJiYvDggw9KHYosbdiwAb1798YTTzwBPz8/9OzZE5988onUYUmKeVQazKOOwzzqWM7Koyx4r3P+/HmYTCb4+/tbLff390dxcbFEUcmbEALTp0/H/fffj+DgYKnDkZU1a9bgl19+YYuaAx0/fhzJycm45557kJaWhilTpmDq1Kn49NNPpQ5NMsyjzsc86jjMo47nrDzqade9yYRCobD6WQhRaxnZx4svvohDhw5h586dUociK6dOncLLL7+MLVu2QKPRSB2ObFVXV6N379549913AQA9e/bEkSNHkJycjPHjx0scnbSYR52HedQxmEedw1l5lC2812nRogWUSmWtVoizZ8/Waq2gu/fSSy9hw4YN+Omnn9CmTRupw5GVrKwsnD17FqGhofD09ISnpye2bduGDz/8EJ6enjCZTFKHKAutWrVC165drZZ16dLFrR/OYh51LuZRx2EedQ5n5VEWvNfx8vJCaGgo0tPTrZanp6cjPDxcoqjkRwiBF198EV9//TW2bt2KDh06SB2S7AwePBj//e9/ceDAAcurd+/eeOqpp3DgwAEolUqpQ5SFiIiIWkNB/fbbb9Dr9RJFJD3mUedgHnU85lHncFYeZZeGG0yfPh3jxo1D79690a9fPyxduhT5+fmYMmWK1KHJxgsvvIDPPvsM33zzDZo0aWJpCdLpdNBqtRJHJw9NmjSp1ZevUaNGaN68Ofv42dErr7yC8PBwvPvuuxg9ejT27t2LpUuXYunSpVKHJinmUcdjHnU85lHncFoeFVTLkiVLhF6vF15eXqJXr15i27ZtUockKwDqfP373/+WOjRZe+CBB8TLL78sdRiys3HjRhEcHCzUarXo3LmzWLp0qdQhuQTmUcdiHpUG86hjOCOPchxeIiIiIpI19uElIiIiIlljwUtEREREssaCl4iIiIhkjQUvEREREckaC14iIiIikjUWvEREREQkayx4iYiIiEjWWPASERERkayx4CW6SxkZGVAoFCgpKbnpOm+99Rbuvfdep8VEREREf2DBS2SDCRMmQKFQQKFQQKVS4U9/+hNmzJiBq1ev2rT9jBkz8OOPPzo4SiIi13Z9LvX09ES7du0QHx+PS5cuWa1nMBjQtGlTNGvWDAaDQaJoSU5Y8BLZaMiQISgqKsLx48cxd+5cJCUlYcaMGTZt27hxYzRv3tzBERIRuT5zLj158iSWLVuGjRs34vnnn7da56uvvkJwcDC6du2Kr7/+WqJISU5Y8BLZSK1WIyAgAG3btsXYsWPx1FNPYf369Zb3s7Ky0Lt3b3h7eyM8PBw5OTmW99ilgYiohjmXtmnTBlFRUYiNjcWWLVus1lm+fDni4uIQFxeH5cuXSxQpyQkLXqI7pNVqYTQaLT/Pnj0bH3zwAfbv3w9PT08888wzEkZHROT6jh8/js2bN0OlUlmW5ebmYs+ePRg9ejRGjx6N3bt34/jx4xJGSXLAgpfoDuzduxefffYZBg8ebFn2zjvv4IEHHkDXrl0xc+ZM7N69G+Xl5RJGSUTker799ls0btwYWq0WQUFBOHr0KP72t79Z3l+xYgWGDh1q6cM7ZMgQrFixQsKISQ5Y8BLZyJykNRoN+vXrhwEDBuCjjz6yvB8SEmL5d6tWrQAAZ8+edXqcRESubODAgThw4AB+/vlnvPTSS4iOjsZLL70EADCZTFi1ahXi4uIs68fFxWHVqlUwmUxShUwywIKXyEbmJJ2Tk4Py8nJ8/fXX8PPzs7x//S05hUIBAKiurnZ6nERErqxRo0b485//jJCQEHz44YeoqKhAQkICACAtLQ0FBQWIjY2Fp6cnPD09MWbMGJw+fbpWP1+i+mDBS2Qjc5LW6/VWxS0REd25OXPmYMGCBSgsLMTy5csxZswYHDhwwOr11FNP8eE1uiueUgdARERE7isyMhLdunXDO++8g40bN2LDhg0IDg62Wufpp59GTEwMzp07h5YtW0oUKTVkbOElIiIiSU2fPh1Lly6F0Wi0ehjYbODAgWjSpAn+85//SBAdyYFCCCGkDoKIiIiIyFHYwktEREREssaCl4iIiIhkjQUvEREREckaC14iIiIikjUWvEREREQkayx4iYiIiEjWWPASERERkayx4CUiIiIiWWPBS0RERESyxoKXiIiIiGSNBS8RERERydr/B6XSlAdcpl2GAAAAAElFTkSuQmCC",
|
|
167
|
+
"text/plain": [
|
|
168
|
+
"<Figure size 800x400 with 2 Axes>"
|
|
169
|
+
]
|
|
170
|
+
},
|
|
171
|
+
"metadata": {},
|
|
172
|
+
"output_type": "display_data"
|
|
173
|
+
}
|
|
174
|
+
],
|
|
175
|
+
"source": [
|
|
176
|
+
"%matplotlib inline\n",
|
|
177
|
+
"from pycwb.utils.skymap_coord import convert_to_celestial_coordinates\n",
|
|
178
|
+
"import matplotlib.pyplot as plt\n",
|
|
179
|
+
"\n",
|
|
180
|
+
"sky_distribution = {\n",
|
|
181
|
+
" 'type': 'Patch',\n",
|
|
182
|
+
" 'coordsys': 'geo', \n",
|
|
183
|
+
" 'patch': {\n",
|
|
184
|
+
" 'unit': 'deg',\n",
|
|
185
|
+
" 'center': {'phi': 45, 'theta': 45},\n",
|
|
186
|
+
" 'radius': 10\n",
|
|
187
|
+
" }\n",
|
|
188
|
+
"}\n",
|
|
189
|
+
"\n",
|
|
190
|
+
"sky_locations = generate_sky_distribution(sky_distribution, len(injections))\n",
|
|
191
|
+
"print(f\"Number of sky locations: {len(sky_locations[0])}\")\n",
|
|
192
|
+
"distribute_injections_on_sky(injections, sky_locations, coordsys=sky_distribution['coordsys'])\n",
|
|
193
|
+
"print(f\"Number of injections after sky distribution: {len(injections)}\")\n",
|
|
194
|
+
"\n",
|
|
195
|
+
"phi = np.array([inj['sky_loc'][0] for inj in injections])\n",
|
|
196
|
+
"theta = np.array([inj['sky_loc'][1] for inj in injections])\n",
|
|
197
|
+
"\n",
|
|
198
|
+
"celestial_coordinates = [convert_to_celestial_coordinates(inj['sky_loc'][0], inj['sky_loc'][1], inj['gps_time'], inj['coordsys']) for inj in injections] \n",
|
|
199
|
+
"\n",
|
|
200
|
+
"ras = np.array([coord[0] for coord in celestial_coordinates])\n",
|
|
201
|
+
"decs = np.array([coord[1] for coord in celestial_coordinates]) \n",
|
|
202
|
+
"\n",
|
|
203
|
+
"# plot sky distribution\n",
|
|
204
|
+
"fig, ax = plt.subplots(1,2, figsize=(8, 4))\n",
|
|
205
|
+
"ax[0].scatter(phi, theta, s=1)\n",
|
|
206
|
+
"ax[1].scatter(ras, decs, s=1) \n",
|
|
207
|
+
"ax[0].set_title('Original Coordinates')\n",
|
|
208
|
+
"ax[0].set_xlabel('Phi')\n",
|
|
209
|
+
"ax[0].set_ylabel('Theta')\n",
|
|
210
|
+
"ax[1].set_title('Celestial Coordinates')\n",
|
|
211
|
+
"ax[1].set_xlabel('RA')\n",
|
|
212
|
+
"ax[1].set_ylabel('Dec')\n",
|
|
213
|
+
"ax[0].set_xlim(0,2*np.pi)\n",
|
|
214
|
+
"ax[1].set_xlim(0,2*np.pi)\n",
|
|
215
|
+
"plt.show()\n"
|
|
216
|
+
]
|
|
217
|
+
},
|
|
218
|
+
{
|
|
219
|
+
"cell_type": "markdown",
|
|
220
|
+
"metadata": {},
|
|
221
|
+
"source": [
|
|
222
|
+
"## Distribute at a Fixed Point"
|
|
223
|
+
]
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
"cell_type": "code",
|
|
227
|
+
"execution_count": 15,
|
|
228
|
+
"metadata": {},
|
|
229
|
+
"outputs": [
|
|
230
|
+
{
|
|
231
|
+
"name": "stdout",
|
|
232
|
+
"output_type": "stream",
|
|
233
|
+
"text": [
|
|
234
|
+
"25-11-19 15:51:47 - generate_sky_distribution - INFO - Generating sky distribution of type: Fixed with 64000 samples\n",
|
|
235
|
+
"25-11-19 15:51:47 - generate_sky_distribution - INFO - Converting phi/theta from degrees to radians\n",
|
|
236
|
+
"Number of sky locations: 64000\n",
|
|
237
|
+
"25-11-19 15:51:47 - distribute_injections_on_sky - INFO - Distributing 64000 injections on sky locations with coordsys: geo\n",
|
|
238
|
+
"Number of injections after sky distribution: 64000\n"
|
|
239
|
+
]
|
|
240
|
+
},
|
|
241
|
+
{
|
|
242
|
+
"data": {
|
|
243
|
+
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAs4AAAGHCAYAAACgU9QVAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/TGe4hAAAACXBIWXMAAA9hAAAPYQGoP6dpAABW3klEQVR4nO3dfVwU5fo/8M+ysMuDQAosoOKKHgUNtIBU8AHFJInMZyVSMbPSsCORpyBStBJMzeycRI+GJidNOkYeTU9KqWShSQT5+CUNETMQRAUfAgTu3x/+2NO4oLPIskif9+s1r9x77pn7ugf22qvZmUEhhBAgIiIiIqI7MjN1AERERERE9wMWzkREREREMrBwJiIiIiKSgYUzEREREZEMLJyJiIiIiGRg4UxEREREJAMLZyIiIiIiGVg4ExERERHJwMKZiIiIiEgGFs7UbA4dOoSJEyfC1dUVKpUKLi4umDBhAg4ePGjQfhYuXAiFQtGkGPbv3w+FQoH9+/c3aXu5hg4diqFDh8rqW1dXh3/961949NFH4ejoCAsLC2g0GjzxxBPYsWMH6urqjBqrIT766CMoFAoUFBTo2gyZa1OdOHECCxculIxL9Gdw5MgRPPPMM3B3d4elpSXatWsHHx8fLF26FJcuXTJ4f/eSP+VISkrCRx99pNdeUFAAhULR4Lq7MXTbCxcuICYmBt7e3mjXrh0sLS3Ro0cPzJ07F6dOnTJ4fGO6PX/ey3EyxObNm7Fy5UqjjvFnZW7qAKht+Mc//oGoqCj069cPS5cuhVarRWFhIVatWoVBgwbh/fffx5w5c2Tta+bMmRg5cmST4vDx8cHBgwfRu3fvJm3f3CorKzFmzBjs2bMHYWFhWL16NVxcXFBaWoovv/wSEydORGpqKkaPHm3qUBuVlJRk9DFOnDiBRYsWYejQoejatavRxyNqDdatW4cXX3wRHh4e+Nvf/obevXvj5s2b+OGHH7BmzRocPHgQn3/+uanDlEhKSoKjoyOmT58uaXd1dcXBgwfRvXt3o45/+PBhPPHEExBCYM6cOfD394dKpUJeXh4+/vhj9OvXD5cvXzZqDPeipY7T5s2bcezYMURFRRl1nD8jFs50z7777jtERUXh8ccfx+effw5z8//9WoWFhWHs2LGYO3cuHn74YQwcOLDR/dy4cQPW1tbo3LkzOnfu3KRY7OzsMGDAgCZtawzR0dHYvXs3Nm7ciGnTpknWjRs3Dn/729/w+++/t1g8QghUVlbCyspK9jat5X9CiNqSgwcPYvbs2RgxYgS2bdsGtVqtWzdixAi88sor+PLLL00YoWHUarXRc29FRQVGjx4NS0tLZGZmSj4nhg4dihdeeAFbt241agy3+/3332FpaSn7LH9LHCcyLl6qQfcsMTERCoUCq1evlhTNAGBubo6kpCQoFAosWbJE117/deKPP/6ICRMmoH379rr/A2/oq8aqqiq88sorcHFxgbW1NYYMGYLs7Gx07dpVcuajoUs1pk+fjnbt2uH06dN4/PHH0a5dO7i5ueGVV15BVVWVZJxFixahf//+6NChA+zs7ODj44Pk5GQIIQw+LsXFxfjwww/x2GOP6RXN9Xr06IE+ffroXhcWFmLKlCnQaDRQq9Xo1asX3n33Xb3LOS5duoQXX3wRnTp1gkqlQrdu3RAXF6c3H4VCgTlz5mDNmjXo1asX1Go1Nm7cCODWpTUDBw6EpaUlOnbsiNjYWNy8eVMvxsa+aly+fDlWrFgBd3d3tGvXDv7+/jh06JBk2x9++AFhYWHo2rUrrKys0LVrVzz11FM4e/asrs9HH32EiRMnAgCGDRsGhUKh91XmV199heHDh8POzg7W1tYYOHAgvv76a8lYpaWleP755+Hm5ga1Wg0nJycMHDgQX331VYPHnsiUEhISoFAosHbtWknRXE+lUuHJJ5+UtKWmpsLf3x82NjZo164dHnvsMeTk5MgaT862+fn5CAsLQ8eOHaFWq+Hs7Izhw4cjNzcXANC1a1ccP34cGRkZuvdp/TdEDV2CcPr0aTzzzDPo0aMHrK2t0alTJ4waNQpHjx6Vf6D+YN26dSguLsbSpUsbPbkyYcIEyevt27fD398f1tbWsLW1xYgRIxq8fPDbb7/F8OHDYWtrC2trawQEBGDnzp2SPvWXsu3ZswczZsyAk5MTrK2tUVVVBSGE7ttWS0tL+Pj44L///a/eOA0dp/rPvOPHj+Opp56Cvb09nJ2dMWPGDJSXl0u2X7VqFYYMGQKNRgMbGxt4e3tj6dKlktw9dOhQ7Ny5E2fPntX9nP74mVpdXY23334bnp6eulz5zDPPoLS0VDLW3r17MXToUDg4OMDKygpdunTB+PHjcePGjQaP/Z8FzzjTPamtrcW+ffvg5+fXaCJzc3ODr68v9u7di9raWiiVSt26cePGISwsDLNmzcL169cbHeeZZ55BamoqXn31VQQFBeHEiRMYO3YsKioqZMV58+ZNPPnkk3j22Wfxyiuv4JtvvsFbb70Fe3t7LFiwQNevoKAAL7zwArp06QLgVnH50ksv4fz585J+cuzbtw83b97EmDFjZPUvLS1FQEAAqqur8dZbb6Fr16744osvMG/ePPzyyy+6SyYqKysxbNgw/PLLL1i0aBH69OmDAwcOIDExEbm5uXrJftu2bThw4AAWLFgAFxcXaDQanDhxAsOHD0fXrl3x0UcfwdraGklJSdi8ebPs+a1atQqenp666+jmz5+Pxx9/HGfOnIG9vT2AW8fTw8MDYWFh6NChA4qKirB69Wo88sgjOHHiBBwdHREaGoqEhAS8/vrrWLVqFXx8fABA9z9SH3/8MaZNm4bRo0dj48aNsLCwwD//+U889thj2L17N4YPHw4AmDp1Kn788UcsXrwYPXv2xJUrV/Djjz+irKxM9pyIWkJtbS327t0LX19fuLm5ydomISEBb7zxBp555hm88cYbqK6uxrJlyzB48GAcPnz4jt8Myd328ccfR21tLZYuXYouXbrg4sWLyMzMxJUrVwAAn3/+OSZMmAB7e3tdPmqo6K/322+/wcHBAUuWLIGTkxMuXbqEjRs3on///sjJyYGHh4fMI3bLnj17oFQqMWrUKFn9N2/ejKeffhrBwcH45JNPUFVVhaVLl2Lo0KH4+uuvMWjQIABARkYGRowYgT59+iA5ORlqtRpJSUkYNWoUPvnkE0yePFmy3xkzZiA0NBT/+te/cP36dVhYWGDRokVYtGgRnn32WUyYMAHnzp3Dc889h9raWtnzHD9+PCZPnoxnn30WR48eRWxsLABg/fr1uj6//PILwsPD4e7uDpVKhZ9++gmLFy/G//3f/+n6JSUl4fnnn8cvv/yid6lPXV0dRo8ejQMHDuDVV19FQEAAzp49i/j4eAwdOhQ//PADrKysUFBQgNDQUAwePBjr16/HAw88gPPnz+PLL79EdXU1rK2tZc2pTRJE96C4uFgAEGFhYXfsN3nyZAFAXLhwQQghRHx8vAAgFixYoNe3fl2948ePCwDitddek/T75JNPBAARERGha9u3b58AIPbt26dri4iIEADEp59+Ktn+8ccfFx4eHo3GXFtbK27evCnefPNN4eDgIOrq6nTrAgMDRWBg4B3nvGTJEgFAfPnll3fsVy8mJkYAEN9//72kffbs2UKhUIi8vDwhhBBr1qxpcD7vvPOOACD27NmjawMg7O3txaVLlyR9J0+eLKysrERxcbGuraamRnh6egoA4syZM43O9cyZMwKA8Pb2FjU1Nbr2w4cPCwDik08+aXSONTU14tq1a8LGxka8//77uvZ///vfej83IYS4fv266NChgxg1apSkvba2VvTt21f069dP19auXTsRFRXV6NhErYXcvFmvsLBQmJubi5deeknSfvXqVeHi4iImTZqka7s9f8rd9uLFiwKAWLly5R1jefDBBxvMffV5YcOGDY1uW1NTI6qrq0WPHj3Eyy+/bNC2Qgjh6ekpXFxc7tinXm1trejYsaPw9vYWtbW1uvarV68KjUYjAgICdG0DBgwQGo1GXL16VRKrl5eX6Ny5sy73b9iwQQAQ06ZNk4x1+fJlYWlpKcaOHStp/+677wSABvPnH+da/zNbunSpZPsXX3xRWFpaSj57bp/jzZs3RUpKilAqlZI8HxoaKrRard429Z+bn332maQ9KytLABBJSUlCCCG2bt0qAIjc3NwGx/4z46Ua1CLE/7/U4fZLMMaPH3/XbTMyMgAAkyZNkrRPmDBB79KQxigUCr2zFH369JFcMgDc+mrq0Ucfhb29PZRKJSwsLLBgwQKUlZWhpKRE1lhNtXfvXvTu3Rv9+vWTtE+fPh1CCOzdu1fXz8bGRu8ryfpLVm6/hCEoKAjt27eXtO3btw/Dhw+Hs7Ozrk2pVOqdWbmT0NBQybcH9Zec/PGYXrt2Da+99hr+8pe/wNzcHObm5mjXrh2uX7+OkydP3nWMzMxMXLp0CREREaipqdEtdXV1GDlyJLKysnTfVPTr1w8fffQR3n77bRw6dKjBy06I7ke7d+9GTU0Npk2bJnkfWFpaIjAw8I5PEZK7bYcOHdC9e3csW7YMK1asQE5Ozj0/8aempgYJCQno3bs3VCoVzM3NoVKpcOrUKVnv/3uRl5eH3377DVOnToWZ2f9KnXbt2mH8+PE4dOgQbty4gevXr+P777/HhAkT0K5dO10/pVKJqVOn4tdff0VeXp5k37d/bh08eBCVlZV4+umnJe0BAQHQarWyY7790pw+ffqgsrJS8tmTk5ODJ598Eg4ODrrPqGnTpqG2thY///zzXcf44osv8MADD2DUqFGS34eHHnoILi4uut+Hhx56CCqVCs8//zw2btyI/Px82fNo61g40z1xdHSEtbU1zpw5c8d+BQUFsLa2RocOHSTtrq6udx2j/qv2PxZ5wK3rpx0cHGTFaW1tDUtLS0mbWq1GZWWl7vXhw4cRHBwM4Na1dN999x2ysrIQFxcHAAbfxFd/ucfdjk29srKyBo9Hx44ddevr/+vi4qL3PyEajQbm5uZ6lyY0tM/6fdyuobbG3H7s67+y/eNxCg8PxwcffICZM2di9+7dOHz4MLKysuDk5CTreF64cAHArf9JsrCwkCzvvPMOhBC6R3alpqYiIiICH374Ifz9/dGhQwdMmzYNxcXFsudE1BLk5s169e+DRx55RO99kJqaiosXL97ztgqFAl9//TUee+wxLF26FD4+PnBycsJf//pXXL16tUnzjI6Oxvz58zFmzBjs2LED33//PbKystC3b98m3RTdpUsXlJaW3vGyvnr1ebCxnFpXV4fLly/j8uXLEELIyr31bu9bv97YObWwsBCDBw/G+fPn8f777+PAgQPIysrCqlWrJP3u5MKFC7hy5QpUKpXe70NxcbHu96F79+746quvoNFoEBkZie7du6N79+54//33Zc+nreI1znRPlEolhg0bhi+//BK//vprg9c5//rrr8jOzkZISIjkDCWgfwa6IfXJ5MKFC+jUqZOuvaamplmvX92yZQssLCzwxRdfSIrsbdu2NWl/w4YNg4WFBbZt24ZZs2bdtb+DgwOKior02n/77TcAtz5s6/t9//33EEJIjl9JSQlqamp0/eo1dIwdHBwaLCibs8gsLy/HF198gfj4eMTExOjaq6qqZD+ftn4u//jHPxq9E73+f6gcHR2xcuVKrFy5EoWFhdi+fTtiYmJQUlJyXz2dgNo+pVKJ4cOH47///W+jefOP6t8HW7duNegMpqHbarVaJCcnAwB+/vlnfPrpp1i4cCGqq6uxZs0ag8YF/nd/QkJCgqT94sWLeOCBBwze32OPPYY9e/Zgx44dCAsLu2Pf+s+NxnKqmZkZ2rdvDyEEzMzMZOXeerfn1PqxGsupzfWIzW3btuH69etIS0uT/Czrb96Uw9HREQ4ODo3mRFtbW92/Bw8ejMGDB6O2thY//PCD7rGzzs7Odz3+bRnPONM9i42NhRACL774ImprayXramtrMXv2bAghdDc6GGrIkCEAbp1R/KOtW7eipqamaUE3QKFQwNzcXFLc//777/jXv/7VpP25uLjozrSmpKQ02OeXX37BkSNHAADDhw/HiRMn8OOPP0r6pKSkQKFQYNiwYbp+165d0yvo68eov1nuToYNG4avv/5adzYKuPWzuv0Y3wuFQgEhhN7NQx9++KHe70lDZ6sBYODAgXjggQdw4sQJ+Pn5NbioVCq9sbt06YI5c+ZgxIgReseTqDWoz5vPPfccqqur9dbfvHkTO3bsAHCrYDQ3N8cvv/zS6PugMU3dtmfPnnjjjTfg7e0teQ+p1WrZZ4sVCoXe+3/nzp04f/68rO1v9+yzz8LFxQWvvvpqo/tIS0sDAHh4eKBTp07YvHmz5KlI169fx2effaZ70oaNjQ369++PtLQ0ybzq6urw8ccfo3PnzujZs+cd4xowYAAsLS2xadMmSXtmZqbe5YD3or5g/+MxFUJg3bp1en0b+zk98cQTKCsrQ21tbYO/Cw3dyKhUKtG/f3/dme0/e07lGWe6ZwMHDsTKlSsRFRWFQYMGYc6cOejSpYvuD6B8//33WLlyJQICApq0/wcffBBPPfUU3n33XSiVSgQFBeH48eN49913YW9vL7l+7V6EhoZixYoVCA8Px/PPP4+ysjIsX778jneN382KFSuQn5+P6dOnY/fu3Rg7diycnZ1x8eJFpKenY8OGDdiyZQv69OmDl19+GSkpKQgNDcWbb74JrVaLnTt3IikpCbNnz9Yl72nTpmHVqlWIiIhAQUEBvL298e233yIhIQGPP/44Hn300bvG9cYbb2D79u0ICgrCggULYG1tjVWrVsn6ClQuOzs7DBkyBMuWLYOjoyO6du2KjIwMJCcn651t8vLyAgCsXbsWtra2sLS0hLu7OxwcHPCPf/wDERERuHTpEiZMmACNRoPS0lL89NNPKC0txerVq1FeXo5hw4YhPDwcnp6esLW1RVZWFr788kuMGzeu2eZE1Fz8/f2xevVqvPjii/D19cXs2bPx4IMP4ubNm8jJycHatWvh5eWFUaNGoWvXrnjzzTcRFxeH/Px8jBw5Eu3bt8eFCxdw+PBh2NjYYNGiRQ2OI3fbI0eOYM6cOZg4cSJ69OgBlUqFvXv34siRI5JvjLy9vbFlyxakpqaiW7dusLS0hLe3d4NjP/HEE/joo4/g6emJPn36IDs7G8uWLWvyc/rt7e3xn//8B0888QQefvhhyR9AOXXqFD7++GP89NNPGDduHMzMzLB06VI8/fTTeOKJJ/DCCy+gqqoKy5Ytw5UrVySPR01MTMSIESMwbNgwzJs3DyqVCklJSTh27Bg++eSTu34z2r59e8ybNw9vv/02Zs6ciYkTJ+LcuXNYuHChQZdq3M2IESOgUqnw1FNP4dVXX0VlZSVWr17d4B988fb2RlpaGlavXg1fX1+YmZnBz88PYWFh2LRpEx5//HHMnTsX/fr1g4WFBX799Vfs27cPo0ePxtixY7FmzRrs3bsXoaGh6NKlCyorK3VP7ZDzGdOmmeaeRGqLDh48KCZMmCCcnZ2Fubm50Gg0Yty4cSIzM1Ovb/1dxKWlpY2u+6PKykoRHR0tNBqNsLS0FAMGDBAHDx4U9vb2kruzG3uqho2Njaxx1q9fLzw8PIRarRbdunUTiYmJIjk5+a5PmriTmpoasXHjRhEUFCQ6dOggzM3NhZOTkwgJCRGbN2+W3PF99uxZER4eLhwcHISFhYXw8PAQy5Ytk/QRQoiysjIxa9Ys4erqKszNzYVWqxWxsbGisrJS0g+AiIyMbDCu7777TgwYMECo1Wrh4uIi/va3v4m1a9fKfqrGsmXL9PYJQMTHx+te//rrr2L8+PGiffv2wtbWVowcOVIcO3ZMaLVaydNQhBBi5cqVwt3dXSiVSr27zjMyMkRoaKjo0KGDsLCwEJ06dRKhoaHi3//+txDi1u/HrFmzRJ8+fYSdnZ2wsrISHh4eIj4+Xly/fr3B+RO1Brm5uSIiIkJ06dJFqFQqYWNjIx5++GGxYMECUVJSIum7bds2MWzYMGFnZyfUarXQarViwoQJ4quvvtL1aSivydn2woULYvr06cLT01PY2NiIdu3aiT59+oj33ntP8vScgoICERwcLGxtbQUA3ZMbGnpaxOXLl8Wzzz4rNBqNsLa2FoMGDRIHDhxoNKfc7aka9YqLi8Vrr70mHnzwQWFtbS3UarX4y1/+Il544QVx9OhRvXn3799fWFpaChsbGzF8+HDx3Xff6e3zwIEDIigoSNjY2AgrKysxYMAAsWPHDkmf+qdqZGVl6W1fV1cnEhMThZubm1CpVKJPnz5ix44dsuba2Odh/Xh/zMc7duwQffv2FZaWlqJTp07ib3/7m/jvf/+r97l36dIlMWHCBPHAAw8IhUIh+Z24efOmWL58uW4/7dq1E56enuKFF14Qp06dEkLc+jwfO3as0Gq1Qq1WCwcHBxEYGCi2b9/e6M/lz0IhRBP+sgNRK5CZmYmBAwdi06ZNCA8PN3U4RERE1MaxcKb7Qnp6Og4ePAhfX19YWVnhp59+wpIlS2Bvb48jR47oPTGDiIiIqLnxGme6L9jZ2WHPnj1YuXIlrl69CkdHR4SEhCAxMZFFMxEREbUInnEmIiIiIpKBj6MjIiIiIpKBhTMRERERkQwsnImIiIiIZODNgUZUV1eH3377Dba2trL+tDQRkaGEELh69So6duzYbH8MqDVhHiUiYzMkj7JwNqLffvsNbm5upg6DiP4Ezp071+S/yNaaMY8SUUuRk0dZOBuRra0tgFs/CDs7OxNHQ0RtUUVFBdzc3HT5pq1hHiUiYzMkj7JwNqL6rxXt7OyY8InIqNrqZQzMo0TUUuTk0bZ3QRwRERERkRGwcCYiIiIikoGFMxERERGRDCyciYiIiIhkYOFMRERERCQDC2ciIiIiIhlYOBMRERERycDCmYiIiIhIBhbOREREREQysHAmIiIiIpKBhTMRERERkQwsnImIiIiIZGDhTEREREQkAwtnIiIiIiIZWDgTEREREcnAwpmIiIiISAYWzkREREREMrBwJiIiIiKSgYUzEREREZEMJi+ck5KS4O7uDktLS/j6+uLAgQON9i0qKkJ4eDg8PDxgZmaGqKioBvutXLkSHh4esLKygpubG15++WVUVlbq1icmJuKRRx6Bra0tNBoNxowZg7y8PMk+pk+fDoVCIVkGDBjQLHMmImpu69atYy4lIjIykxbOqampiIqKQlxcHHJycjB48GCEhISgsLCwwf5VVVVwcnJCXFwc+vbt22CfTZs2ISYmBvHx8Th58iSSk5ORmpqK2NhYXZ+MjAxERkbi0KFDSE9PR01NDYKDg3H9+nXJvkaOHImioiLdsmvXruabPBFRM4qNjWUuJSIyMoUQQphq8P79+8PHxwerV6/WtfXq1QtjxoxBYmLiHbcdOnQoHnroIaxcuVLSPmfOHJw8eRJff/21ru2VV17B4cOHGz0DU1paCo1Gg4yMDAwZMgTArbMkV65cwbZt25o2OQAVFRWwt7dHeXk57OzsmrwfIqLG1OeZGTNmIDk5WdfeVnIp8ygRGZshecZkZ5yrq6uRnZ2N4OBgSXtwcDAyMzObvN9BgwYhOzsbhw8fBgDk5+dj165dCA0NbXSb8vJyAECHDh0k7fv374dGo0HPnj3x3HPPoaSk5I5jV1VVoaKiQrIQERlTdXU1ACAoKEjSfr/mUuZRImrNzE018MWLF1FbWwtnZ2dJu7OzM4qLi5u837CwMJSWlmLQoEEQQqCmpgazZ89GTExMg/2FEIiOjsagQYPg5eWlaw8JCcHEiROh1Wpx5swZzJ8/H0FBQcjOzoZarW5wX4mJiVi0aFGTYyciMlRZWRkAQKPRSNrv11zKPEpErZnJCud6CoVC8loIoddmiP3792Px4sVISkpC//79cfr0acydOxeurq6YP3++Xv85c+bgyJEj+PbbbyXtkydP1v3by8sLfn5+0Gq12LlzJ8aNG9fg2LGxsYiOjta9rqiogJubW5PnQkQkV1vJpcyjRNSamaxwdnR0hFKp1DsjUlJSoncW2hDz58/H1KlTMXPmTACAt7c3rl+/jueffx5xcXEwM/vf1SkvvfQStm/fjm+++QadO3e+435dXV2h1Wpx6tSpRvuo1epGz0YTERmDg4MDAODChQuS9vs1lzKPElFrZrJrnFUqFXx9fZGeni5pT09PR0BAQJP3e+PGDUlCBwClUgkhBOrvgxRCYM6cOUhLS8PevXvh7u5+1/2WlZXh3LlzcHV1bXJsRETNTaVSAQD27dsnaWcuJSJqfia9VCM6OhpTp06Fn58f/P39sXbtWhQWFmLWrFkAbn1ld/78eaSkpOi2yc3NBQBcu3YNpaWlyM3NhUqlQu/evQEAo0aNwooVK/Dwww/rvl6cP38+nnzySSiVSgBAZGQkNm/ejP/85z+wtbXVnfW2t7eHlZUVrl27hoULF2L8+PFwdXVFQUEBXn/9dTg6OmLs2LEteISIiORJSUlBQEAAcykRkTEJE1u1apXQarVCpVIJHx8fkZGRoVsXEREhAgMDJf0B6C1arVa3/ubNm2LhwoWie/fuwtLSUri5uYkXX3xRXL58+Y77ACA2bNgghBDixo0bIjg4WDg5OQkLCwvRpUsXERERIQoLCw2aW3l5uQAgysvLDT0sRESy1OeZ5cuXt8lcyjxKRMZmSJ4x6XOc2zo+f5SIjK2t55m2Pj8iMr374jnORERERET3ExbOREREREQysHAmIiIiIpKBhTMRERERkQwsnImIiIiIZGDhTEREREQkAwtnIiIiIiIZWDgTEREREcnAwpmIiIiISAYWzkREREREMrBwJiIiIiKSgYUzEREREZEMLJyJiIiIiGRg4UxEREREJAMLZyIiIiIiGVg4ExERERHJwMKZiIiIiEgGFs5ERERERDKwcCYiIiIikoGFMxERERGRDCyciYiIiIhkYOFMRERERCQDC2ciIiIiIhlYOBMRERERycDCmYiIiIhIBhbOREREREQysHAmIiIiIpKBhTMRERERkQwsnImIiIiIZDB54ZyUlAR3d3dYWlrC19cXBw4caLRvUVERwsPD4eHhATMzM0RFRTXYb+XKlfDw8ICVlRXc3Nzw8ssvo7Ky0qBxhRBYuHAhOnbsCCsrKwwdOhTHjx+/5/kSERnDunXrmEuJiIzMpIVzamoqoqKiEBcXh5ycHAwePBghISEoLCxssH9VVRWcnJwQFxeHvn37Nthn06ZNiImJQXx8PE6ePInk5GSkpqYiNjbWoHGXLl2KFStW4IMPPkBWVhZcXFwwYsQIXL16tXkPAhFRM4iNjWUuJSIyNmFC/fr1E7NmzZK0eXp6ipiYmLtuGxgYKObOnavXHhkZKYKCgiRt0dHRYtCgQbLHraurEy4uLmLJkiW69ZWVlcLe3l6sWbPmrrHVKy8vFwBEeXm57G2IiAxRn2dmzJghaW8ruZR5lIiMzZA8Y7IzztXV1cjOzkZwcLCkPTg4GJmZmU3e76BBg5CdnY3Dhw8DAPLz87Fr1y6EhobKHvfMmTMoLi6W9FGr1QgMDLxjbFVVVaioqJAsRETGVF1dDQAICgqStN+vuZR5lIhaM3NTDXzx4kXU1tbC2dlZ0u7s7Izi4uIm7zcsLAylpaUYNGgQhBCoqanB7NmzERMTI3vc+v821Ofs2bONjp2YmIhFixY1OXYiIkOVlZUBADQajaT9fs2lzKNE1JqZ/OZAhUIheS2E0GszxP79+7F48WIkJSXhxx9/RFpaGr744gu89dZbBo9raGyxsbEoLy/XLefOnWvyPIiIDNFWcinzKBG1ZiY74+zo6AilUql3RqSkpETv7IQh5s+fj6lTp2LmzJkAAG9vb1y/fh3PP/884uLiZI3r4uIC4NbZEldXV9mxqdVqqNXqJsdORGQoBwcHAMCFCxck7fdrLmUeJaLWzGRnnFUqFXx9fZGeni5pT09PR0BAQJP3e+PGDZiZSaelVCohhIAQQta47u7ucHFxkfSprq5GRkbGPcVGRNTcVCoVAGDfvn2SduZSIqLmZ7IzzgAQHR2NqVOnws/PD/7+/li7di0KCwsxa9YsALe+sjt//jxSUlJ02+Tm5gIArl27htLSUuTm5kKlUqF3794AgFGjRmHFihV4+OGH0b9/f5w+fRrz58/Hk08+CaVSKWtchUKBqKgoJCQkoEePHujRowcSEhJgbW2N8PDwFjxCRETypKSkICAggLmUiMiYjPRkD9lWrVoltFqtUKlUwsfHR2RkZOjWRUREiMDAQEl/AHqLVqvVrb9586ZYuHCh6N69u7C0tBRubm7ixRdfFJcvX5Y9rhC3HqMUHx8vXFxchFqtFkOGDBFHjx41aG58jBIRGVt9nlm+fHmbzKXMo0RkbIbkGYUQQpiiYP8zqKiogL29PcrLy2FnZ2fqcIioDWrreaatz4+ITM+QPGPyp2oQEREREd0PWDgTEREREcnAwpmIiIiISAYWzkREREREMrBwJiIiIiKSgYUzEREREZEMLJyJiIiIiGRg4UxEREREJAMLZyIiIiIiGVg4ExERERHJwMKZiIiIiEgGFs5ERERERDKwcCYiIiIikoGFMxERERGRDCyciYiIiIhkYOFMRERERCQDC2ciIiIiIhlYOBMRERERycDCmYiIiIhIBhbOREREREQysHAmIiIiIpKBhTMRERERkQwsnImIiIiIZGDhTEREREQkAwtnIiIiIiIZWDgTEREREcnAwpmIiIiISAYWzkREREREMrBwJiIiIiKSweSFc1JSEtzd3WFpaQlfX18cOHCg0b5FRUUIDw+Hh4cHzMzMEBUVpddn6NChUCgUektoaKiuT9euXRvsExkZqeszffp0vfUDBgxo1rkTETWXdevWMZcSERmZSQvn1NRUREVFIS4uDjk5ORg8eDBCQkJQWFjYYP+qqio4OTkhLi4Offv2bbBPWloaioqKdMuxY8egVCoxceJEXZ+srCxJn/T0dACQ9AGAkSNHSvrt2rWrmWZORNS8YmNjmUuJiIzM3JSDr1ixAs8++yxmzpwJAFi5ciV2796N1atXIzExUa9/165d8f777wMA1q9f3+A+O3ToIHm9ZcsWWFtbSxK5k5OTpM+SJUvQvXt3BAYGStrVajVcXFwMnxgRUQubOnUqcykRkZGZ7IxzdXU1srOzERwcLGkPDg5GZmZms42TnJyMsLAw2NjYNBrHxx9/jBkzZkChUEjW7d+/HxqNBj179sRzzz2HkpKSO45VVVWFiooKyUJEZEzV1dUAgKCgIEn7/ZpLmUeJqDUzWeF88eJF1NbWwtnZWdLu7OyM4uLiZhnj8OHDOHbsmO4sTEO2bduGK1euYPr06ZL2kJAQbNq0CXv37sW7776LrKwsBAUFoaqqqtF9JSYmwt7eXre4ubk1yzyIiBpTVlYGANBoNJL2+zWXMo8SUWtm0ks1AOidmRBC6LU1VXJyMry8vNCvX7879gkJCUHHjh0l7ZMnT9b928vLC35+ftBqtdi5cyfGjRvX4L5iY2MRHR2te11RUcGkT0Qtoq3kUuZRImrNTFY4Ozo6QqlU6p0RKSkp0TsL3RQ3btzAli1b8Oabbzba5+zZs/jqq6+QlpZ21/25urpCq9Xi1KlTjfZRq9VQq9VNipeIqCkcHBwAABcuXJC036+5lHmUiFozk12qoVKp4Ovrq7sLu156ejoCAgLuef+ffvopqqqqMGXKlEb7bNiwARqNRvJ4pcaUlZXh3LlzcHV1vefYiIiai0qlAgDs27dP0s5cSkTU/Ex6qUZ0dDSmTp0KPz8/+Pv7Y+3atSgsLMSsWbMA3PrK7vz580hJSdFtk5ubCwC4du0aSktLkZubC5VKhd69e0v2nZycjDFjxujOxtyurq4OGzZsQEREBMzNpYfh2rVrWLhwIcaPHw9XV1cUFBTg9ddfh6OjI8aOHduMR4CIqHmkpKQgICCAuZSIyJiEia1atUpotVqhUqmEj4+PyMjI0K2LiIgQgYGBkv4A9BatVivpk5eXJwCIPXv2NDru7t27BQCRl5ent+7GjRsiODhYODk5CQsLC9GlSxcREREhCgsLDZpbeXm5ACDKy8sN2o6ISK76PLN8+fI2mUuZR4nI2AzJMwohhGjpYv3PoqKiAvb29igvL4ednZ2pwyGiNqit55m2Pj8iMj1D8ozJ/+Q2EREREdH9gIUzEREREZEMLJyJiIiIiGRg4UxEREREJAMLZyIiIiIiGVg4ExERERHJwMKZiIiIiEgGFs5ERERERDKwcCYiIiIikoGFMxERERGRDCyciYiIiIhkYOFMRERERCQDC2ciIiIiIhlYOBMRERERycDCmYiIiIhIBhbOREREREQysHAmIiIiIpKBhTMRERERkQwsnImIiIiIZGDhTEREREQkAwtnIiIiIiIZWDgTEREREcnAwpmIiIiISAbzpmyUlZWFf//73ygsLER1dbVkXVpaWrMERkRERETUmhh8xnnLli0YOHAgTpw4gc8//xw3b97EiRMnsHfvXtjb2xsjRiIiIiIikzO4cE5ISMB7772HL774AiqVCu+//z5OnjyJSZMmoUuXLsaIkYiIiIjI5AwunH/55ReEhoYCANRqNa5fvw6FQoGXX34Za9eubfYAiYiIiIhaA4ML5w4dOuDq1asAgE6dOuHYsWMAgCtXruDGjRvNGx0RERERUSth8M2BgwcPRnp6Ory9vTFp0iTMnTsXe/fuRXp6OoYPH26MGImIiIiITM7gM84ffPABwsLCAACxsbGYN28eLly4gHHjxiE5OdngAJKSkuDu7g5LS0v4+vriwIEDjfYtKipCeHg4PDw8YGZmhqioKL0+Q4cOhUKh0FvqLy8BgIULF+qtd3FxkexHCIGFCxeiY8eOsLKywtChQ3H8+HGD50dE1BLWrVvHXEpEZGRNulSjY8eOtzY2M8Orr76K7du3Y8WKFWjfvr1B+0pNTUVUVBTi4uKQk5ODwYMHIyQkBIWFhQ32r6qqgpOTE+Li4tC3b98G+6SlpaGoqEi3HDt2DEqlEhMnTpT0e/DBByX9jh49Klm/dOlSrFixAh988AGysrLg4uKCESNG6C5TISJqTWJjY5lLiYiMTRjIzMxMXLhwQa/94sWLwszMzKB99evXT8yaNUvS5unpKWJiYu66bWBgoJg7d+5d+7333nvC1tZWXLt2TdcWHx8v+vbt2+g2dXV1wsXFRSxZskTXVllZKezt7cWaNWvuOma98vJyAUCUl5fL3oaIyBD1eWbGjBmS9raSS5lHicjYDMkzBp9xFkI02F5VVQWVSiV7P9XV1cjOzkZwcLCkPTg4GJmZmYaG1ajk5GSEhYXBxsZG0n7q1Cl07NgR7u7uCAsLQ35+vm7dmTNnUFxcLIlNrVYjMDDwjrFVVVWhoqJCshARNWbChAlYsmSJXvuyZcv0zuw2pv6PUAUFBUna79dcyjxKRK2Z7JsD//73vwMAFAoFPvzwQ7Rr1063rra2Ft988w08PT1lD3zx4kXU1tbC2dlZ0u7s7Izi4mLZ+7mTw4cP49ixY3rXXvfv3x8pKSno2bMnLly4gLfffhsBAQE4fvw4HBwcdOM3FNvZs2cbHS8xMRGLFi1qltiJqO3LyMhAfHy8XvvIkSOxfPlyWfsoKysDAGg0Gkn7/ZpLmUeJqDWTXTi/9957AG6dcV6zZg2USqVunUqlQteuXbFmzRqDA1AoFJLXQgi9tqZKTk6Gl5cX+vXrJ2kPCQnR/dvb2xv+/v7o3r07Nm7ciOjo6CbHFhsbK9m+oqICbm5u9zoNImqjrl271uA3dRYWFgafaW0ruZR5lIhaM9mF85kzZwAAw4YNQ1pamsE3At7O0dERSqVS74xISUmJ3tmJprhx4wa2bNmCN9988659bWxs4O3tjVOnTgGA7q7w4uJiuLq6yo5NrVZDrVbfY+RE9Gfh5eWF1NRULFiwQNK+ZcsW9O7dW9Y+HBwcAAAXLlyQtN+vuZR5lIhaM4Ovcd63bx/at2+P6upq5OXloaampkkDq1Qq+Pr6Ij09XdKenp6OgICAJu3zjz799FNUVVVhypQpd+1bVVWFkydP6hK7u7s7XFxcJLFVV1cjIyOjWWIjIgKA+fPn46233kJERAQ2btyIjRs3Ytq0aVi8eDHmz58vax/1Z6z37dsnaWcuJSIyAkPvPLxx44aYMWOGUCqVQqlUil9++UUIIcRLL70kEhMTDdrXli1bhIWFhUhOThYnTpwQUVFRwsbGRhQUFAghhIiJiRFTp06VbJOTkyNycnKEr6+vCA8PFzk5OeL48eN6+x40aJCYPHlyg+O+8sorYv/+/SI/P18cOnRIPPHEE8LW1lY3rhBCLFmyRNjb24u0tDRx9OhR8dRTTwlXV1dRUVEhe368G5yI7uaLL74QAQEBwtraWjg4OIhhw4aJ/fv3y96+Ps+01VzKPEpExmZInjG4cP7rX/8qfH19xYEDB4SNjY2ucP7Pf/4jHnroIYODXbVqldBqtUKlUgkfHx+RkZGhWxcRESECAwOlAQN6i1arlfTJy8sTAMSePXsaHHPy5MnC1dVVWFhYiI4dO4px48bpfWDU1dWJ+Ph44eLiItRqtRgyZIg4evSoQXNjwiciY6vPM8uXL2+TuZR5lIiMzZA8oxCikefLNUKr1SI1NRUDBgyAra0tfvrpJ3Tr1g2nT5+Gj48PHx30BxUVFbC3t0d5eTns7OxMHQ4RtUJXrlzB1q1bkZ+fj3nz5qFDhw748ccf4ezsjE6dOt11+7aeZ9r6/IjI9AzJM7JvDqxXWlqq99gjALh+/Xqz3cFN9GfVNWan7t8FS0Lv0JPagiNHjuDRRx+Fvb09CgoKMHPmTHTo0AGff/45zp49i5SUFFOHSNQq/DE3tibM038+Bt8c+Mgjj2Dnzv/9AtcXy+vWrYO/v3/zRUZE1MZFR0dj+vTpOHXqFCwtLXXtISEh+Oabb0wYGRERNcTgM86JiYkYOXIkTpw4gZqaGrz//vs4fvw4Dh48iIyMDGPESETUJmVlZeGf//ynXnunTp2a7Y+XEBFR8zG4cA4ICMB3332H5cuXo3v37tizZw98fHxw8OBBeHt7GyNGoj8Nfu3352JpadngfSF5eXlwcnIyQURErRNzI7UWBhfOwK2/ELVx48bmjoWI6E9l9OjRePPNN/Hpp58CuHXpW2FhIWJiYjB+/HgTR0dERLdrUuFcV1eH06dPo6SkBHV1dZJ1Q4YMaZbAiIjauuXLl+Pxxx+HRqPB77//jsDAQBQXF8Pf3x+LFy82dXhERHQbgwvnQ4cOITw8HGfPnsXtT7JTKBSora1ttuCIiNoyOzs7fPvtt9i3bx+ys7NRV1cHHx8fPProo6YOjYiIGmBw4Txr1iz4+flh586dcHV15SPoiIiaoK6uDh999BHS0tJQUFAAhUKh+xPVQgjmViKiVsjgwvnUqVPYunUr/vKXvxgjHiKiNk8IgSeffBK7du1C37594e3tDSEETp48ienTpyMtLQ3btm0zdZhERHQbgwvn/v374/Tp0yyciYia6KOPPsI333yDr7/+GsOGDZOs27t3L8aMGYOUlBRMmzbNRBESEVFDZBXOR44c0f37pZdewiuvvILi4mJ4e3vDwsJC0rdPnz7NGyERURvzySef4PXXX9crmgEgKCgIMTEx2LRpEwtnIqJWRlbh/NBDD0GhUEhuBpwxY4bu3/XreHMgEdHdHTlyBEuXLm10fUhICP7+97+3YERERCSHrML5zJkzxo6DiOhP49KlS3B2dm50vbOzMy5fvtyCERERkRyyCmetVosZM2bg/fffh62trbFjIiJq02pra2Fu3nj6VSqVqKmpacGIiIhIDtk3B27cuBFLlixh4UxEdI+EEJg+fTrUanWD66uqqlo4IiIikkN24Xz7HzshIqKmiYiIuGsf3hhIRNT6GPQ4Oj6Qn4jo3m3YsMHUIRARURMYVDj37NnzrsXzpUuX7ikgIiIiIqLWyKDCedGiRbC3tzdWLERERERErZZBhXNYWBg0Go2xYiEiIiIiarXM5Hbk9c1ERERE9Gcmu3DmUzWIiIiI6M9M9qUadXV1xoyDiIiIiKhVk33GmYiIiIjoz4yFMxERERGRDCyciYiIiIhkYOFMRERERCQDC2ciIiIiIhlYOBMRERERyWDywjkpKQnu7u6wtLSEr68vDhw40GjfoqIihIeHw8PDA2ZmZoiKitLrM3ToUCgUCr0lNDRU1ycxMRGPPPIIbG1todFoMGbMGOTl5Un2M336dL19DBgwoNnmTUTUnNatW8dcSkRkZCYtnFNTUxEVFYW4uDjk5ORg8ODBCAkJQWFhYYP9q6qq4OTkhLi4OPTt27fBPmlpaSgqKtItx44dg1KpxMSJE3V9MjIyEBkZiUOHDiE9PR01NTUIDg7G9evXJfsaOXKkZF+7du1qvskTETWj2NhY5lIiImMTJtSvXz8xa9YsSZunp6eIiYm567aBgYFi7ty5d+333nvvCVtbW3Ht2rVG+5SUlAgAIiMjQ9cWEREhRo8efdf930l5ebkAIMrLy+9pP0REjanPMzNmzJC0t5VcyjxKRMZmSJ4x2Rnn6upqZGdnIzg4WNIeHByMzMzMZhsnOTkZYWFhsLGxabRPeXk5AKBDhw6S9v3790Oj0aBnz5547rnnUFJScsexqqqqUFFRIVmIiIypuroaABAUFCRpv19zKfMoEbVmJiucL168iNraWjg7O0vanZ2dUVxc3CxjHD58GMeOHcPMmTMb7SOEQHR0NAYNGgQvLy9de0hICDZt2oS9e/fi3XffRVZWFoKCglBVVdXovhITE2Fvb69b3NzcmmUeRESNKSsrAwBoNBpJ+/2aS5lHiag1Mzd1AAqFQvJaCKHX1lTJycnw8vJCv379Gu0zZ84cHDlyBN9++62kffLkybp/e3l5wc/PD1qtFjt37sS4ceMa3FdsbCyio6N1rysqKpj0iahFtJVcyjxKRK2ZyQpnR0dHKJVKvTMiJSUlemehm+LGjRvYsmUL3nzzzUb7vPTSS9i+fTu++eYbdO7c+Y77c3V1hVarxalTpxrto1aroVarmxwzEZGhHBwcAAAXLlyQtN+vuZR5lIhaM5NdqqFSqeDr64v09HRJe3p6OgICAu55/59++imqqqowZcoUvXVCCMyZMwdpaWnYu3cv3N3d77q/srIynDt3Dq6urvccGxFRc1GpVACAffv2SdqZS4mImp9JL9WIjo7G1KlT4efnB39/f6xduxaFhYWYNWsWgFtf2Z0/fx4pKSm6bXJzcwEA165dQ2lpKXJzc6FSqdC7d2/JvpOTkzFmzBjd2Zg/ioyMxObNm/Gf//wHtra2urPe9vb2sLKywrVr17Bw4UKMHz8erq6uKCgowOuvvw5HR0eMHTvWSEeDiKjpUlJSEBAQwFxKRGRMRn2+hwyrVq0SWq1WqFQq4ePjo/cYo8DAQEl/AHqLVquV9MnLyxMAxJ49exocs6F9ABAbNmwQQghx48YNERwcLJycnISFhYXo0qWLiIiIEIWFhQbNjY9RIiJjq88zy5cvb5O5lHmUiIzNkDyjEEKIlinR/3wqKipgb2+P8vJy2NnZmTocImqD2nqeaevzIyLTMyTPmPxPbhMRERER3Q9YOBMRERERycDCmYiIiIhIBhbOREREREQysHAmIiIiIpKBhTMRERERkQwsnImIiIiIZGDhTEREREQkAwtnIiIiIiIZWDgTEREREcnAwpmIiIiISAYWzkREREREMrBwJiIiIiKSgYUzEREREZEMLJyJiIiIiGRg4UxEREREJAMLZyIiIiIiGVg4ExERERHJwMKZiIiIiEgGFs5ERERERDKwcCYiIiIikoGFMxERERGRDCyciYiIiIhkYOFMRERERCQDC2ciIiIiIhlYOBMRERERycDCmYiIiIhIBhbOREREREQysHAmIiIiIpKBhTMRERERkQwmL5yTkpLg7u4OS0tL+Pr64sCBA432LSoqQnh4ODw8PGBmZoaoqCi9PkOHDoVCodBbQkNDDRpXCIGFCxeiY8eOsLKywtChQ3H8+PFmmTMRUXNbt24dcykRkZGZtHBOTU1FVFQU4uLikJOTg8GDByMkJASFhYUN9q+qqoKTkxPi4uLQt2/fBvukpaWhqKhItxw7dgxKpRITJ040aNylS5dixYoV+OCDD5CVlQUXFxeMGDECV69ebd6DQETUDGJjY5lLiYiMTZhQv379xKxZsyRtnp6eIiYm5q7bBgYGirlz596133vvvSdsbW3FtWvXZI9bV1cnXFxcxJIlS3TrKysrhb29vVizZk2jY1VWVory8nLdcu7cOQFAlJeX3zVOIqKmKC8vFwDEjBkzJO33ay5lHiWillafR+XkGZOdca6urkZ2djaCg4Ml7cHBwcjMzGy2cZKTkxEWFgYbGxvZ4545cwbFxcWSPmq1GoGBgXeMLTExEfb29rrFzc2t2eZBRNSQ6upqAEBQUJCk/X7NpcyjRNSamaxwvnjxImpra+Hs7Cxpd3Z2RnFxcbOMcfjwYRw7dgwzZ840aNz6/xoaW2xsLMrLy3XLuXPnmmUeRESNKSsrAwBoNBpJ+/2aS5lHiag1Mzd1AAqFQvJaCKHX1lTJycnw8vJCv379mjSuobGp1Wqo1ep7iJiIqGnaSi5lHiWi1sxkZ5wdHR2hVCr1zjqUlJTonZ1oihs3bmDLli2SMyRyx3VxcQEAo8VGRNRcHBwcAAAXLlyQtDOXEhE1P5MVziqVCr6+vkhPT5e0p6enIyAg4J73/+mnn6KqqgpTpkwxeFx3d3e4uLhI+lRXVyMjI6NZYiMiai4qlQoAsG/fPkk7cykRUfMz6aUa0dHRmDp1Kvz8/ODv74+1a9eisLAQs2bNAnDrWrfz588jJSVFt01ubi4A4Nq1aygtLUVubi5UKhV69+4t2XdycjLGjBmjOxtjyLgKhQJRUVFISEhAjx490KNHDyQkJMDa2hrh4eFGOhpERE2XkpKCgIAA5lIiImMy6vM9ZFi1apXQarVCpVIJHx8fkZGRoVsXEREhAgMDJf0B6C1arVbSJy8vTwAQe/bsadK4Qtx6jFJ8fLxwcXERarVaDBkyRBw9etSguRnyeBMioqaozzPLly9vk7mUeZSIjM2QPKMQQoiWL9f/HCoqKmBvb4/y8nLY2dmZOhwiaoPaep5p6/MjItMzJM+Y/E9uExERERHdD1g4ExERERHJwMKZiIiIiEgGFs5ERERERDKwcCYiIiIikoGFMxERERGRDCyciYiIiIhkYOFMRERERCQDC2ciIiIiIhlYOBMRERERycDCmYiIiIhIBhbOREREREQysHAmIiIiIpKBhTMRERERkQwsnImIiIiIZGDhTEREREQkAwtnIiIiIiIZWDgTEREREcnAwpmIiIiISAYWzkREREREMrBwJiIiIiKSgYUzEREREZEMLJyJiIiIiGRg4UxEREREJAMLZyIiIiIiGVg4ExERERHJwMKZiIiIiEgGFs5ERERERDKwcCYiIiIiksHkhXNSUhLc3d1haWkJX19fHDhwoNG+RUVFCA8Ph4eHB8zMzBAVFdVgvytXriAyMhKurq6wtLREr169sGvXLt36rl27QqFQ6C2RkZG6PtOnT9dbP2DAgGabNxFRc1q3bh1zKRGRkZmbcvDU1FRERUUhKSkJAwcOxD//+U+EhITgxIkT6NKli17/qqoqODk5IS4uDu+9916D+6yursaIESOg0WiwdetWdO7cGefOnYOtra2uT1ZWFmpra3Wvjx07hhEjRmDixImSfY0cORIbNmzQvVapVPc6ZSIio4iNjWUuJSIyMpMWzitWrMCzzz6LmTNnAgBWrlyJ3bt3Y/Xq1UhMTNTr37VrV7z//vsAgPXr1ze4z/Xr1+PSpUvIzMyEhYUFAECr1Ur6ODk5SV4vWbIE3bt3R2BgoKRdrVbDxcWlaZMjImpBU6dOZS4lIjIyk12qUV1djezsbAQHB0vag4ODkZmZ2eT9bt++Hf7+/oiMjISzszO8vLyQkJAgOStyexwff/wxZsyYAYVCIVm3f/9+aDQa9OzZE8899xxKSkruOHZVVRUqKiokCxGRMVVXVwMAgoKCJO33ay5lHiWi1sxkhfPFixdRW1sLZ2dnSbuzszOKi4ubvN/8/Hxs3boVtbW12LVrF9544w28++67WLx4cYP9t23bhitXrmD69OmS9pCQEGzatAl79+7Fu+++i6ysLAQFBaGqqqrRsRMTE2Fvb69b3NzcmjwPIiI5ysrKAAAajUbSfr/mUuZRImrNTHqpBgC9MxNCCL02Q9TV1UGj0WDt2rVQKpXw9fXFb7/9hmXLlmHBggV6/ZOTkxESEoKOHTtK2idPnqz7t5eXF/z8/KDVarFz506MGzeuwbFjY2MRHR2te11RUcGkT0Qtoq3kUuZRImrNTFY4Ozo6QqlU6p0RKSkp0TsLbQhXV1dYWFhAqVTq2nr16oXi4mJUV1dLbko5e/YsvvrqK6Slpcnar1arxalTpxrto1aroVarmxw7EZGhHBwcAAAXLlyQtN+vuZR5lIhaM5NdqqFSqeDr64v09HRJe3p6OgICApq834EDB+L06dOoq6vTtf38889wdXXVu5N7w4YN0Gg0CA0Nvet+y8rKcO7cObi6ujY5NiKi5laf1/bt2ydpZy4lImp+Jn2Oc3R0ND788EOsX78eJ0+exMsvv4zCwkLMmjULwK2v7KZNmybZJjc3F7m5ubh27RpKS0uRm5uLEydO6NbPnj0bZWVlmDt3Ln7++Wfs3LkTCQkJkueKAre+htywYQMiIiJgbi498X7t2jXMmzcPBw8eREFBAfbv349Ro0bB0dERY8eONdLRICJqupSUFOZSIiJjEya2atUqodVqhUqlEj4+PiIjI0O3LiIiQgQGBkr6A9BbtFqtpE9mZqbo37+/UKvVolu3bmLx4sWipqZG0mf37t0CgMjLy9OL6caNGyI4OFg4OTkJCwsL0aVLFxERESEKCwsNmlt5ebkAIMrLyw3ajohIrvo8s3z58jaZS5lHicjYDMkzCiGEaPly/c+hoqIC9vb2KC8vh52dnanDIaI2qK3nmbY+PyIyPUPyjMn/5DYRERER0f2AhTMRERERkQwsnImIiIiIZGDhTEREREQkAwtnIiIiIiIZWDgTEREREcnAwpmIiIiISAYWzkREREREMrBwJiIiIiKSgYUzEREREZEMLJyJiIiIiGRg4UxEREREJAMLZyIiIiIiGVg4ExERERHJwMKZiIiIiEgGFs5ERERERDKwcCYiIiIikoGFMxERERGRDCyciYiIiIhkYOFMRERERCQDC2ciIiIiIhlYOBMRERERycDCmYiIiIhIBhbOREREREQysHAmIiIiIpKBhTMRERERkQwsnImIiIiIZGDhTEREREQkAwtnIiIiIiIZTF44JyUlwd3dHZaWlvD19cWBAwca7VtUVITw8HB4eHjAzMwMUVFRDfa7cuUKIiMj4erqCktLS/Tq1Qu7du3SrV+4cCEUCoVkcXFxkexDCIGFCxeiY8eOsLKywtChQ3H8+PFmmTMRUXNbt24dcykRkZGZtHBOTU1FVFQU4uLikJOTg8GDByMkJASFhYUN9q+qqoKTkxPi4uLQt2/fBvtUV1djxIgRKCgowNatW5GXl4d169ahU6dOkn4PPvggioqKdMvRo0cl65cuXYoVK1bggw8+QFZWFlxcXDBixAhcvXq1eSZPRNSMYmNjmUuJiIxNmFC/fv3ErFmzJG2enp4iJibmrtsGBgaKuXPn6rWvXr1adOvWTVRXVze6bXx8vOjbt2+j6+vq6oSLi4tYsmSJrq2yslLY29uLNWvW3DW2euXl5QKAKC8vl70NEZEh6vPMjBkzJO1tJZcyjxKRsRmSZ0x2xrm6uhrZ2dkIDg6WtAcHByMzM7PJ+92+fTv8/f0RGRkJZ2dneHl5ISEhAbW1tZJ+p06dQseOHeHu7o6wsDDk5+fr1p05cwbFxcWS2NRqNQIDA+8YW1VVFSoqKiQLEZExVVdXAwCCgoIk7fdrLmUeJaLWzNxUA1+8eBG1tbVwdnaWtDs7O6O4uLjJ+83Pz8fevXvx9NNPY9euXTh16hQiIyNRU1ODBQsWAAD69++PlJQU9OzZExcuXMDbb7+NgIAAHD9+HA4ODrrxG4rt7NmzjY6dmJiIRYsW6bUz8RORsRQUFAAAnJycJO33ay5lHiWillafX4QQd+1rssK5nkKhkLwWQui1GaKurg4ajQZr166FUqmEr68vfvvtNyxbtkyX7ENCQnT9vb294e/vj+7du2Pjxo2Ijo5ucmyxsbGS7c+fP4/evXvDzc2tyfMhIpLj999/l7y+X3Pp7Xn0zJkzeOihh5hHicjorl69Cnt7+zv2MVnh7OjoCKVSqXdGpKSkRO/shCFcXV1hYWEBpVKpa+vVqxeKi4tRXV0NlUqlt42NjQ28vb1x6tQpANDdFV5cXAxXV1fZsanVaqjVat3rdu3a4dy5c7C1tb2nD7A7qaiogJubG86dOwc7OzujjGFsnEPrwDm0DobOoaqqCq6urqipqZG036+59PY8qtVqAQCFhYV3/UCjpmsL7537AY+z8TXlGAshcPXqVXTs2PGufU1WOKtUKvj6+iI9PR1jx47Vtaenp2P06NFN3u/AgQOxefNm1NXVwczs1iXcP//8M1xdXRtM9MCtD56TJ09i8ODBAAB3d3e4uLggPT0dDz/8MIBb1xFmZGTgnXfekR2LmZkZOnfu3OS5GMLOzu6+fxNyDq0D59A6GDIHX19ffP311xg/fryura3k0vqx7e3t7/uf6f2gLbx37gc8zsZn6DGW+z/mJn0cXXR0ND788EOsX78eJ0+exMsvv4zCwkLMmjULwK2v7KZNmybZJjc3F7m5ubh27RpKS0uRm5uLEydO6NbPnj0bZWVlmDt3Ln7++Wfs3LkTCQkJiIyM1PWZN28eMjIycObMGXz//feYMGECKioqEBERAeDW14pRUVFISEjA559/jmPHjmH69OmwtrZGeHh4CxwZIiL5mEuJiFqIUZ/vIcOqVauEVqsVKpVK+Pj4iIyMDN26iIgIERgYKOkPQG/RarWSPpmZmaJ///5CrVaLbt26icWLF4uamhrd+smTJwtXV1dhYWEhOnbsKMaNGyeOHz8u2UddXZ2Ij48XLi4uQq1WiyFDhoijR482+/zvVVt4VBPn0DpwDq1DU+fQVnNpW/iZ3g94nFsGj7PxGfsYm7xwpntTWVkp4uPjRWVlpalDaTLOoXXgHFqHtjCH5sTj0TJ4nFsGj7PxGfsYK4SQ8ewNIiIiIqI/OZNe40xEREREdL9g4UxEREREJAMLZyIiIiIiGVg4ExERERHJwMK5lfnmm28watQodOzYEQqFAtu2bbvrNhkZGfD19YWlpSW6deuGNWvW6PX57LPP0Lt3b6jVavTu3Ruff/65EaI3Tvzr1q3D4MGD0b59e7Rv3x6PPvooDh8+bJT4AeP9DOpt2bIFCoUCY8aMab6gb2OsOVy5cgWRkZFwdXWFpaUlevXqhV27dhlhBsabw8qVK+Hh4QErKyu4ubnh5ZdfRmVlpRFmYPgcioqKEB4eDg8PD5iZmSEqKqrBfi31fm4NkpKS4O7uDktLS/j6+uLAgQOmDqnNSExMxCOPPAJbW1toNBqMGTMGeXl5pg6rzUtMTNQ945ya1/nz5zFlyhQ4ODjA2toaDz30ELKzs5t1DBbOrcz169fRt29ffPDBB7L6nzlzBo8//jgGDx6MnJwcvP766/jrX/+Kzz77TNfn4MGDmDx5MqZOnYqffvoJU6dOxaRJk/D999/fF/Hv378fTz31FPbt24eDBw+iS5cuCA4Oxvnz55s9fmPNod7Zs2cxb9483V9WMxZjzKG6uhojRoxAQUEBtm7diry8PKxbtw6dOnW6b+awadMmxMTEID4+HidPnkRycjJSU1MRGxvbKuZQVVUFJycnxMXFoW/fvg32acn3s6mlpqYiKioKcXFxyMnJweDBgxESEoLCwkJTh9YmZGRkIDIyEocOHUJ6ejpqamoQHByM69evmzq0NisrKwtr165Fnz59TB1Km3P58mUMHDgQFhYW+O9//4sTJ07g3XffxQMPPNC8AxnlIXfULACIzz///I59Xn31VeHp6Slpe+GFF8SAAQN0rydNmiRGjhwp6fPYY4+JsLCwZou1Ic0V/+1qamqEra2t2LhxY3OEeUfNOYeamhoxcOBA8eGHH4qIiAgxevToZo62Yc01h9WrV4tu3bqJ6upqY4R5R801h8jISBEUFCTpEx0dLQYNGtRssTZGzhz+KDAwUMydO1ev3VTvZ1Po16+fmDVrlqTN09NTxMTEmCiitq2kpEQAkPzxHGo+V69eFT169BDp6emNvr+p6V577bUWyeU843yfO3jwIIKDgyVtjz32GH744QfcvHnzjn0yMzNbLM7GyIn/djdu3MDNmzfRoUOHlgjxruTO4c0334STkxOeffbZlg7xruTMYfv27fD390dkZCScnZ3h5eWFhIQE1NbWmiJkPXLmMGjQIGRnZ+su9cnPz8euXbsQGhra4vE2VWt+Pzen6upqZGdn6801ODi4zc21tSgvLweAVpNb25rIyEiEhobi0UcfNXUobdL27dvh5+eHiRMnQqPR4OGHH8a6deuafRzzZt8jtaji4mI4OztL2pydnVFTU4OLFy/C1dW10T7FxcUtGWqD5MR/u5iYGHTq1KnVJB85c/juu++QnJyM3Nxc0wR5F3LmkJ+fj7179+Lpp5/Grl27cOrUKURGRqKmpgYLFiwwUeT/I2cOYWFhKC0txaBBgyCEQE1NDWbPno2YmBgTRW241vx+bk4XL15EbW3tn2KurYEQAtHR0Rg0aBC8vLxMHU6bs2XLFvz444/IysoydShtVn5+PlavXo3o6Gi8/vrrOHz4MP76179CrVZj2rRpzTYOC+c2QKFQSF6L///HIP/Y3lCf29tMRU789ZYuXYpPPvkE+/fvh6WlZYvEJ8ed5nD16lVMmTIF69atg6OjoynCk+VuP4e6ujpoNBqsXbsWSqUSvr6++O2337Bs2bJWUTgDd5/D/v37sXjxYiQlJaF///44ffo05s6dC1dXV8yfP7/F422q1vx+bm5/prma0pw5c3DkyBF8++23pg6lzTl37hzmzp2LPXv2tKrPrbamrq4Ofn5+SEhIAAA8/PDDOH78OFavXs3Cmf7HxcVF7+xLSUkJzM3N4eDgcMc+t5/JMQU58ddbvnw5EhIS8NVXX7WqGyvuNofjx4+joKAAo0aN0q2vq6sDAJibmyMvLw/du3dv0ZhvJ+fn4OrqCgsLCyiVSl2fXr16obi4GNXV1VCpVC0a8+3kzGH+/PmYOnUqZs6cCQDw9vbG9evX8fzzzyMuLg5mZq3/6rXW/H5uTo6OjlAqlX+KuZraSy+9hO3bt+Obb75B586dTR1Om5OdnY2SkhL4+vrq2mpra/HNN9/ggw8+QFVVlSSvUtO4urqid+/ekrZevXo1eKP+vWj9nxJ0R/7+/khPT5e07dmzB35+frCwsLhjn4CAgBaLszFy4geAZcuW4a233sKXX34JPz+/lg7zju42B09PTxw9ehS5ubm65cknn8SwYcOQm5sLNzc3E0X+P3J+DgMHDsTp06d1RT8A/Pzzz3B1dTV50QzIm8ONGzf0imOlUgkhhO7sdGvXmt/PzUmlUsHX11dvrunp6W1urqYihMCcOXOQlpaGvXv3wt3d3dQhtUnDhw/X+wzw8/PD008/jdzcXBbNzWTgwIF6j1P8+eefodVqm3cgo99+SAa5evWqyMnJETk5OQKAWLFihcjJyRFnz54VQggRExMjpk6dquufn58vrK2txcsvvyxOnDghkpOThYWFhdi6dauuz3fffSeUSqVYsmSJOHnypFiyZIkwNzcXhw4dui/if+edd4RKpRJbt24VRUVFuuXq1avNHr+x5nA7Yz9VwxhzKCwsFO3atRNz5swReXl54osvvhAajUa8/fbb980c4uPjha2trfjkk09Efn6+2LNnj+jevbuYNGlSq5iDEELX39fXV4SHh4ucnBxx/Phx3fqWfD+b2pYtW4SFhYVITk4WJ06cEFFRUcLGxkYUFBSYOrQ2Yfbs2cLe3l7s379fkltv3Lhh6tDaPD5Vo/kdPnxYmJubi8WLF4tTp06JTZs2CWtra/Hxxx836zgsnFuZffv2CQB6S0REhBDiVsEVGBgo2Wb//v3i4YcfFiqVSnTt2lWsXr1ab7///ve/hYeHh7CwsBCenp7is88+u2/i12q1De4zPj7+vpnD7YxdOBtrDpmZmaJ///5CrVaLbt26icWLF4uampr7Zg43b94UCxcuFN27dxeWlpbCzc1NvPjii+Ly5cutZg4N9ddqtZI+LfV+bg1WrVoltFqtUKlUwsfHh49Ka0YN/a4BEBs2bDB1aG0eC2fj2LFjh/Dy8hJqtVp4enqKtWvXNvsYCiHuk+8niYiIiIhMiNc4ExERERHJwMKZiIiIiEgGFs5ERERERDKwcCYiIiIikoGFMxERERGRDCyciYiIiIhkYOFMRERERCQDC2ciIiIiIhlYOBO1Evv374dCocCVK1ca7bNw4UI89NBDLRYTERER/Q8LZ6IWNH36dCgUCigUClhYWKBbt26YN28erl+/Lmv7efPm4euvvzZylERErdsfc6m5uTm6dOmC2bNn4/Lly5J+v//+O9q3b48OHTrg999/N1G01JawcCZqYSNHjkRRURHy8/Px9ttvIykpCfPmzZO1bbt27eDg4GDkCImIWr/6XFpQUIAPP/wQO3bswIsvvijp89lnn8HLywu9e/dGWlqaiSKltoSFM1ELU6vVcHFxgZubG8LDw/H0009j27ZtuvXZ2dnw8/ODtbU1AgICkJeXp1vHSzWIiG6pz6WdO3dGcHAwJk+ejD179kj6JCcnY8qUKZgyZQqSk5NNFCm1JSyciUzMysoKN2/e1L2Oi4vDu+++ix9++AHm5uaYMWOGCaMjImr98vPz8eWXX8LCwkLX9ssvv+DgwYOYNGkSJk2ahMzMTOTn55swSmoLWDgTmdDhw4exefNmDB8+XNe2ePFiBAYGonfv3oiJiUFmZiYqKytNGCURUevzxRdfoF27drCyskL37t1x4sQJvPbaa7r169evR0hIiO4a55EjR2L9+vUmjJjaAhbORC2sPtlbWlrC398fQ4YMwT/+8Q/d+j59+uj+7erqCgAoKSlp8TiJiFqzYcOGITc3F99//z1eeuklPPbYY3jppZcAALW1tdi4cSOmTJmi6z9lyhRs3LgRtbW1pgqZ2gAWzkQtrD7Z5+XlobKyEmlpadBoNLr1f/yqUaFQAADq6upaPE4iotbMxsYGf/nLX9CnTx/8/e9/R1VVFRYtWgQA2L17N86fP4/JkyfD3Nwc5ubmCAsLw6+//qp3HTSRIVg4E7Ww+mSv1WolRTIRETVdfHw8li9fjt9++w3JyckICwtDbm6uZHn66ad5kyDdE3NTB0BERER0r4YOHYoHH3wQixcvxo4dO7B9+3Z4eXlJ+kRERCA0NBSlpaVwcnIyUaR0P+MZZyIiImoToqOjsXbtWty8eVNy03W9YcOGwdbWFv/6179MEB21BQohhDB1EERERERErR3POBMRERERycDCmYiIiIhIBhbOREREREQysHAmIiIiIpKBhTMRERERkQwsnImIiIiIZGDhTEREREQkAwtnIiIiIiIZWDgTEREREcnAwpmIiIiISAYWzkREREREMvw/6h34VtFGURUAAAAASUVORK5CYII=",
|
|
244
|
+
"text/plain": [
|
|
245
|
+
"<Figure size 800x400 with 2 Axes>"
|
|
246
|
+
]
|
|
247
|
+
},
|
|
248
|
+
"metadata": {},
|
|
249
|
+
"output_type": "display_data"
|
|
250
|
+
}
|
|
251
|
+
],
|
|
252
|
+
"source": [
|
|
253
|
+
"\n",
|
|
254
|
+
"%matplotlib inline\n",
|
|
255
|
+
"from pycwb.utils.skymap_coord import convert_to_celestial_coordinates\n",
|
|
256
|
+
"import matplotlib.pyplot as plt\n",
|
|
257
|
+
"\n",
|
|
258
|
+
"sky_distribution = {\n",
|
|
259
|
+
" 'type': 'Fixed',\n",
|
|
260
|
+
" 'coordsys': 'geo',\n",
|
|
261
|
+
" 'coordinates': {\n",
|
|
262
|
+
" 'unit': 'deg',\n",
|
|
263
|
+
" 'sky_loc': {'phi': 60, 'theta': 10} \n",
|
|
264
|
+
" }\n",
|
|
265
|
+
"}\n",
|
|
266
|
+
"\n",
|
|
267
|
+
"\n",
|
|
268
|
+
"sky_locations = generate_sky_distribution(sky_distribution, len(injections))\n",
|
|
269
|
+
"print(f\"Number of sky locations: {len(sky_locations[0])}\")\n",
|
|
270
|
+
"distribute_injections_on_sky(injections, sky_locations, coordsys=sky_distribution['coordsys'])\n",
|
|
271
|
+
"print(f\"Number of injections after sky distribution: {len(injections)}\")\n",
|
|
272
|
+
"\n",
|
|
273
|
+
"phi = np.array([inj['sky_loc'][0] for inj in injections])\n",
|
|
274
|
+
"theta = np.array([inj['sky_loc'][1] for inj in injections])\n",
|
|
275
|
+
"\n",
|
|
276
|
+
"celestial_coordinates = [convert_to_celestial_coordinates(inj['sky_loc'][0], inj['sky_loc'][1], inj['gps_time'], inj['coordsys']) for inj in injections] \n",
|
|
277
|
+
"\n",
|
|
278
|
+
"ras = np.array([coord[0] for coord in celestial_coordinates])\n",
|
|
279
|
+
"decs = np.array([coord[1] for coord in celestial_coordinates]) \n",
|
|
280
|
+
"\n",
|
|
281
|
+
"# plot sky distribution\n",
|
|
282
|
+
"fig, ax = plt.subplots(1,2, figsize=(8, 4))\n",
|
|
283
|
+
"ax[0].scatter(phi, theta, s=1)\n",
|
|
284
|
+
"ax[1].scatter(ras, decs, s=1) \n",
|
|
285
|
+
"ax[0].set_title('Original Coordinates')\n",
|
|
286
|
+
"ax[0].set_xlabel('Phi')\n",
|
|
287
|
+
"ax[0].set_ylabel('Theta')\n",
|
|
288
|
+
"ax[1].set_title('Celestial Coordinates')\n",
|
|
289
|
+
"ax[1].set_xlabel('RA')\n",
|
|
290
|
+
"ax[1].set_ylabel('Dec')\n",
|
|
291
|
+
"ax[1].set_xlim(0,2*np.pi)\n",
|
|
292
|
+
"plt.show()\n"
|
|
293
|
+
]
|
|
294
|
+
}
|
|
295
|
+
],
|
|
296
|
+
"metadata": {
|
|
297
|
+
"kernelspec": {
|
|
298
|
+
"display_name": "pycwb_test",
|
|
299
|
+
"language": "python",
|
|
300
|
+
"name": "python3"
|
|
301
|
+
},
|
|
302
|
+
"language_info": {
|
|
303
|
+
"codemirror_mode": {
|
|
304
|
+
"name": "ipython",
|
|
305
|
+
"version": 3
|
|
306
|
+
},
|
|
307
|
+
"file_extension": ".py",
|
|
308
|
+
"mimetype": "text/x-python",
|
|
309
|
+
"name": "python",
|
|
310
|
+
"nbconvert_exporter": "python",
|
|
311
|
+
"pygments_lexer": "ipython3",
|
|
312
|
+
"version": "3.11.9"
|
|
313
|
+
}
|
|
314
|
+
},
|
|
315
|
+
"nbformat": 4,
|
|
316
|
+
"nbformat_minor": 2
|
|
317
|
+
}
|
|
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
|
|
|
28
28
|
commit_id: COMMIT_ID
|
|
29
29
|
__commit_id__: COMMIT_ID
|
|
30
30
|
|
|
31
|
-
__version__ = version = '0.30.
|
|
32
|
-
__version_tuple__ = version_tuple = (0, 30,
|
|
31
|
+
__version__ = version = '0.30.2'
|
|
32
|
+
__version_tuple__ = version_tuple = (0, 30, 2)
|
|
33
33
|
|
|
34
|
-
__commit_id__ = commit_id = '
|
|
34
|
+
__commit_id__ = commit_id = 'g27e3ff7bf'
|
|
@@ -12,6 +12,7 @@ def generate_injection_list_from_config(injection_config, start_gps_time, end_gp
|
|
|
12
12
|
seed = injection_config.get('seed', None)
|
|
13
13
|
repeat_injection = injection_config.get('repeat_injection', None)
|
|
14
14
|
sky_distribution = injection_config.get('sky_distribution', None)
|
|
15
|
+
time_distribution = injection_config.get('time_distribution', None)
|
|
15
16
|
|
|
16
17
|
# set random seed for reproducibility if specified
|
|
17
18
|
if seed is not None:
|
|
@@ -27,26 +28,41 @@ def generate_injection_list_from_config(injection_config, start_gps_time, end_gp
|
|
|
27
28
|
|
|
28
29
|
# distribute injections on sky if specified
|
|
29
30
|
if sky_distribution:
|
|
31
|
+
coordinate_system = sky_distribution.get('coordsys', 'icrs')
|
|
30
32
|
sky_locations = generate_sky_distribution(sky_distribution, len(injections))
|
|
31
|
-
distribute_injections_on_sky(injections, sky_locations)
|
|
33
|
+
distribute_injections_on_sky(injections, sky_locations, coordsys = coordinate_system)
|
|
34
|
+
else:
|
|
35
|
+
# check if 'ra' and 'dec' are in injection or 'sky_loc' and 'coordsys' is specified
|
|
36
|
+
for inj in injections:
|
|
37
|
+
if not (('ra' in inj and 'dec' in inj) or ('sky_loc' in inj and 'coordsys' in inj)):
|
|
38
|
+
raise ValueError("Either 'ra' and 'dec' or 'sky_loc' and 'coordsys' must be specified in the injections when no sky_distribution is provided")
|
|
32
39
|
|
|
33
40
|
# distribute injections in GPS time
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
41
|
+
if time_distribution:
|
|
42
|
+
time_distribution_type = time_distribution.get('type', None)
|
|
43
|
+
if time_distribution_type == 'rate':
|
|
44
|
+
time_distribution_rate = time_distribution.get('rate', None)
|
|
45
|
+
rate = eval(time_distribution_rate) if type(time_distribution_rate) == str else time_distribution_rate
|
|
46
|
+
jitter = time_distribution.get('jitter', 0)
|
|
47
|
+
injections, n_trails = distribute_inj_in_gps_time_by_rate(injections, rate, jitter, start_gps_time, end_gps_time, shuffle=False)
|
|
48
|
+
elif time_distribution_type == 'poisson':
|
|
49
|
+
time_distribution_rate = time_distribution.get('rate', None)
|
|
50
|
+
rate = eval(time_distribution_rate) if type(time_distribution_rate) == str else time_distribution_rate
|
|
51
|
+
max_trail = time_distribution.get('max_trail', None)
|
|
52
|
+
injections, n_trails = distribute_inj_in_gps_time_by_poisson(injections, rate, start_gps_time, end_gps_time, max_trail=max_trail, shuffle=False)
|
|
53
|
+
elif time_distribution_type == 'custom':
|
|
54
|
+
raise ValueError('Custom time distribution is not supported anymore, if you want to use customized gps_time, simply remove the time_distribution field from the config')
|
|
55
|
+
else:
|
|
56
|
+
raise ValueError('Unknown time distribution, only support rate, poisson')
|
|
48
57
|
else:
|
|
49
|
-
|
|
58
|
+
# check if 'gps_time' is in injection
|
|
59
|
+
n_trails = 1
|
|
60
|
+
for inj in injections:
|
|
61
|
+
if 'gps_time' not in inj:
|
|
62
|
+
raise ValueError("'gps_time' must be specified in the injections when no time_distribution is provided")
|
|
63
|
+
# find the maximum trail index if 'trail_idx' is specified
|
|
64
|
+
if 'trail_idx' in inj:
|
|
65
|
+
n_trails = max(n_trails, inj['trail_idx'] + 1)
|
|
50
66
|
|
|
51
67
|
return injections, n_trails
|
|
52
68
|
|